瀏覽代碼

Merge pull request #13195 from nextcloud/convert-alert-dialogs-to-m3

Convert Alert Dialogs to M3
Andy Scherzinger 1 年之前
父節點
當前提交
5c24ba79bd

+ 32 - 24
app/src/main/java/com/owncloud/android/MainApp.java

@@ -38,6 +38,7 @@ import android.os.StrictMode;
 import android.text.TextUtils;
 import android.view.WindowManager;
 
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.nextcloud.appReview.InAppReviewHelper;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
@@ -109,7 +110,6 @@ import javax.net.ssl.SSLEngine;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
-import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.core.util.Pair;
 import androidx.lifecycle.Lifecycle;
@@ -353,8 +353,8 @@ public class MainApp extends Application implements HasAndroidInjector {
         } catch (Exception e) {
             Log_OC.d("Debug", "Failed to disable uri exposure");
         }
-
-        initSyncOperations(preferences,
+        initSyncOperations(this,
+                           preferences,
                            uploadsStorageManager,
                            accountManager,
                            connectivityService,
@@ -367,10 +367,11 @@ public class MainApp extends Application implements HasAndroidInjector {
         initContactsBackup(accountManager, backgroundJobManager);
         notificationChannels();
 
-        backgroundJobManager.scheduleMediaFoldersDetectionJob();
-        backgroundJobManager.startMediaFoldersDetectionJob();
-
-        backgroundJobManager.schedulePeriodicHealthStatus();
+        if (backgroundJobManager != null) {
+            backgroundJobManager.scheduleMediaFoldersDetectionJob();
+            backgroundJobManager.startMediaFoldersDetectionJob();
+            backgroundJobManager.schedulePeriodicHealthStatus();
+        }
 
         registerGlobalPassCodeProtection();
     }
@@ -492,11 +493,14 @@ public class MainApp extends Application implements HasAndroidInjector {
 
     public static void initContactsBackup(UserAccountManager accountManager, BackgroundJobManager backgroundJobManager) {
         ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProviderImpl(appContext.get());
+        if (accountManager == null) {
+            return;
+        }
+
         List<User> users = accountManager.getAllUsers();
         for (User user : users) {
-            if (arbitraryDataProvider.getBooleanValue(user, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP)) {
+            if (backgroundJobManager != null && arbitraryDataProvider.getBooleanValue(user, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP)) {
                 backgroundJobManager.schedulePeriodicContactsBackup(user);
-
             }
         }
     }
@@ -582,6 +586,7 @@ public class MainApp extends Application implements HasAndroidInjector {
     }
 
     public static void initSyncOperations(
+        final Context context,
         final AppPreferences preferences,
         final UploadsStorageManager uploadsStorageManager,
         final UserAccountManager accountManager,
@@ -592,7 +597,7 @@ public class MainApp extends Application implements HasAndroidInjector {
         final ViewThemeUtils viewThemeUtils,
         final WalledCheckCache walledCheckCache,
         final SyncedFolderProvider syncedFolderProvider) {
-        updateToAutoUpload();
+        updateToAutoUpload(context);
         cleanOldEntries(clock);
         updateAutoUploadEntries(clock);
 
@@ -798,32 +803,35 @@ public class MainApp extends Application implements HasAndroidInjector {
         return String.format(appString, version, brandedName);
     }
 
-    private static void updateToAutoUpload() {
-        Context context = getAppContext();
+    private static void updateToAutoUpload(Context context) {
         AppPreferences preferences = AppPreferencesImpl.fromContext(context);
         if (preferences.instantPictureUploadEnabled() || preferences.instantVideoUploadEnabled()) {
             preferences.removeLegacyPreferences();
 
             // show info pop-up
             try {
-                new AlertDialog.Builder(context, R.style.Theme_ownCloud_Dialog)
-                    .setTitle(R.string.drawer_synced_folders)
-                    .setMessage(R.string.synced_folders_new_info)
-                    .setPositiveButton(R.string.drawer_open, (dialog, which) -> {
-                        // show Auto Upload
-                        Intent folderSyncIntent = new Intent(context, SyncedFoldersActivity.class);
-                        dialog.dismiss();
-                        context.startActivity(folderSyncIntent);
-                    })
-                    .setNegativeButton(R.string.drawer_close, (dialog, which) -> dialog.dismiss())
-                    .setIcon(R.drawable.nav_synced_folders)
-                    .show();
+                showAutoUploadAlertDialog(context);
             } catch (WindowManager.BadTokenException e) {
                 Log_OC.i(TAG, "Error showing Auto Upload Update dialog, so skipping it: " + e.getMessage());
             }
         }
     }
 
+    private static void showAutoUploadAlertDialog(Context context) {
+        new MaterialAlertDialogBuilder(context, R.style.Theme_ownCloud_Dialog)
+            .setTitle(R.string.drawer_synced_folders)
+            .setMessage(R.string.synced_folders_new_info)
+            .setPositiveButton(R.string.drawer_open, (dialog, which) -> {
+                Intent folderSyncIntent = new Intent(context, SyncedFoldersActivity.class);
+                dialog.dismiss();
+                context.startActivity(folderSyncIntent);
+            })
+            .setNegativeButton(R.string.drawer_close, (dialog, which) -> dialog.dismiss())
+            .setIcon(R.drawable.nav_synced_folders)
+            .create()
+            .show();
+    }
+
     private static void updateAutoUploadEntries(Clock clock) {
         // updates entries to reflect their true paths
         Context context = getAppContext();

+ 2 - 1
app/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java

@@ -62,7 +62,8 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
         AndroidInjection.inject(this, context);
 
         if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
-            MainApp.initSyncOperations(preferences,
+            MainApp.initSyncOperations(context,
+                                       preferences,
                                        uploadsStorageManager,
                                        accountManager,
                                        connectivityService,

+ 19 - 17
app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -21,7 +21,6 @@ import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
@@ -45,6 +44,7 @@ import android.view.ViewTreeObserver;
 import android.view.WindowManager;
 
 import com.google.android.material.appbar.AppBarLayout;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.android.material.snackbar.Snackbar;
 import com.nextcloud.appReview.InAppReviewHelper;
 import com.nextcloud.client.account.User;
@@ -328,10 +328,15 @@ public class FileDisplayActivity extends FileActivity
             MainApp.setStoragePath(newStorage);
 
             try {
-                AlertDialog alertDialog = new AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog).setTitle(R.string.wrong_storage_path).setMessage(R.string.wrong_storage_path_desc).setPositiveButton(R.string.dialog_close, (dialog, which) -> dialog.dismiss()).setIcon(R.drawable.ic_settings).create();
+                final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.Theme_ownCloud_Dialog)
+                    .setTitle(R.string.wrong_storage_path)
+                    .setMessage(R.string.wrong_storage_path_desc)
+                    .setPositiveButton(R.string.dialog_close, (dialog, which) -> dialog.dismiss())
+                    .setIcon(R.drawable.ic_settings);
 
-                alertDialog.show();
-                viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
+                viewThemeUtils.dialog.colorMaterialAlertDialogBackground(getApplicationContext(), builder);
+
+                builder.create().show();
             } catch (WindowManager.BadTokenException e) {
                 Log_OC.e(TAG, "Error showing wrong storage info, so skipping it: " + e.getMessage());
             }
@@ -405,18 +410,12 @@ public class FileDisplayActivity extends FileActivity
         if (preferences.instantPictureUploadEnabled() || preferences.instantVideoUploadEnabled()) {
             preferences.removeLegacyPreferences();
             // show info pop-up
-            new AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog).setTitle(R.string.drawer_synced_folders).setMessage(R.string.synced_folders_new_info).setPositiveButton(R.string.drawer_open, new DialogInterface.OnClickListener() {
-                public void onClick(DialogInterface dialog, int which) {
-                    // show instant upload
-                    Intent syncedFoldersIntent = new Intent(getApplicationContext(), SyncedFoldersActivity.class);
-                    dialog.dismiss();
-                    startActivity(syncedFoldersIntent);
-                }
-            }).setNegativeButton(R.string.drawer_close, new DialogInterface.OnClickListener() {
-                public void onClick(DialogInterface dialog, int which) {
-                    dialog.dismiss();
-                }
-            }).setIcon(R.drawable.nav_synced_folders).show();
+            new MaterialAlertDialogBuilder(this, R.style.Theme_ownCloud_Dialog).setTitle(R.string.drawer_synced_folders).setMessage(R.string.synced_folders_new_info).setPositiveButton(R.string.drawer_open, (dialog, which) -> {
+                // show instant upload
+                Intent syncedFoldersIntent = new Intent(getApplicationContext(), SyncedFoldersActivity.class);
+                dialog.dismiss();
+                startActivity(syncedFoldersIntent);
+            }).setNegativeButton(R.string.drawer_close, (dialog, which) -> dialog.dismiss()).setIcon(R.drawable.nav_synced_folders).show();
         }
     }
 
@@ -2400,12 +2399,15 @@ public class FileDisplayActivity extends FileActivity
         for (int i = 0; i < userNames.length; i++) {
             userNames[i] = users.get(i).getAccountName();
         }
-        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+        final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this);
         builder.setTitle(R.string.common_choose_account).setItems(userNames, (dialog, which) -> {
             User user = users.get(which);
             openFile(user, fileId);
             showLoadingDialog(getString(R.string.retrieving_file));
         });
+
+        viewThemeUtils.dialog.colorMaterialAlertDialogBackground(getApplicationContext(), builder);
+
         final AlertDialog dialog = builder.create();
         dismissLoadingDialog();
         dialog.show();

+ 13 - 5
app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -46,6 +46,7 @@ import android.widget.TextView;
 import android.widget.Toast;
 
 import com.google.android.material.button.MaterialButton;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.jobs.upload.FileUploadHelper;
@@ -104,7 +105,6 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AlertDialog.Builder;
 import androidx.appcompat.widget.SearchView;
 import androidx.core.view.MenuItemCompat;
@@ -135,6 +135,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
     @Inject AppPreferences preferences;
     @Inject LocalBroadcastManager localBroadcastManager;
     @Inject SyncedFolderProvider syncedFolderProvider;
+
     private AccountManager mAccountManager;
     private Stack<String> mParents = new Stack<>();
     private List<Parcelable> mStreamsToUpload;
@@ -205,7 +206,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
         Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAccountType(this));
         if (accounts.length == 0) {
             Log_OC.i(TAG, "No ownCloud account is available");
-            DialogNoAccount dialog = new DialogNoAccount();
+            DialogNoAccount dialog = new DialogNoAccount(viewThemeUtils);
             dialog.show(getSupportFragmentManager(), null);
         }
 
@@ -308,10 +309,16 @@ public class ReceiveExternalFilesActivity extends FileActivity
     }
 
     public static class DialogNoAccount extends DialogFragment {
+        private final ViewThemeUtils viewThemeUtils;
+
+        public DialogNoAccount(ViewThemeUtils viewThemeUtils) {
+            this.viewThemeUtils = viewThemeUtils;
+        }
+
         @NonNull
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
-            AlertDialog.Builder builder = new Builder(getActivity());
+            final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext());
             builder.setIcon(R.drawable.ic_warning);
             builder.setTitle(R.string.uploader_wrn_no_account_title);
             builder.setMessage(String.format(getString(R.string.uploader_wrn_no_account_text),
@@ -328,7 +335,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
                 startActivityForResult(intent, REQUEST_CODE__SETUP_ACCOUNT);
             });
             builder.setNeutralButton(R.string.uploader_wrn_no_account_quit_btn_text,
-                                     (dialog, which) -> getActivity().finish());
+                                     (dialog, which) -> requireActivity().finish());
+            viewThemeUtils.dialog.colorMaterialAlertDialogBackground(requireContext(), builder);
             return builder.create();
         }
     }
