diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5a92a9943..bdffaaf0a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,7 +3,7 @@ plugins { alias(libs.plugins.aboutLibraries) alias(libs.plugins.compose.compiler) alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.ksp) } dependencies { @@ -35,7 +35,7 @@ dependencies { implementation(libs.volley) implementation(libs.zxing.android.embedded) { isTransitive = false } implementation(libs.zxing.core) - kapt(libs.dagger.compiler) + ksp(libs.dagger.compiler) } android { @@ -47,7 +47,6 @@ android { buildFeatures { compose = true - dataBinding = true } defaultConfig { diff --git a/app/src/main/java/com/nutomic/syncthingandroid/views/DevicesAdapter.java b/app/src/main/java/com/nutomic/syncthingandroid/views/DevicesAdapter.java index f3b28fa3c..d49fb5391 100644 --- a/app/src/main/java/com/nutomic/syncthingandroid/views/DevicesAdapter.java +++ b/app/src/main/java/com/nutomic/syncthingandroid/views/DevicesAdapter.java @@ -15,11 +15,9 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; -import androidx.databinding.DataBindingUtil; import androidx.preference.PreferenceManager; import com.nutomic.syncthingandroid.R; -import com.nutomic.syncthingandroid.databinding.ItemDeviceListBinding; import com.nutomic.syncthingandroid.model.Connection; import com.nutomic.syncthingandroid.model.Connections; import com.nutomic.syncthingandroid.model.Device; @@ -62,59 +60,85 @@ public class DevicesAdapter extends ArrayAdapter { mRestApi = restApi; } + static class ViewHolder { + TextView name; + TextView lastSeen; + TextView sharedFoldersTitle; + TextView sharedFolders; + ProgressBar progressBar; + TextView status; + TextView bandwidthUpDown; + View rateInOutView; + } + @Override @NonNull public View getView(int position, View convertView, @NonNull ViewGroup parent) { - ItemDeviceListBinding binding = (convertView == null) - ? DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.item_device_list, parent, false) - : DataBindingUtil.bind(convertView); + ViewHolder holder; + + if (convertView == null) { + convertView = LayoutInflater.from(mContext).inflate(R.layout.item_device_list, parent, false); + + holder = new ViewHolder(); + holder.name = convertView.findViewById(R.id.name); + holder.lastSeen = convertView.findViewById(R.id.lastSeen); + holder.sharedFoldersTitle = convertView.findViewById(R.id.sharedFoldersTitle); + holder.sharedFolders = convertView.findViewById(R.id.sharedFolders); + holder.progressBar = convertView.findViewById(R.id.progressBar); + holder.status = convertView.findViewById(R.id.status); + holder.bandwidthUpDown = convertView.findViewById(R.id.bandwidthUpDown); + holder.rateInOutView = convertView.findViewById(R.id.rateInOutContainer); + + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } Device device = getItem(position); - binding.name.setText(getItem(position).getDisplayName()); + holder.name.setText(device.getDisplayName()); - updateDeviceStatusView(binding, device); - return binding.getRoot(); + updateDeviceStatusView(holder, device); + + return convertView; } @SuppressLint("SetTextI18n") - private void updateDeviceStatusView(ItemDeviceListBinding binding, Device device) { - View rateInOutView = binding.getRoot().findViewById(R.id.rateInOutContainer); - + private void updateDeviceStatusView(ViewHolder holder, Device device) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); String deviceLastSeen = sharedPreferences.getString( Constants.PREF_CACHE_DEVICE_LASTSEEN_PREFIX + device.deviceID, "" ); final String TIMESTAMP_NEVER_SEEN = "1970-01-01T00:00:00Z"; - binding.lastSeen.setText(mContext.getString(R.string.device_last_seen, + holder.lastSeen.setText(mContext.getString(R.string.device_last_seen, TextUtils.isEmpty(deviceLastSeen) || deviceLastSeen.equals(TIMESTAMP_NEVER_SEEN) ? mContext.getString(R.string.device_last_seen_never) : Util.formatDateTime(deviceLastSeen)) ); List sharedFolders = mConfigRouter.getSharedFolders(device.deviceID); if (sharedFolders.size() == 0) { - binding.sharedFoldersTitle.setText(R.string.device_state_unused); - binding.sharedFolders.setVisibility(GONE); + holder.sharedFoldersTitle.setText(R.string.device_state_unused); + holder.sharedFolders.setVisibility(GONE); } else { - binding.sharedFoldersTitle.setText(R.string.shared_folders_title_colon); - binding.sharedFolders.setVisibility(VISIBLE); - binding.sharedFolders.setText("\u2022 " + TextUtils.join("\n\u2022 ", sharedFolders)); + holder.sharedFoldersTitle.setText(R.string.shared_folders_title_colon); + holder.sharedFolders.setVisibility(VISIBLE); + holder.sharedFolders.setText("\u2022 " + TextUtils.join("\n\u2022 ", sharedFolders)); } if (device.paused) { - binding.progressBar.setVisibility(GONE); - rateInOutView.setVisibility(GONE); - binding.status.setVisibility(VISIBLE); - binding.status.setText(R.string.device_paused); - binding.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_purple)); + holder.progressBar.setVisibility(GONE); + holder.rateInOutView.setVisibility(GONE); + holder.status.setVisibility(VISIBLE); + holder.status.setText(R.string.device_paused); + holder.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_purple)); return; } if (mRestApi == null || !mRestApi.isConfigLoaded()) { // Syncthing is not running. - binding.progressBar.setVisibility(GONE); - rateInOutView.setVisibility(GONE); - binding.status.setText(R.string.device_disconnected); - binding.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_red)); + holder.progressBar.setVisibility(GONE); + holder.rateInOutView.setVisibility(GONE); + holder.status.setText(R.string.device_disconnected); + holder.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_red)); return; } @@ -123,7 +147,7 @@ public class DevicesAdapter extends ArrayAdapter { final double needBytes = mRestApi.getRemoteDeviceNeedBytes(device.deviceID); if (conn.connected) { - binding.status.setVisibility(VISIBLE); + holder.status.setVisibility(VISIBLE); String bandwidthUpDownText = "\u21f5 "; // down+up arrow bandwidthUpDownText += mContext.getString(R.string.download_title); @@ -133,11 +157,11 @@ public class DevicesAdapter extends ArrayAdapter { bandwidthUpDownText += mContext.getString(R.string.upload_title); bandwidthUpDownText += " \u02c4 "; // up arrow bandwidthUpDownText += Util.readableTransferRate(getContext(), conn.outBits); - binding.bandwidthUpDown.setText(bandwidthUpDownText); - rateInOutView.setVisibility(VISIBLE); + holder.bandwidthUpDown.setText(bandwidthUpDownText); + holder.rateInOutView.setVisibility(VISIBLE); Boolean syncingState = !(completion == 100); - binding.progressBar.setVisibility(syncingState ? VISIBLE : GONE); + holder.progressBar.setVisibility(syncingState ? VISIBLE : GONE); if (!syncingState) { /** * UI polish - We distinguish the following cases: @@ -146,40 +170,39 @@ public class DevicesAdapter extends ArrayAdapter { */ if ((conn.inBits + conn.outBits) >= ACTIVE_SYNC_BITS_PER_SECOND_THRESHOLD) { // case a) device_syncing - binding.status.setText(R.string.state_syncing_general); - binding.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_blue)); + holder.status.setText(R.string.state_syncing_general); + holder.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_blue)); } else { // case b) device_up_to_date - binding.status.setText(R.string.device_up_to_date); - binding.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_green)); + holder.status.setText(R.string.device_up_to_date); + holder.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_green)); } } else { - binding.progressBar.setProgress(completion); - binding.status.setText( + holder.progressBar.setProgress(completion); + holder.status.setText( mContext.getString(R.string.device_syncing_percent_bytes, completion, Util.readableFileSize(getContext(), needBytes) ) ); - binding.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_blue)); + holder.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_blue)); } return; } // !conn.connected - binding.progressBar.setVisibility(GONE); - rateInOutView.setVisibility(GONE); - binding.status.setVisibility(VISIBLE); + holder.progressBar.setVisibility(GONE); + holder.rateInOutView.setVisibility(GONE); + holder.status.setVisibility(VISIBLE); if (needBytes == 0) { - binding.status.setText(R.string.device_disconnected); + holder.status.setText(R.string.device_disconnected); } else { - binding.status.setText( + holder.status.setText( mContext.getString(R.string.device_disconnected_not_synced, Util.readableFileSize(getContext(), needBytes) ) ); } - binding.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_red)); - return; + holder.status.setTextColor(ContextCompat.getColor(getContext(), R.color.text_red)); } } diff --git a/app/src/main/java/com/nutomic/syncthingandroid/views/FoldersAdapter.java b/app/src/main/java/com/nutomic/syncthingandroid/views/FoldersAdapter.java index 099424734..41d4da2d7 100644 --- a/app/src/main/java/com/nutomic/syncthingandroid/views/FoldersAdapter.java +++ b/app/src/main/java/com/nutomic/syncthingandroid/views/FoldersAdapter.java @@ -8,15 +8,15 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; -import androidx.databinding.DataBindingUtil; import com.nutomic.syncthingandroid.R; -import com.nutomic.syncthingandroid.databinding.ItemFolderListBinding; import com.nutomic.syncthingandroid.model.CachedFolderStatus; import com.nutomic.syncthingandroid.model.Folder; import com.nutomic.syncthingandroid.model.FolderStatus; @@ -51,19 +51,54 @@ public class FoldersAdapter extends ArrayAdapter { mRestApi = restApi; } + static class ViewHolder { + TextView label; + TextView directory; + TextView items; + TextView state; + TextView revert; + TextView override; + TextView invalid; + TextView lastItemFinishedItem; + TextView lastItemFinishedTime; + TextView conflicts; + ProgressBar progressBar; + ImageView openFolder; + } + @Override @NonNull public View getView(int position, View convertView, @NonNull ViewGroup parent) { - ItemFolderListBinding binding = (convertView == null) - ? DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.item_folder_list, parent, false) - : DataBindingUtil.bind(convertView); + ViewHolder holder; + + if (convertView == null) { + convertView = LayoutInflater.from(mContext).inflate(R.layout.item_folder_list, parent, false); + + holder = new ViewHolder(); + holder.label = convertView.findViewById(R.id.label); + holder.directory = convertView.findViewById(R.id.directory); + holder.items = convertView.findViewById(R.id.items); + holder.state = convertView.findViewById(R.id.state); + holder.revert = convertView.findViewById(R.id.revert); + holder.override = convertView.findViewById(R.id.override); + holder.invalid = convertView.findViewById(R.id.invalid); + holder.lastItemFinishedItem = convertView.findViewById(R.id.lastItemFinishedItem); + holder.lastItemFinishedTime = convertView.findViewById(R.id.lastItemFinishedTime); + holder.conflicts = convertView.findViewById(R.id.conflicts); + holder.progressBar = convertView.findViewById(R.id.progressBar); + holder.openFolder = convertView.findViewById(R.id.openFolder); + + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } Folder folder = getItem(position); - binding.label.setText(TextUtils.isEmpty(folder.label) ? folder.id : folder.label); - binding.directory.setText(getShortPathForUI(folder.path)); - binding.override.setOnClickListener(view -> { onClickOverride(view, folder); } ); - binding.revert.setOnClickListener(view -> { onClickRevert(view, folder); } ); - binding.openFolder.setOnClickListener(view -> { FileUtils.openFolder(mContext, folder.path); } ); + holder.label.setText(TextUtils.isEmpty(folder.label) ? folder.id : folder.label); + holder.directory.setText(getShortPathForUI(folder.path)); + holder.override.setOnClickListener(view -> { onClickOverride(view, folder); }); + holder.revert.setOnClickListener(view -> { onClickRevert(view, folder); }); + holder.openFolder.setOnClickListener(view -> { FileUtils.openFolder(mContext, folder.path); }); // Update folder icon. int drawableId = R.drawable.baseline_folder_24; @@ -79,23 +114,23 @@ public class FoldersAdapter extends ArrayAdapter { break; default: } - binding.openFolder.setImageResource(drawableId); + holder.openFolder.setImageResource(drawableId); - updateFolderStatusView(binding, folder); - return binding.getRoot(); + updateFolderStatusView(holder, folder); + return convertView; } - private void updateFolderStatusView(ItemFolderListBinding binding, Folder folder) { - if (mRestApi == null || !mRestApi.isConfigLoaded()) { - binding.conflicts.setVisibility(GONE); - binding.lastItemFinishedItem.setVisibility(GONE); - binding.lastItemFinishedTime.setVisibility(GONE); - binding.items.setVisibility(GONE); - binding.override.setVisibility(GONE); - binding.progressBar.setVisibility(GONE); - binding.revert.setVisibility(GONE); - binding.state.setVisibility(GONE); - setTextOrHide(binding.invalid, folder.invalid); + private void updateFolderStatusView(ViewHolder holder, Folder folder) { + if (mRestApi == null || !mRestApi.isConfigLoaded()) { + holder.conflicts.setVisibility(GONE); + holder.lastItemFinishedItem.setVisibility(GONE); + holder.lastItemFinishedTime.setVisibility(GONE); + holder.items.setVisibility(GONE); + holder.override.setVisibility(GONE); + holder.progressBar.setVisibility(GONE); + holder.revert.setVisibility(GONE); + holder.state.setVisibility(GONE); + setTextOrHide(holder.invalid, folder.invalid); return; } @@ -109,9 +144,9 @@ public class FoldersAdapter extends ArrayAdapter { long neededItems = folderStatus.needFiles + folderStatus.needDirectories + folderStatus.needSymlinks + folderStatus.needDeletes; boolean outOfSync = folderStatus.state.equals("idle") && neededItems > 0; boolean overrideButtonVisible = folder.type.equals(Constants.FOLDER_TYPE_SEND_ONLY) && outOfSync; - binding.override.setVisibility(overrideButtonVisible ? VISIBLE : GONE); + holder.override.setVisibility(overrideButtonVisible ? VISIBLE : GONE); - binding.progressBar.setVisibility(folderStatus.state.equals("syncing") ? VISIBLE : GONE); + holder.progressBar.setVisibility(folderStatus.state.equals("syncing") ? VISIBLE : GONE); boolean revertButtonVisible = false; if (folder.type.equals(Constants.FOLDER_TYPE_RECEIVE_ONLY)) { @@ -119,96 +154,90 @@ public class FoldersAdapter extends ArrayAdapter { } else if (folder.type.equals(Constants.FOLDER_TYPE_RECEIVE_ENCRYPTED)) { revertButtonVisible = ((folderStatus.receiveOnlyTotalItems - folderStatus.receiveOnlyChangedDeletes) > 0); } - binding.revert.setText(mContext.getString(folder.type.equals(Constants.FOLDER_TYPE_RECEIVE_ONLY) ? + holder.revert.setText(mContext.getString(folder.type.equals(Constants.FOLDER_TYPE_RECEIVE_ONLY) ? R.string.revert_local_changes : R.string.delete_unexpected_items - )); - binding.revert.setVisibility(revertButtonVisible ? VISIBLE : GONE); + )); + holder.revert.setVisibility(revertButtonVisible ? VISIBLE : GONE); - binding.state.setVisibility(VISIBLE); + holder.state.setVisibility(VISIBLE); if (outOfSync) { - binding.state.setText(mContext.getString(R.string.status_outofsync)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); + holder.state.setText(mContext.getString(R.string.status_outofsync)); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); } else if (failedItems) { - binding.state.setText(mContext.getString(R.string.state_failed_items, folderStatus.errors)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); + holder.state.setText(mContext.getString(R.string.state_failed_items, folderStatus.errors)); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); } else { if (folder.paused) { - binding.state.setText(mContext.getString(R.string.state_paused)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_purple)); + holder.state.setText(mContext.getString(R.string.state_paused)); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_purple)); } else { switch(folderStatus.state) { case "clean-waiting": - binding.state.setText(mContext.getString(R.string.state_clean_waiting)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_orange)); + holder.state.setText(R.string.state_clean_waiting); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_orange)); break; case "cleaning": - binding.state.setText(mContext.getString(R.string.state_cleaning)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_blue)); + holder.state.setText(R.string.state_cleaning); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_blue)); break; case "idle": if (folder.getDeviceCount() <= 1) { // Special case: The folder is IDLE and UNSHARED. - binding.state.setText(mContext.getString(R.string.state_unshared)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_orange)); + holder.state.setText(R.string.state_unshared); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_orange)); } else if (revertButtonVisible) { - binding.state.setText(mContext.getString(R.string.state_local_additions)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_green)); + holder.state.setText(R.string.state_local_additions); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_green)); } else { - binding.state.setText(mContext.getString(R.string.state_up_to_date)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_green)); + holder.state.setText(R.string.state_up_to_date); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_green)); } break; case "scan-waiting": - binding.state.setText(mContext.getString(R.string.state_scan_waiting)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_orange)); + holder.state.setText(R.string.state_scan_waiting); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_orange)); break; case "scanning": - binding.state.setText(mContext.getString(R.string.state_scanning)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_blue)); + holder.state.setText(R.string.state_scanning); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_blue)); break; case "sync-waiting": - binding.state.setText(mContext.getString(R.string.state_sync_waiting)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_orange)); + holder.state.setText(R.string.state_sync_waiting); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_orange)); break; case "syncing": - binding.progressBar.setProgress((int) cachedFolderStatus.completion); - binding.state.setText( - mContext.getString( - R.string.state_syncing, - (int) cachedFolderStatus.completion - ) - ); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_blue)); + holder.progressBar.setProgress((int) cachedFolderStatus.completion); + holder.state.setText(mContext.getString(R.string.state_syncing, (int) cachedFolderStatus.completion)); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_blue)); break; case "sync-preparing": - binding.state.setText(mContext.getString(R.string.state_sync_preparing)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_blue)); + holder.state.setText(R.string.state_sync_preparing); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_blue)); break; case "error": if (TextUtils.isEmpty(folderStatus.error)) { - binding.state.setText(mContext.getString(R.string.state_error)); + holder.state.setText(R.string.state_error); } else { - binding.state.setText(mContext.getString(R.string.state_error_message, folderStatus.error)); + holder.state.setText(mContext.getString(R.string.state_error_message, folderStatus.error)); } - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); break; case "unknown": - binding.state.setText(mContext.getString(R.string.state_unknown)); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); + holder.state.setText(R.string.state_unknown); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); break; default: - binding.state.setText(folderStatus.state); - binding.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); + holder.state.setText(folderStatus.state); + holder.state.setTextColor(ContextCompat.getColor(mContext, R.color.text_red)); } } } - showConflictsUI(binding, cachedFolderStatus.discoveredConflictFiles); + showConflictsUI(holder.conflicts, cachedFolderStatus.discoveredConflictFiles); + showLastItemFinishedUI(holder.lastItemFinishedItem, holder.lastItemFinishedTime, cachedFolderStatus); - showLastItemFinishedUI(binding, cachedFolderStatus); - - binding.items.setVisibility(folder.paused ? GONE : VISIBLE); + holder.items.setVisibility(folder.paused ? GONE : VISIBLE); String itemsAndSize = "\u2211 "; itemsAndSize += mContext.getResources() .getQuantityString(R.plurals.files, (int) folderStatus.inSyncFiles, folderStatus.inSyncFiles, folderStatus.globalFiles); @@ -216,42 +245,40 @@ public class FoldersAdapter extends ArrayAdapter { itemsAndSize += mContext.getString(R.string.folder_size_format, Util.readableFileSize(mContext, folderStatus.inSyncBytes), Util.readableFileSize(mContext, folderStatus.globalBytes)); - binding.items.setText(itemsAndSize); + holder.items.setText(itemsAndSize); - setTextOrHide(binding.invalid, folderStatus.invalid); + setTextOrHide(holder.invalid, folderStatus.invalid); } - private void showConflictsUI(ItemFolderListBinding binding, - final String[] discoveredConflictFiles) { - Integer conflictFileCount = discoveredConflictFiles.length; + private void showConflictsUI(TextView view, final String[] discoveredConflictFiles) { + int conflictFileCount = discoveredConflictFiles.length; if (conflictFileCount == 0) { - binding.conflicts.setVisibility(GONE); + view.setVisibility(GONE); return; } String itemCountAndFirst = "\u26a0 "; itemCountAndFirst += mContext.getResources() - .getQuantityString(R.plurals.conflicts, (int) conflictFileCount, conflictFileCount); + .getQuantityString(R.plurals.conflicts, conflictFileCount, conflictFileCount); itemCountAndFirst += "\n\u292e "; itemCountAndFirst += discoveredConflictFiles[0]; if (conflictFileCount > 1) { itemCountAndFirst += "\n\u2026"; } - binding.conflicts.setText(itemCountAndFirst); - binding.conflicts.setVisibility(VISIBLE); - return; + view.setText(itemCountAndFirst); + view.setVisibility(VISIBLE); } - private void showLastItemFinishedUI(ItemFolderListBinding binding, - final CachedFolderStatus cachedFolderStatus) { + private void showLastItemFinishedUI(TextView itemView, TextView timeView, final CachedFolderStatus cachedFolderStatus) { if (TextUtils.isEmpty(cachedFolderStatus.lastItemFinishedAction) || TextUtils.isEmpty(cachedFolderStatus.lastItemFinishedItem) || TextUtils.isEmpty(cachedFolderStatus.lastItemFinishedTime)) { - binding.lastItemFinishedItem.setVisibility(GONE); - binding.lastItemFinishedTime.setVisibility(GONE); + itemView.setVisibility(GONE); + timeView.setVisibility(GONE); return; } + String finishedItemText = "\u21cc"; switch (cachedFolderStatus.lastItemFinishedAction) { case "delete": @@ -267,16 +294,13 @@ public class FoldersAdapter extends ArrayAdapter { finishedItemText += " \u2049"; } finishedItemText += " " + Util.getPathEllipsis(cachedFolderStatus.lastItemFinishedItem); + itemView.setText(finishedItemText); + itemView.setVisibility(VISIBLE); - binding.lastItemFinishedItem.setText(finishedItemText); - binding.lastItemFinishedItem.setVisibility(VISIBLE); - - String finishedItemTime = "\u21cc\u231a"; - finishedItemTime += Util.formatTime(cachedFolderStatus.lastItemFinishedTime); - binding.lastItemFinishedTime.setText(finishedItemTime); - binding.lastItemFinishedTime.setVisibility(VISIBLE); - - return; + String finishedTimeText = "\u21cc\u231a"; + finishedTimeText += Util.formatTime(cachedFolderStatus.lastItemFinishedTime); + timeView.setText(finishedTimeText); + timeView.setVisibility(VISIBLE); } private void setTextOrHide(TextView view, String text) { diff --git a/app/src/main/res/layout/item_device_list.xml b/app/src/main/res/layout/item_device_list.xml index b2b09213a..20f3d1c0a 100644 --- a/app/src/main/res/layout/item_device_list.xml +++ b/app/src/main/res/layout/item_device_list.xml @@ -1,115 +1,111 @@ - + + android:paddingBottom="8dp" + android:paddingLeft="@dimen/abc_action_bar_content_inset_material" + android:paddingRight="@dimen/abc_action_bar_content_inset_material" + android:paddingTop="8dp"> - + + + android:layout_below="@id/name" + android:indeterminate="false" + android:max="100" + android:progress="0" + android:ellipsize="end" + android:theme="@style/progressBarBlue" /> + + + android:textAppearance="?textAppearanceListItemSecondary" /> - + android:layout_below="@id/lastSeen" + android:text="@string/shared_folders_title_colon" + android:textAppearance="?textAppearanceListItemSecondary" /> - - - - - - - - - - - - - - - + - + - + + + - + + + + + diff --git a/app/src/main/res/layout/item_folder_list.xml b/app/src/main/res/layout/item_folder_list.xml index b9f67523a..6bf168e21 100644 --- a/app/src/main/res/layout/item_folder_list.xml +++ b/app/src/main/res/layout/item_folder_list.xml @@ -1,151 +1,147 @@ - + + android:paddingBottom="8dp" + android:paddingLeft="@dimen/abc_action_bar_content_inset_material" + android:paddingRight="@dimen/abc_action_bar_content_inset_material" + android:paddingTop="8dp"> - + + + + + android:layout_below="@id/label" + android:indeterminate="false" + android:max="100" + android:progress="0" + android:ellipsize="end" + android:theme="@style/progressBarBlue" /> - + + + +