From df7546775cb7c9cf2cdcfd500084e7e9c0b1f36f Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 3 Dec 2025 09:20:47 +0100 Subject: [PATCH 1/4] feat: use snackbar instead of toast Signed-off-by: alperozturk --- .../ui/fileactions/FileActionsBottomSheet.kt | 5 ++-- .../TrashbinFileActionsBottomSheet.kt | 5 ++-- .../authentication/AuthenticatorActivity.java | 14 +++++++---- .../authentication/DeepLinkLoginActivity.kt | 8 +++--- .../ui/activity/ConflictsResolveActivity.kt | 4 +-- .../android/ui/activity/EditorWebView.java | 9 +++---- .../ReceiveExternalFilesActivity.java | 8 +++--- .../activity/RequestCredentialsActivity.java | 3 +-- .../ui/activity/SetupEncryptionActivity.kt | 4 +-- .../android/ui/activity/TextEditorWebView.kt | 4 +-- .../ui/dialog/ConflictsResolveDialog.kt | 11 +++++--- .../android/ui/dialog/SendFilesDialog.kt | 6 +++-- .../ui/fragment/OCFileListFragment.java | 9 +++---- .../fragment/contactsbackup/BackupFragment.kt | 9 ++++--- .../contactsbackup/BackupListFragment.java | 25 +++++++++---------- .../android/ui/trashbin/TrashbinActivity.kt | 3 +-- .../owncloud/android/utils/DisplayUtils.java | 20 ++++++++++----- app/src/main/res/values/strings.xml | 3 +++ 18 files changed, 81 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt index 63ccd3b66f2c..7a67b8345b1c 100644 --- a/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt +++ b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt @@ -16,7 +16,6 @@ import android.text.style.StyleSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.annotation.IdRes import androidx.appcompat.content.res.AppCompatResources import androidx.core.os.bundleOf @@ -123,8 +122,8 @@ class FileActionsBottomSheet : FileActionsViewModel.UiState.Loading -> {} FileActionsViewModel.UiState.Error -> { - context?.let { - Toast.makeText(it, R.string.error_file_actions, Toast.LENGTH_SHORT).show() + activity?.let { + DisplayUtils.showSnackMessage(it, R.string.error_file_actions) } dismissAllowingStateLoss() } diff --git a/app/src/main/java/com/nextcloud/ui/trashbinFileActions/TrashbinFileActionsBottomSheet.kt b/app/src/main/java/com/nextcloud/ui/trashbinFileActions/TrashbinFileActionsBottomSheet.kt index b97c9bae97bc..3ba288a2970d 100644 --- a/app/src/main/java/com/nextcloud/ui/trashbinFileActions/TrashbinFileActionsBottomSheet.kt +++ b/app/src/main/java/com/nextcloud/ui/trashbinFileActions/TrashbinFileActionsBottomSheet.kt @@ -10,7 +10,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.annotation.IdRes import androidx.appcompat.content.res.AppCompatResources import androidx.core.os.bundleOf @@ -108,8 +107,8 @@ class TrashbinFileActionsBottomSheet : TrashbinFileActionsViewModel.UiState.Loading -> {} TrashbinFileActionsViewModel.UiState.Error -> { - context?.let { - Toast.makeText(it, R.string.error_file_actions, Toast.LENGTH_SHORT).show() + activity?.let { + DisplayUtils.showSnackMessage(it, R.string.error_file_actions) } dismissAllowingStateLoss() } diff --git a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java index c87c0154669f..14eb2eec5d38 100644 --- a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -44,7 +44,6 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; -import android.widget.Toast; import com.blikoon.qrcodescanner.QrCodeActivity; import com.google.android.material.button.MaterialButton; @@ -859,7 +858,7 @@ protected void onNewIntent(Intent intent) { if (data != null && data.toString().startsWith(getString(R.string.login_data_own_scheme))) { if (!MDMConfig.INSTANCE.multiAccountSupport(this) && accountManager.getAccounts().length == 1) { - Toast.makeText(this, R.string.no_mutliple_accounts_allowed, Toast.LENGTH_LONG).show(); + DisplayUtils.showSnackMessage(this, R.string.no_mutliple_accounts_allowed); finish(); return; } else { @@ -1307,18 +1306,23 @@ private void updateAuthStatusIconAndText(RemoteOperationResult result) { case ACCOUNT_NOT_NEW: mAuthStatusText = getString(R.string.auth_account_not_new); if (!showWebViewLoginUrl) { - DisplayUtils.showErrorAndFinishActivity(this, mAuthStatusText); + showErrorAndFinishActivity(); } break; case UNHANDLED_HTTP_CODE: default: mAuthStatusText = ErrorMessageAdapter.getErrorCauseMessage(result, null, getResources()); if (!showWebViewLoginUrl) { - DisplayUtils.showErrorAndFinishActivity(this, mAuthStatusText); + showErrorAndFinishActivity(); } } } + private void showErrorAndFinishActivity() { + DisplayUtils.showSnackMessage(this, mAuthStatusText); + finish(); + } + private void updateStatusIconFailUserName(int failedStatusText) { mAuthStatusIcon = R.drawable.ic_alert; mAuthStatusText = getResources().getString(failedStatusText); @@ -1588,7 +1592,7 @@ private void startQRScanner() { if (!MDMConfig.INSTANCE.multiAccountSupport(this) && accountManager.getAccounts().length == 1) { - Toast.makeText(this, R.string.no_mutliple_accounts_allowed, Toast.LENGTH_LONG).show(); + DisplayUtils.showSnackMessage(this, R.string.no_mutliple_accounts_allowed); } else { parseAndLoginFromWebView(resultData); } diff --git a/app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.kt b/app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.kt index 610af50d81c8..3d9dca0efe31 100644 --- a/app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.kt +++ b/app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.kt @@ -9,10 +9,10 @@ package com.owncloud.android.authentication import android.os.Bundle import android.widget.TextView -import android.widget.Toast import com.nextcloud.client.di.Injectable import com.nextcloud.utils.mdm.MDMConfig import com.owncloud.android.R +import com.owncloud.android.utils.DisplayUtils class DeepLinkLoginActivity : AuthenticatorActivity(), @@ -21,7 +21,7 @@ class DeepLinkLoginActivity : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (!MDMConfig.multiAccountSupport(this) && accountManager.accounts.size == 1) { - Toast.makeText(this, R.string.no_mutliple_accounts_allowed, Toast.LENGTH_LONG).show() + DisplayUtils.showSnackMessage(this, R.string.no_mutliple_accounts_allowed) return } @@ -37,8 +37,8 @@ class DeepLinkLoginActivity : loginUrlInfo.loginName, loginUrlInfo.server ) - } catch (e: IllegalArgumentException) { - Toast.makeText(this, R.string.direct_login_failed, Toast.LENGTH_LONG).show() + } catch (_: IllegalArgumentException) { + DisplayUtils.showSnackMessage(this, R.string.direct_login_failed) } } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt index c1ba17a82aec..c6901374ca30 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt @@ -14,7 +14,6 @@ import android.app.NotificationManager import android.content.Context import android.content.Intent import android.os.Bundle -import android.widget.Toast import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.lifecycleScope import com.nextcloud.client.account.User @@ -41,6 +40,7 @@ import com.owncloud.android.lib.resources.files.model.RemoteFile import com.owncloud.android.ui.dialog.ConflictsResolveDialog import com.owncloud.android.ui.dialog.ConflictsResolveDialog.Decision import com.owncloud.android.ui.dialog.ConflictsResolveDialog.OnConflictDecisionMadeListener +import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.FileStorageUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -356,7 +356,7 @@ class ConflictsResolveActivity : private fun showErrorAndFinish(code: Int? = null) { val message = parseErrorMessage(code) lifecycleScope.launch(Dispatchers.Main) { - Toast.makeText(this@ConflictsResolveActivity, message, Toast.LENGTH_LONG).show() + DisplayUtils.showSnackMessage(this@ConflictsResolveActivity, message) finish() } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java index 132957c36b87..d216177436a0 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java @@ -23,7 +23,6 @@ import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebView; -import android.widget.Toast; import com.google.android.material.snackbar.Snackbar; import com.nextcloud.client.account.User; @@ -95,8 +94,7 @@ public void onUrlLoaded(String loadedUrl) { } }, 10 * 1000); } else { - Toast.makeText(getApplicationContext(), - R.string.richdocuments_failed_to_load_document, Toast.LENGTH_LONG).show(); + DisplayUtils.showSnackMessage(this,R.string.richdocuments_failed_to_load_document); finish(); } } @@ -152,7 +150,7 @@ public boolean onShowFileChooser(WebView webView, ValueCallback filePathC activity.startActivityForResult(intent, REQUEST_LOCAL_FILE); } catch (ActivityNotFoundException e) { uploadMessage = null; - Toast.makeText(getBaseContext(), "Cannot open file chooser", Toast.LENGTH_LONG).show(); + DisplayUtils.showSnackMessage(EditorWebView.this, R.string.editor_web_view_cannot_open_file); return false; } @@ -163,8 +161,7 @@ public boolean onShowFileChooser(WebView webView, ValueCallback filePathC setFile(IntentExtensionsKt.getParcelableArgument(getIntent(), ExternalSiteWebView.EXTRA_FILE, OCFile.class)); if (getFile() == null) { - Toast.makeText(getApplicationContext(), - R.string.richdocuments_failed_to_load_document, Toast.LENGTH_LONG).show(); + DisplayUtils.showSnackMessage(this, R.string.richdocuments_failed_to_load_document); finish(); } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java index be8688e92d30..2e8a6a27cdbf 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java @@ -43,7 +43,6 @@ import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; -import android.widget.Toast; import com.google.android.material.button.MaterialButton; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -247,10 +246,9 @@ protected void onStart() { super.onStart(); if (mAccountManager.getAccountsByType(MainApp.getAccountType(this)).length == 0) { - Toast.makeText(this, - String.format(getString(R.string.uploader_wrn_no_account_text), - getString(R.string.app_name)), - Toast.LENGTH_LONG).show(); + final var message = String.format(getString(R.string.uploader_wrn_no_account_text), + getString(R.string.app_name)); + DisplayUtils.showSnackMessage(this, message); return; } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/RequestCredentialsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/RequestCredentialsActivity.java index 5acd3e09582f..6fa2f78cc603 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/RequestCredentialsActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/RequestCredentialsActivity.java @@ -16,7 +16,6 @@ import android.content.Intent; import android.os.Bundle; import android.os.SystemClock; -import android.widget.Toast; import com.nextcloud.client.preferences.AppPreferencesImpl; import com.owncloud.android.R; @@ -55,7 +54,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } else if (resultCode == Activity.RESULT_CANCELED) { finishWithResult(KEY_CHECK_RESULT_CANCEL); } else { - Toast.makeText(this, R.string.default_credentials_wrong, Toast.LENGTH_SHORT).show(); + DisplayUtils.showSnackMessage(this, R.string.default_credentials_wrong); requestCredentials(); } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SetupEncryptionActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/SetupEncryptionActivity.kt index fc4b2f0efff1..d5388c0d9995 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/SetupEncryptionActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/SetupEncryptionActivity.kt @@ -9,12 +9,12 @@ package com.owncloud.android.ui.activity import android.content.Intent import android.os.Bundle -import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.nextcloud.client.account.User import com.nextcloud.utils.extensions.getParcelableArgument import com.owncloud.android.R import com.owncloud.android.ui.dialog.setupEncryption.SetupEncryptionDialogFragment +import com.owncloud.android.utils.DisplayUtils class SetupEncryptionActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -23,7 +23,7 @@ class SetupEncryptionActivity : AppCompatActivity() { val user = intent?.getParcelableArgument("EXTRA_USER", User::class.java) if (user == null) { - Toast.makeText(this, getString(R.string.error_showing_encryption_dialog), Toast.LENGTH_LONG).show() + DisplayUtils.showSnackMessage(this, R.string.error_showing_encryption_dialog) finish() } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt b/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt index 7cf73eb52689..a0ae72f6ba47 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt @@ -8,7 +8,6 @@ package com.owncloud.android.ui.activity import android.annotation.SuppressLint -import android.widget.Toast import androidx.core.net.toUri import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature @@ -18,6 +17,7 @@ import com.nextcloud.client.device.DeviceInfo import com.nextcloud.utils.EditorUtils import com.owncloud.android.R import com.owncloud.android.ui.asynctasks.TextEditorLoadUrlTask +import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.theme.ThemeUtils import javax.inject.Inject @@ -39,7 +39,7 @@ class TextEditorWebView : EditorWebView() { super.postOnCreate() if (!user.isPresent) { - Toast.makeText(this, getString(R.string.failed_to_start_editor), Toast.LENGTH_LONG).show() + DisplayUtils.showSnackMessage(this, R.string.failed_to_start_editor) finish() } diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.kt b/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.kt index 3948c9e32371..522626227391 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.kt @@ -11,7 +11,6 @@ import android.content.Context import android.content.DialogInterface import android.os.Bundle import android.view.View -import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.DialogFragment @@ -79,7 +78,7 @@ class ConflictsResolveDialog : try { listener = context as OnConflictDecisionMadeListener - } catch (e: ClassCastException) { + } catch (_: ClassCastException) { throw ClassCastException("Activity of this dialog must implement OnConflictDecisionMadeListener") } } @@ -90,7 +89,9 @@ class ConflictsResolveDialog : val alertDialog = dialog as AlertDialog? if (alertDialog == null) { - Toast.makeText(context, "Failed to create conflict dialog", Toast.LENGTH_LONG).show() + activity?.let { + DisplayUtils.showSnackMessage(it, R.string.failed_to_create_conflict_dialog) + } return } @@ -116,7 +117,9 @@ class ConflictsResolveDialog : rightDataFile = bundle.getParcelableArgument(ARG_RIGHT_FILE, OCFile::class.java) user = bundle.getParcelableArgument(ARG_USER, User::class.java) } else { - Toast.makeText(context, "Failed to create conflict dialog", Toast.LENGTH_LONG).show() + activity?.let { + DisplayUtils.showSnackMessage(it, R.string.failed_to_create_conflict_dialog) + } } } diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SendFilesDialog.kt b/app/src/main/java/com/owncloud/android/ui/dialog/SendFilesDialog.kt index 09f2edbfe502..75c34009e748 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/SendFilesDialog.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/SendFilesDialog.kt @@ -16,7 +16,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.nextcloud.android.common.ui.theme.utils.ColorRole @@ -27,6 +26,7 @@ import com.owncloud.android.databinding.SendFilesFragmentBinding import com.owncloud.android.datamodel.OCFile import com.owncloud.android.ui.adapter.SendButtonAdapter import com.owncloud.android.ui.components.SendButtonData +import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.theme.ViewThemeUtils import javax.inject.Inject @@ -68,7 +68,9 @@ class SendFilesDialog : val matches = requireActivity().packageManager.queryIntentActivities(sendIntent, 0) if (matches.isEmpty()) { - Toast.makeText(context, R.string.no_send_app, Toast.LENGTH_SHORT).show() + activity?.let { + DisplayUtils.showSnackMessage(it, R.string.no_send_app) + } dismiss() return } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 196f66c96577..783a689024ae 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -33,7 +33,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; -import android.widget.Toast; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -587,10 +586,10 @@ public void scanDocUpload() { } else { Log.w(TAG, "scanDocUpload: Failed to start doc scanning, fileDisplayActivity=" + fileDisplayActivity + ", currentFile=" + currentFile); - Toast.makeText(getContext(), - getString(R.string.error_starting_doc_scan), - Toast.LENGTH_SHORT) - .show(); + final var activity = getActivity(); + if (activity != null) { + DisplayUtils.showSnackMessage(activity, R.string.error_starting_doc_scan); + } } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.kt index 57212ecb126e..d145f80a33d8 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupFragment.kt @@ -20,7 +20,6 @@ import android.view.View import android.view.ViewGroup import android.widget.CompoundButton import android.widget.DatePicker -import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.lifecycle.lifecycleScope import com.nextcloud.client.account.User @@ -522,7 +521,9 @@ class BackupFragment : private fun openDate(savedDate: Calendar?) { val contactsPreferenceActivity = activity as ContactsPreferenceActivity? if (contactsPreferenceActivity == null) { - Toast.makeText(context, getString(R.string.error_choosing_date), Toast.LENGTH_LONG).show() + activity?.let { + DisplayUtils.showSnackMessage(it, R.string.error_choosing_date) + } return } @@ -584,7 +585,9 @@ class BackupFragment : override fun onDateSet(view: DatePicker, year: Int, month: Int, dayOfMonth: Int) { val contactsPreferenceActivity = activity as ContactsPreferenceActivity? if (contactsPreferenceActivity == null) { - Toast.makeText(context, getString(R.string.error_choosing_date), Toast.LENGTH_LONG).show() + activity?.let { + DisplayUtils.showSnackMessage(it, R.string.error_choosing_date) + } return } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java index 99ff53f53368..41ff60d0652e 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java @@ -18,7 +18,6 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import com.google.android.material.snackbar.Snackbar; import com.nextcloud.client.account.User; @@ -41,6 +40,7 @@ import com.owncloud.android.ui.asynctasks.LoadContactsTask; import com.owncloud.android.ui.events.VCardToggleEvent; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimeTypeUtil; import com.owncloud.android.utils.PermissionUtil; import com.owncloud.android.utils.theme.ViewThemeUtils; @@ -440,12 +440,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis if (grantResults[index] >= 0) { importContacts(selectedAccount); } else { - if (getView() != null) { - Snackbar.make(getView(), R.string.contactlist_no_permission, Snackbar.LENGTH_LONG) - .show(); - } else { - Toast.makeText(getContext(), R.string.contactlist_no_permission, Toast.LENGTH_LONG).show(); - } + showPermissionErrorMessage(); } break; } @@ -458,12 +453,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis if (grantResults[index] >= 0) { importContacts(selectedAccount); } else { - if (getView() != null) { - Snackbar.make(getView(), R.string.contactlist_no_permission, Snackbar.LENGTH_LONG) - .show(); - } else { - Toast.makeText(getContext(), R.string.contactlist_no_permission, Toast.LENGTH_LONG).show(); - } + showPermissionErrorMessage(); } break; } @@ -471,6 +461,15 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis } } + private void showPermissionErrorMessage() { + final var view = getView(); + if (view != null) { + DisplayUtils.showSnackMessage(view, R.string.contactlist_no_permission); + } else { + DisplayUtils.showSnackMessage(this, R.string.contactlist_no_permission); + } + } + private Unit onDownloadUpdate(Transfer download) { final Activity activity = getActivity(); if (download.getState() == TransferState.COMPLETED && activity != null) { diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt index 2ceef02b13e3..440870edfcac 100644 --- a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt @@ -19,7 +19,6 @@ import android.view.View import android.widget.AbsListView import android.widget.PopupMenu import android.widget.TextView -import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.annotation.IdRes import androidx.annotation.VisibleForTesting @@ -106,7 +105,7 @@ class TrashbinActivity : if (targetUser.isPresent) { setUser(targetUser.get()) } else { - Toast.makeText(this, R.string.associated_account_not_found, Toast.LENGTH_LONG).show() + DisplayUtils.showSnackMessage(this, R.string.associated_account_not_found) finish() return } diff --git a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java index dfedc9f21149..f6f43e933140 100644 --- a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -45,7 +45,6 @@ import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.Toast; import com.elyeproj.loaderviewlibrary.LoaderImageView; import com.google.android.material.snackbar.Snackbar; @@ -93,6 +92,7 @@ import androidx.appcompat.widget.AppCompatDrawableManager; import androidx.core.content.ContextCompat; import androidx.core.content.res.ResourcesCompat; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -543,6 +543,19 @@ public static String getData(InputStream inputStream) { return text.toString(); } + public static Snackbar showSnackMessage(Fragment fragment, @StringRes int messageResource) { + if (fragment == null) { + return null; + } + + final var activity = fragment.getActivity(); + if (activity == null) { + return null; + } + + return showSnackMessage(activity, messageResource); + } + /** * Show a temporary message in a {@link Snackbar} bound to the content view. * @@ -726,11 +739,6 @@ static public void startIntentIfAppAvailable(Intent intent, Activity activity, @ } } - static public void showErrorAndFinishActivity(Activity activity, String errorMessage) { - Toast.makeText(activity, errorMessage, Toast.LENGTH_LONG).show(); - activity.finish(); - } - static public void openSortingOrderDialogFragment(FragmentManager supportFragmentManager, FileSortOrder sortOrder) { FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction(); fragmentTransaction.addToBackStack(null); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf00018d19f0..a193bcb320a4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1476,4 +1476,7 @@ Sort folders before files Sort favorites first Files + + Failed to create conflict dialog + Cannot open file chooser From 65a43377c001211a956e3d1cbfa7d8bb1d81e443 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 3 Dec 2025 09:26:24 +0100 Subject: [PATCH 2/4] feat: use snackbar instead of toast Signed-off-by: alperozturk --- .../com/owncloud/android/ui/fragment/OCFileListFragment.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 783a689024ae..2525e6de94eb 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -586,10 +586,7 @@ public void scanDocUpload() { } else { Log.w(TAG, "scanDocUpload: Failed to start doc scanning, fileDisplayActivity=" + fileDisplayActivity + ", currentFile=" + currentFile); - final var activity = getActivity(); - if (activity != null) { - DisplayUtils.showSnackMessage(activity, R.string.error_starting_doc_scan); - } + DisplayUtils.showSnackMessage(this, R.string.error_starting_doc_scan); } } From 1d259c049bab352dc897a13f9e4f8c210ed9315f Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 3 Dec 2025 11:09:16 +0100 Subject: [PATCH 3/4] fix lint Signed-off-by: alperozturk --- app/src/main/res/values/strings.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a193bcb320a4..413d56f7d829 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -346,10 +346,6 @@ Exported %d file, skipped rest due to error Exported %d files, skipped rest due to error - - %d file will be exported. See notification for details. - %d files will be exported. See notification for details. - You can upload only %d file at once. You can upload up to %d files at once. From a026eabb02d2aba69c2f5894be0732919e6d2335 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 3 Dec 2025 11:14:16 +0100 Subject: [PATCH 4/4] fix lint Signed-off-by: alperozturk --- app/src/main/res/values/strings.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 413d56f7d829..806897f4d162 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -353,7 +353,6 @@ As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded with earlier versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and delete the link to %3$s, or move the file(s) into the %1$s folder and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to. The folder %1$s does not exist anymore Move all - All files were moved Some files could not be moved Local: %1$s Remote: %1$s @@ -998,7 +997,6 @@ New version was created New comment… Error commenting file - Successfully restored file version. Error restoring file version! General notifications Show notifications for new media folders and similar @@ -1101,7 +1099,6 @@ Shared with you by %1$s Retrieving file… Associated account not found! - Logged in as %1$s Error retrieving file Could not retrieve URL Failed to pass file to download manager