@@ -681,7 +689,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
             }
             Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAuthTokenType());
             if (accounts.length == 0) {
-                DialogNoAccount dialog = new DialogNoAccount();
+                DialogNoAccount dialog = new DialogNoAccount(viewThemeUtils);
                 dialog.show(getSupportFragmentManager(), null);
             } else {
                 // there is no need for checking for is there more then one

+ 37 - 34
app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java

@@ -38,6 +38,7 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.webkit.URLUtil;
 
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.di.Injectable;
@@ -82,7 +83,6 @@ import androidx.annotation.LayoutRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.core.content.ContextCompat;
 import androidx.core.content.res.ResourcesCompat;
@@ -493,32 +493,34 @@ public class SettingsActivity extends PreferenceActivity
                 preferenceCategoryMore.removePreference(preference);
             } else {
                 preference.setOnPreferenceClickListener(p -> {
-                    AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.FallbackTheming_Dialog);
-                    AlertDialog alertDialog = builder.setTitle(R.string.prefs_e2e_mnemonic)
-                        .setMessage(getString(R.string.remove_e2e_message))
-                        .setCancelable(true)
-                        .setNegativeButton(R.string.common_cancel, ((dialog, i) -> dialog.dismiss()))
-                        .setPositiveButton(R.string.confirm_removal, (dialog, which) -> {
-                            EncryptionUtils.removeE2E(arbitraryDataProvider, user);
-                            preferenceCategoryMore.removePreference(preference);
-
-                            Preference pMnemonic = findPreference("mnemonic");
-                            if (pMnemonic != null) {
-                                preferenceCategoryMore.removePreference(pMnemonic);
-                            }
-
-                            dialog.dismiss();
-                        })
-                        .create();
-
-                    alertDialog.show();
-
+                    showRemoveE2EAlertDialog(preferenceCategoryMore, preference);
                     return true;
                 });
             }
         }
     }
 
+    private void showRemoveE2EAlertDialog(PreferenceCategory preferenceCategoryMore, Preference preference) {
+        new MaterialAlertDialogBuilder(this, R.style.FallbackTheming_Dialog)
+            .setTitle(R.string.prefs_e2e_mnemonic)
+            .setMessage(getString(R.string.remove_e2e_message))
+            .setCancelable(true)
+            .setNegativeButton(R.string.common_cancel, ((dialog, i) -> dialog.dismiss()))
+            .setPositiveButton(R.string.confirm_removal, (dialog, which) -> {
+                EncryptionUtils.removeE2E(arbitraryDataProvider, user);
+                preferenceCategoryMore.removePreference(preference);
+
+                Preference pMnemonic = findPreference("mnemonic");
+                if (pMnemonic != null) {
+                    preferenceCategoryMore.removePreference(pMnemonic);
+                }
+
+                dialog.dismiss();
+            })
+            .create()
+            .show();
+    }
+
     private void setupHelpPreference(PreferenceCategory preferenceCategoryMore) {
         boolean helpEnabled = getResources().getBoolean(R.bool.help_enabled);
         Preference pHelp = findPreference("help");
@@ -791,7 +793,7 @@ public class SettingsActivity extends PreferenceActivity
                 if (storagePath.equals(newPath)) {
                     return true;
                 }
-                StorageMigration storageMigration = new StorageMigration(this, user, storagePath, newPath);
+                StorageMigration storageMigration = new StorageMigration(this, user, storagePath, newPath, viewThemeUtils);
                 storageMigration.setStorageMigrationProgressListener(this);
                 storageMigration.migrate();
 
@@ -979,22 +981,23 @@ public class SettingsActivity extends PreferenceActivity
 
                 ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProviderImpl(this);
                 String mnemonic = arbitraryDataProvider.getValue(user.getAccountName(), EncryptionUtils.MNEMONIC).trim();
-
-                AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.FallbackTheming_Dialog);
-                AlertDialog alertDialog = builder.setTitle(R.string.prefs_e2e_mnemonic)
-                    .setMessage(mnemonic)
-                    .setNegativeButton(R.string.common_cancel, (dialog, i) -> dialog.dismiss())
-                    .setNeutralButton(R.string.common_copy, (dialog, i) ->
-                        ClipboardUtil.copyToClipboard(this, mnemonic, false))
-                    .setPositiveButton(R.string.common_ok, (dialog, which) -> dialog.dismiss())
-                    .create();
-
-                alertDialog.show();
-                viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
+                showMnemonicAlertDialogDialog(mnemonic);
             }
         }
     }
 
+    private void showMnemonicAlertDialogDialog(String mnemonic) {
+        new MaterialAlertDialogBuilder(this, R.style.FallbackTheming_Dialog)
+            .setTitle(R.string.prefs_e2e_mnemonic)
+            .setMessage(mnemonic)
+            .setPositiveButton(R.string.common_ok, (dialog, which) -> dialog.dismiss())
+            .setNegativeButton(R.string.common_cancel, (dialog, i) -> dialog.dismiss())
+            .setNeutralButton(R.string.common_copy, (dialog, i) ->
+                ClipboardUtil.copyToClipboard(this, mnemonic, false))
+            .create()
+            .show();
+    }
+
     @Override
     @NonNull
     public MenuInflater getMenuInflater() {

+ 91 - 75
app/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java

@@ -19,12 +19,14 @@ import android.content.DialogInterface.OnClickListener;
 import android.os.AsyncTask;
 import android.view.View;
 
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.nextcloud.client.account.User;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.theme.ViewThemeUtils;
 
 import java.io.File;
 
@@ -37,10 +39,11 @@ import androidx.core.content.res.ResourcesCompat;
 public class StorageMigration {
     private static final String TAG = StorageMigration.class.getName();
 
-    private Context mContext;
-    private User user;
-    private String mSourceStoragePath;
-    private String mTargetStoragePath;
+    private final Context mContext;
+    private final User user;
+    private final String mSourceStoragePath;
+    private final String mTargetStoragePath;
+    private final ViewThemeUtils viewThemeUtils;
 
     private StorageMigrationProgressListener mListener;
 
@@ -49,11 +52,12 @@ public class StorageMigration {
         void onCancelMigration();
     }
 
-    public StorageMigration(Context context, User user, String sourcePath, String targetPath) {
+    public StorageMigration(Context context, User user, String sourcePath, String targetPath, ViewThemeUtils viewThemeUtils) {
         mContext = context;
         this.user = user;
         mSourceStoragePath = sourcePath;
         mTargetStoragePath = targetPath;
+        this.viewThemeUtils = viewThemeUtils;
     }
 
     public void setStorageMigrationProgressListener(StorageMigrationProgressListener listener) {
@@ -72,7 +76,8 @@ public class StorageMigration {
                     mSourceStoragePath,
                     mTargetStoragePath,
                     progressDialog,
-                    mListener).execute();
+                    mListener,
+                    viewThemeUtils).execute();
 
             progressDialog.getButton(ProgressDialog.BUTTON_POSITIVE).setVisibility(View.GONE);
         }
@@ -83,62 +88,76 @@ public class StorageMigration {
         return f.exists() && f.isDirectory();
     }
 
-    private void askToOverride() {
+    public static void a(ViewThemeUtils viewThemeUtils, Context context) {
+        final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context)
+            .setMessage(R.string.file_migration_directory_already_exists)
+            .setCancelable(true)
+            .setOnCancelListener(dialogInterface -> {
+
+            })
+            .setNegativeButton(R.string.common_cancel, (dialogInterface, i) -> {
+
+            })
+            .setNeutralButton(R.string.file_migration_use_data_folder, (dialogInterface, i) -> {
+
+            })
+            .setPositiveButton(R.string.file_migration_override_data_folder, (dialogInterface, i) -> {
 
-        new AlertDialog.Builder(mContext)
+            });
+
+        viewThemeUtils.dialog.colorMaterialAlertDialogBackground(context, builder);
+
+        AlertDialog alertDialog = builder.create();
+
+        alertDialog.show();
+    }
+
+    private void askToOverride() {
+        final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mContext)
                 .setMessage(R.string.file_migration_directory_already_exists)
                 .setCancelable(true)
-                .setOnCancelListener(new DialogInterface.OnCancelListener() {
-                    @Override
-                    public void onCancel(DialogInterface dialogInterface) {
-                        if (mListener != null) {
-                            mListener.onCancelMigration();
-                        }
+                .setOnCancelListener(dialogInterface -> {
+                    if (mListener != null) {
+                        mListener.onCancelMigration();
                     }
                 })
-                .setNegativeButton(R.string.common_cancel, new OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialogInterface, int i) {
-                        if (mListener != null) {
-                            mListener.onCancelMigration();
-                        }
+                .setNegativeButton(R.string.common_cancel, (dialogInterface, i) -> {
+                    if (mListener != null) {
+                        mListener.onCancelMigration();
                     }
                 })
-                .setNeutralButton(R.string.file_migration_use_data_folder, new OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialogInterface, int i) {
-                        ProgressDialog progressDialog = createMigrationProgressDialog();
-                        progressDialog.show();
-                        new StoragePathSwitchTask(
-                                mContext,
-                                user,
-                                mSourceStoragePath,
-                                mTargetStoragePath,
-                                progressDialog,
-                                mListener).execute();
-
-                        progressDialog.getButton(ProgressDialog.BUTTON_POSITIVE).setVisibility(View.GONE);
+                .setNeutralButton(R.string.file_migration_use_data_folder, (dialogInterface, i) -> {
+                    ProgressDialog progressDialog = createMigrationProgressDialog();
+                    progressDialog.show();
+                    new StoragePathSwitchTask(
+                            mContext,
+                            user,
+                            mSourceStoragePath,
+                            mTargetStoragePath,
+                            progressDialog,
+                            mListener,
+                            viewThemeUtils).execute();
+
+                    progressDialog.getButton(ProgressDialog.BUTTON_POSITIVE).setVisibility(View.GONE);
 
-                    }
                 })
-                .setPositiveButton(R.string.file_migration_override_data_folder, new OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialogInterface, int i) {
-                        ProgressDialog progressDialog = createMigrationProgressDialog();
-                        progressDialog.show();
-                        new FileMigrationTask(
-                                mContext,
-                                user,
-                                mSourceStoragePath,
-                                mTargetStoragePath,
-                                progressDialog,
-                                mListener).execute();
-
-                        progressDialog.getButton(ProgressDialog.BUTTON_POSITIVE).setVisibility(View.GONE);
-                    }
-                })
-                .create()
-                .show();
+                .setPositiveButton(R.string.file_migration_override_data_folder, (dialogInterface, i) -> {
+                    ProgressDialog progressDialog = createMigrationProgressDialog();
+                    progressDialog.show();
+                    new FileMigrationTask(
+                            mContext,
+                            user,
+                            mSourceStoragePath,
+                            mTargetStoragePath,
+                            progressDialog,
+                            mListener,
+                            viewThemeUtils).execute();
+
+                    progressDialog.getButton(ProgressDialog.BUTTON_POSITIVE).setVisibility(View.GONE);
+                });
+
+        viewThemeUtils.dialog.colorMaterialAlertDialogBackground(mContext, builder);
+        builder.create().show();
     }
 
     private ProgressDialog createMigrationProgressDialog() {
@@ -168,20 +187,22 @@ public class StorageMigration {
 
         protected String mAuthority;
         protected Account[] mOcAccounts;
+        protected ViewThemeUtils viewThemeUtils;
 
         public FileMigrationTaskBase(Context context,
                                      User user,
                                      String source,
                                      String target,
                                      ProgressDialog progressDialog,
-                                     StorageMigrationProgressListener listener) throws SecurityException {
+                                     StorageMigrationProgressListener listener,
+                                     ViewThemeUtils viewThemeUtils) throws SecurityException {
             mContext = context;
             this.user = user;
             mStorageSource = source;
             mStorageTarget = target;
             mProgressDialog = progressDialog;
             mListener = listener;
-
+            this.viewThemeUtils = viewThemeUtils;
             mAuthority = mContext.getString(R.string.authority);
             mOcAccounts = AccountManager.get(mContext).getAccountsByType(MainApp.getAccountType(context));
         }
@@ -223,25 +244,18 @@ public class StorageMigration {
         }
 
         private void askToStillMove() {
-            new AlertDialog.Builder(mContext)
+            final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mContext)
                     .setTitle(R.string.file_migration_source_not_readable_title)
                     .setMessage(mContext.getString(R.string.file_migration_source_not_readable, mStorageTarget))
-                    .setNegativeButton(R.string.common_no, new OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialogInterface, int i) {
-                            dialogInterface.dismiss();
-                        }
-                    })
-                    .setPositiveButton(R.string.common_yes, new OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialogInterface, int i) {
-                            if (mListener != null) {
-                                mListener.onStorageMigrationFinished(mStorageTarget, true);
-                            }
+                    .setNegativeButton(R.string.common_no, (dialogInterface, i) -> dialogInterface.dismiss())
+                    .setPositiveButton(R.string.common_yes, (dialogInterface, i) -> {
+                        if (mListener != null) {
+                            mListener.onStorageMigrationFinished(mStorageTarget, true);
                         }
-                    })
-                    .create()
-                    .show();
+                    });
+
+            viewThemeUtils.dialog.colorMaterialAlertDialogBackground(mContext, builder);
+            builder.create().show();
         }
 
         protected boolean[] saveAccountsSyncStatus() {
@@ -292,8 +306,9 @@ public class StorageMigration {
                                      String source,
                                      String target,
                                      ProgressDialog progressDialog,
-                                     StorageMigrationProgressListener listener) {
-            super(context, user, source, target, progressDialog, listener);
+                                     StorageMigrationProgressListener listener,
+                                     ViewThemeUtils viewThemeUtils) {
+            super(context, user, source, target, progressDialog, listener, viewThemeUtils);
         }
 
         @Override
@@ -340,8 +355,9 @@ public class StorageMigration {
                                  String source,
                                  String target,
                                  ProgressDialog progressDialog,
-                                 StorageMigrationProgressListener listener) {
-            super(context, user, source, target, progressDialog, listener);
+                                 StorageMigrationProgressListener listener,
+                                 ViewThemeUtils viewThemeUtils) {
+            super(context, user, source, target, progressDialog, listener, viewThemeUtils);
         }
 
         @Override

+ 6 - 4
app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt

@@ -24,6 +24,7 @@ import androidx.appcompat.app.AlertDialog
 import androidx.drawerlayout.widget.DrawerLayout
 import androidx.lifecycle.Lifecycle
 import androidx.recyclerview.widget.GridLayoutManager
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.nextcloud.client.core.Clock
 import com.nextcloud.client.device.PowerManagementService
 import com.nextcloud.client.di.Injectable
@@ -221,14 +222,15 @@ class SyncedFoldersActivity :
     }
 
     private fun showPowerCheckDialog() {
-        val alertDialog = AlertDialog.Builder(this)
+        val builder = MaterialAlertDialogBuilder(this)
             .setView(R.id.root_layout)
             .setPositiveButton(R.string.common_ok) { dialog, _ -> dialog.dismiss() }
             .setTitle(R.string.autoupload_disable_power_save_check)
             .setMessage(getString(R.string.power_save_check_dialog_message))
-            .show()
 
-        viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE))
+        viewThemeUtils.dialog.colorMaterialAlertDialogBackground(this, builder)
+
+        builder.create().show()
     }
 
     /**
@@ -819,7 +821,7 @@ class SyncedFoldersActivity :
 
     private fun showBatteryOptimizationInfo() {
         if (powerManagementService.isPowerSavingExclusionAvailable || checkIfBatteryOptimizationEnabled()) {
-            val alertDialogBuilder = AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog)
+            val alertDialogBuilder = MaterialAlertDialogBuilder(this, R.style.Theme_ownCloud_Dialog)
                 .setTitle(getString(R.string.battery_optimization_title))
                 .setMessage(getString(R.string.battery_optimization_message))
                 .setPositiveButton(getString(R.string.battery_optimization_disable)) { _, _ ->

+ 10 - 9
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -37,6 +37,7 @@ import android.widget.Toast;
 
 import com.google.android.material.behavior.HideBottomViewOnScrollBehavior;
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.google.android.material.snackbar.Snackbar;
 import com.nextcloud.android.lib.resources.files.ToggleFileLockRemoteOperation;
@@ -134,7 +135,6 @@ import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
 import androidx.annotation.StringRes;
 import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AlertDialog;
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
 import androidx.core.content.ContextCompat;
 import androidx.drawerlayout.widget.DrawerLayout;
@@ -539,15 +539,16 @@ public class OCFileListFragment extends ExtendedListFragment implements
     }
 
     private void showDirectCameraUploadAlertDialog(FileDisplayActivity fileDisplayActivity) {
-        AlertDialog.Builder builder = new AlertDialog.Builder(fileDisplayActivity);
-        AlertDialog dialog = builder.setIcon(R.mipmap.ic_launcher)
+        final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(fileDisplayActivity)
             .setTitle(R.string.upload_direct_camera_promt)
-            .setNegativeButton(R.string.upload_direct_camera_video, (iface, id) ->
-                fileDisplayActivity.getFileOperationsHelper().uploadFromCamera(fileDisplayActivity,FileDisplayActivity.REQUEST_CODE__UPLOAD_FROM_VIDEO_CAMERA, true))
-            .setPositiveButton(R.string.upload_direct_camera_photo, (iface, id) ->
-                fileDisplayActivity.getFileOperationsHelper().uploadFromCamera(fileDisplayActivity, FileDisplayActivity.REQUEST_CODE__UPLOAD_FROM_CAMERA, false))
-            .create();
-        dialog.show();
+            .setIcon(R.mipmap.ic_launcher)
+            .setPositiveButton(R.string.upload_direct_camera_video, (dialog, which) -> fileDisplayActivity.getFileOperationsHelper().uploadFromCamera(fileDisplayActivity, FileDisplayActivity.REQUEST_CODE__UPLOAD_FROM_VIDEO_CAMERA, true))
+            .setNegativeButton(R.string.upload_direct_camera_photo, (dialog, which) -> fileDisplayActivity.getFileOperationsHelper().uploadFromCamera(fileDisplayActivity, FileDisplayActivity.REQUEST_CODE__UPLOAD_FROM_CAMERA, false));
+
+        viewThemeUtils.dialog.colorMaterialAlertDialogBackground(fileDisplayActivity, builder);
+
+        builder.create();
+        builder.show();
     }
 
     @Override

+ 11 - 26
app/src/main/java/third_parties/sufficientlysecure/SaveCalendar.java

@@ -9,7 +9,6 @@
 package third_parties.sufficientlysecure;
 
 import android.annotation.SuppressLint;
-import android.app.AlertDialog;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
@@ -30,6 +29,7 @@ import android.view.View;
 import android.view.WindowManager;
 import android.widget.EditText;
 
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.files.Request;
 import com.nextcloud.client.files.UploadRequest;
@@ -89,6 +89,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
+import androidx.appcompat.app.AlertDialog;
+
 @SuppressLint("NewApi")
 public class SaveCalendar {
     private static final String TAG = "ICS_SaveCalendar";
@@ -270,40 +272,23 @@ public class SaveCalendar {
         final int ok = android.R.string.ok;
         final int cancel = android.R.string.cancel;
         final int suggest = R.string.suggest;
-        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
-        AlertDialog dlg = builder.setIcon(R.mipmap.ic_launcher)
+        AlertDialog dlg = new MaterialAlertDialogBuilder(activity).setIcon(R.mipmap.ic_launcher)
             .setTitle(R.string.enter_destination_filename)
             .setView(input)
-            .setPositiveButton(ok, new DialogInterface.OnClickListener() {
-                public void onClick(DialogInterface iface, int id) {
-                    result[0] = input.getText().toString();
-                }
-            })
-            .setNeutralButton(suggest, new DialogInterface.OnClickListener() {
-                public void onClick(DialogInterface iface, int id) {
-                }
-            })
-            .setNegativeButton(cancel, new DialogInterface.OnClickListener() {
-                public void onClick(DialogInterface iface, int id) {
-                    result[0] = "";
-                }
-            })
-            .setOnCancelListener(new DialogInterface.OnCancelListener() {
-                public void onCancel(DialogInterface iface) {
-                    result[0] = "";
-                }
+            .setPositiveButton(ok, (iface, id) -> result[0] = input.getText().toString())
+            .setNeutralButton(suggest, (iface, id) -> {
             })
+            .setNegativeButton(cancel, (iface, id) -> result[0] = "")
+            .setOnCancelListener(iface -> result[0] = "")
             .create();
         int state = WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE;
         dlg.getWindow().setSoftInputMode(state);
         dlg.show();
         // Overriding 'Suggest' here prevents it from closing the dialog
         dlg.getButton(DialogInterface.BUTTON_NEUTRAL)
-            .setOnClickListener(new View.OnClickListener() {
-                public void onClick(View onClick) {
-                    input.setText(suggestedFile);
-                    input.setSelection(input.getText().length());
-                }
+            .setOnClickListener(onClick -> {
+                input.setText(suggestedFile);
+                input.setSelection(input.getText().length());
             });
     }
 

+ 6 - 7
app/src/main/res/values/styles.xml

@@ -84,19 +84,18 @@
         <item name="android:datePickerMode">calendar</item>
     </style>
 
-    <style name="FallbackTheming.Dialog" parent="Theme.Material3.DayNight.Dialog">
+    <style name="FallbackTheming.Dialog" parent="ThemeOverlay.Material3.Dialog.Alert">
+        <item name="colorSecondaryContainer">#757575</item>
         <item name="colorPrimary">#424242</item>
-        <item name="colorPrimaryDark">#212121</item>
-        <item name="colorAccent">#757575</item>
         <item name="windowNoTitle">false</item>
         <item name="android:windowBackground">@color/bg_default</item>
         <item name="android:textAllCaps">false</item>
+        <item name="buttonBarPositiveButtonStyle">@style/Fallback.TonalButton</item>
         <item name="textInputStyle">@style/Widget.App.TextInputLayout</item>
-        <item name="android:buttonBarButtonStyle">@style/FallbackTheming.Dialog.ButtonStyle</item>
     </style>
 
-    <style name="FallbackTheming.Dialog.ButtonStyle" parent="Widget.Material3.Button.TextButton.Dialog">
-        <item name="android:textColor">@color/text_color</item>
+    <style name="Fallback.TonalButton" parent="Widget.Material3.Button.TonalButton">
+        <item name="android:textColor">#FFFFFF</item>
     </style>
 
     <style name="Theme.ownCloud.ToolbarBase" parent="BaseTheme.ownCloud.Toolbar">
@@ -270,7 +269,7 @@
     </style>
 
     <!-- Dialogs -->
-    <style name="Theme.ownCloud.Dialog" parent="@style/Theme.Material3.DayNight.Dialog.Alert">
+    <style name="Theme.ownCloud.Dialog" parent="@style/ThemeOverlay.Material3.Dialog.Alert">
         <item name="windowNoTitle">false</item>
         <item name="colorAccent">@color/color_accent</item>
         <item name="android:textAllCaps">false</item>