瀏覽代碼

Material3 theming for snackbars

Lots of Dagger and static code workarounds unfortunately

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Álvaro Brey 2 年之前
父節點
當前提交
e39ad8867c

+ 1 - 1
app/build.gradle

@@ -355,7 +355,7 @@ dependencies {
     gplayImplementation "com.google.firebase:firebase-messaging:23.0.7"
 
     // TODO change back to tag before merging
-    implementation 'com.github.nextcloud.android-common:ui:1177040'
+    implementation 'com.github.nextcloud.android-common:ui:02c7b05'
 }
 
 configurations.all {

+ 0 - 7
app/src/main/java/com/nextcloud/client/di/ThemeModule.kt

@@ -24,7 +24,6 @@ import android.content.Context
 import com.nextcloud.android.common.ui.theme.MaterialSchemes
 import com.owncloud.android.utils.theme.ThemeColorUtils
 import com.owncloud.android.utils.theme.ThemeDrawableUtils
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
 import com.owncloud.android.utils.theme.ThemeToolbarUtils
 import com.owncloud.android.utils.theme.ThemeUtils
 import com.owncloud.android.utils.theme.newm3.MaterialSchemesProvider
@@ -71,12 +70,6 @@ internal abstract class ThemeModule {
             return ThemeUtils()
         }
 
-        @Provides
-        @Singleton
-        fun themeSnackbarUtils(): ThemeSnackbarUtils {
-            return ThemeSnackbarUtils()
-        }
-
         @Provides
         fun provideMaterialSchemes(materialSchemesProvider: MaterialSchemesProvider): MaterialSchemes {
             return materialSchemesProvider.getMaterialSchemesForCurrentUser()

+ 3 - 3
app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt

@@ -41,7 +41,7 @@ import com.owncloud.android.datamodel.ArbitraryDataProvider
 import com.owncloud.android.datamodel.SyncedFolderProvider
 import com.owncloud.android.datamodel.UploadsStorageManager
 import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils
 import org.greenrobot.eventbus.EventBus
 import javax.inject.Inject
 import javax.inject.Provider
@@ -67,7 +67,7 @@ class BackgroundJobFactory @Inject constructor(
     private val eventBus: EventBus,
     private val deckApi: DeckApi,
     private val themeColorUtils: ThemeColorUtils,
-    private val themeSnackbarUtils: ThemeSnackbarUtils
+    private val viewThemeUtils: Provider<ViewThemeUtils>
 ) : WorkerFactory() {
 
     @SuppressLint("NewApi")
@@ -211,7 +211,7 @@ class BackgroundJobFactory @Inject constructor(
             preferences,
             clock,
             themeColorUtils,
-            themeSnackbarUtils
+            viewThemeUtils.get()
         )
     }
 

+ 4 - 4
app/src/main/java/com/nextcloud/client/jobs/MediaFoldersDetectionWork.kt

@@ -56,7 +56,7 @@ import com.owncloud.android.ui.activity.SyncedFoldersActivity
 import com.owncloud.android.ui.notifications.NotificationUtils
 import com.owncloud.android.utils.SyncedFolderUtils
 import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils
 import java.util.Random
 
 @Suppress("LongParameterList") // dependencies injection
@@ -69,7 +69,7 @@ class MediaFoldersDetectionWork constructor(
     private val preferences: AppPreferences,
     private val clock: Clock,
     private val themeColorUtils: ThemeColorUtils,
-    private val themeSnackbarUtils: ThemeSnackbarUtils
+    private val viewThemeUtils: ViewThemeUtils
 ) : Worker(context, params) {
 
     companion object {
@@ -95,14 +95,14 @@ class MediaFoldersDetectionWork constructor(
             1,
             null,
             true,
-            themeSnackbarUtils
+            viewThemeUtils
         )
         val videoMediaFolders = MediaProvider.getVideoFolders(
             contentResolver,
             1,
             null,
             true,
-            themeSnackbarUtils
+            viewThemeUtils
         )
         val imageMediaFolderPaths: MutableList<String> = ArrayList()
         val videoMediaFolderPaths: MutableList<String> = ArrayList()

+ 14 - 8
app/src/main/java/com/owncloud/android/MainApp.java

@@ -81,7 +81,7 @@ import com.owncloud.android.utils.FilesSyncHelper;
 import com.owncloud.android.utils.PermissionUtil;
 import com.owncloud.android.utils.ReceiversHelper;
 import com.owncloud.android.utils.SecurityUtils;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils;
 
 import org.conscrypt.Conscrypt;
 import org.greenrobot.eventbus.EventBus;
@@ -97,6 +97,7 @@ import java.util.Locale;
 import java.util.Map;
 
 import javax.inject.Inject;
+import javax.inject.Provider;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 
@@ -177,7 +178,10 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
     @Inject
     PassCodeManager passCodeManager;
 
-    @Inject ThemeSnackbarUtils themeSnackbarUtils;
+    // workaround because injection is initialized on onAttachBaseContext
+    // and getApplicationContext is null at that point, which crashes when getting current user
+    @Inject Provider<ViewThemeUtils> viewThemeUtilsProvider;
+    private ViewThemeUtils viewThemeUtils;
 
     @SuppressWarnings("unused")
     private boolean mBound;
@@ -274,6 +278,8 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
     public void onCreate() {
         enableStrictMode();
 
+        viewThemeUtils = viewThemeUtilsProvider.get();
+
         setAppTheme(preferences.getDarkThemeMode());
         super.onCreate();
 
@@ -320,7 +326,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
                            powerManagementService,
                            backgroundJobManager,
                            clock,
-                           themeSnackbarUtils);
+                           viewThemeUtils);
         initContactsBackup(accountManager, backgroundJobManager);
         notificationChannels();
 
@@ -500,7 +506,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         final PowerManagementService powerManagementService,
         final BackgroundJobManager backgroundJobManager,
         final Clock clock,
-        final ThemeSnackbarUtils themeSnackbarUtils
+        final ViewThemeUtils viewThemeUtils
                                          ) {
         updateToAutoUpload();
         cleanOldEntries(clock);
@@ -508,7 +514,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
 
         if (getAppContext() != null) {
             if (PermissionUtil.checkExternalStoragePermission(getAppContext())) {
-                splitOutAutoUploadEntries(clock, themeSnackbarUtils);
+                splitOutAutoUploadEntries(clock, viewThemeUtils);
             } else {
                 preferences.setAutoUploadSplitEntriesEnabled(true);
             }
@@ -731,7 +737,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
     }
 
     private static void splitOutAutoUploadEntries(Clock clock,
-                                                  ThemeSnackbarUtils themeSnackbarUtils) {
+                                                  final ViewThemeUtils viewThemeUtils) {
         Context context = getAppContext();
         AppPreferences preferences = AppPreferencesImpl.fromContext(context);
         if (!preferences.isAutoUploadSplitEntriesEnabled()) {
@@ -746,12 +752,12 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
                                                                                       1,
                                                                                       null,
                                                                                       true,
-                                                                                      themeSnackbarUtils);
+                                                                                      viewThemeUtils);
             final List<MediaFolder> videoMediaFolders = MediaProvider.getVideoFolders(contentResolver,
                                                                                       1,
                                                                                       null,
                                                                                       true,
-                                                                                      themeSnackbarUtils);
+                                                                                      viewThemeUtils);
 
             ArrayList<Long> idsToDelete = new ArrayList<>();
             List<SyncedFolder> syncedFolders = syncedFolderProvider.getSyncedFolders();

+ 7 - 7
app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java

@@ -29,7 +29,7 @@ import android.provider.MediaStore;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -74,9 +74,9 @@ public final class MediaProvider {
                                                     int itemLimit,
                                                     @Nullable final AppCompatActivity activity,
                                                     boolean getWithoutActivity,
-                                                    ThemeSnackbarUtils themeSnackbarUtils) {
+                                                    final ViewThemeUtils viewThemeUtils) {
         // check permissions
-        checkPermissions(activity, themeSnackbarUtils);
+        checkPermissions(activity, viewThemeUtils);
 
         // query media/image folders
         Cursor cursorFolders = null;
@@ -174,10 +174,10 @@ public final class MediaProvider {
     }
 
     private static void checkPermissions(@Nullable AppCompatActivity activity,
-                                         ThemeSnackbarUtils themeSnackbarUtils) {
+                                         final ViewThemeUtils viewThemeUtils) {
         if (activity != null &&
             !PermissionUtil.checkExternalStoragePermission(activity.getApplicationContext())) {
-            PermissionUtil.requestExternalStoragePermission(activity, themeSnackbarUtils, true);
+            PermissionUtil.requestExternalStoragePermission(activity, viewThemeUtils, true);
         }
     }
 
@@ -185,9 +185,9 @@ public final class MediaProvider {
                                                     int itemLimit,
                                                     @Nullable final AppCompatActivity activity,
                                                     boolean getWithoutActivity,
-                                                    ThemeSnackbarUtils themeSnackbarUtils) {
+                                                    final ViewThemeUtils viewThemeUtils) {
         // check permissions
-        checkPermissions(activity, themeSnackbarUtils);
+        checkPermissions(activity, viewThemeUtils);
 
         // query media/image folders
         Cursor cursorFolders = null;

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

@@ -36,7 +36,7 @@ import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils;
 
 import javax.inject.Inject;
 
@@ -58,7 +58,7 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
     @Inject PowerManagementService powerManagementService;
     @Inject BackgroundJobManager backgroundJobManager;
     @Inject Clock clock;
-    @Inject ThemeSnackbarUtils themeSnackbarUtils;
+    @Inject ViewThemeUtils viewThemeUtils;
 
     /**
      * Receives broadcast intent reporting that the system was just boot up. *
@@ -78,7 +78,7 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
                                        powerManagementService,
                                        backgroundJobManager,
                                        clock,
-                                       themeSnackbarUtils);
+                                       viewThemeUtils);
             MainApp.initContactsBackup(accountManager, backgroundJobManager);
         } else {
             Log_OC.d(TAG, "Getting wrong intent: " + intent.getAction());

+ 1 - 2
app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java

@@ -43,7 +43,6 @@ import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.newm3.ViewThemeUtils;
 
 public abstract class EditorWebView extends ExternalSiteWebView {
     protected Snackbar loadingSnackbar;
@@ -79,7 +78,7 @@ public abstract class EditorWebView extends ExternalSiteWebView {
                                                                     R.string.timeout_richDocuments, Snackbar.LENGTH_INDEFINITE)
                         .setAction(R.string.common_back, v -> closeView());
 
-                    themeSnackbarUtils.colorSnackbar(getApplicationContext(), snackbar);
+                    viewThemeUtils.material.themeSnackbar(snackbar);
                     setLoadingSnackbar(snackbar);
                     snackbar.show();
                 }

+ 6 - 9
app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java

@@ -93,7 +93,7 @@ import com.owncloud.android.utils.ClipboardUtil;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.FilesSyncHelper;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -172,9 +172,6 @@ public abstract class FileActivity extends DrawerActivity
     @Inject
     BackgroundJobManager backgroundJobManager;
 
-    @Inject
-    ThemeSnackbarUtils themeSnackbarUtils;
-
     @Override
     public void showFiles(boolean onDeviceOnly) {
         // must be specialized in subclasses
@@ -700,12 +697,12 @@ public abstract class FileActivity extends DrawerActivity
     public static void copyAndShareFileLink(FileActivity activity,
                                             OCFile file,
                                             String link,
-                                            ThemeSnackbarUtils themeSnackbarUtils) {
+                                            final ViewThemeUtils viewThemeUtils) {
         ClipboardUtil.copyToClipboard(activity, link, false);
         Snackbar snackbar = Snackbar.make(activity.findViewById(android.R.id.content), R.string.clipboard_text_copied,
                                           Snackbar.LENGTH_LONG)
             .setAction(R.string.share, v -> showShareLinkDialog(activity, file, link));
-        themeSnackbarUtils.colorSnackbar(activity, snackbar);
+        viewThemeUtils.material.themeSnackbar(snackbar);
         snackbar.show();
     }
 
@@ -774,7 +771,7 @@ public abstract class FileActivity extends DrawerActivity
                 snackbar = Snackbar.make(sharingFragment.getView(), result.getMessage(), Snackbar.LENGTH_LONG);
             }
 
-            themeSnackbarUtils.colorSnackbar(this, snackbar);
+            viewThemeUtils.material.themeSnackbar(snackbar);
             snackbar.show();
         }
     }
@@ -800,7 +797,7 @@ public abstract class FileActivity extends DrawerActivity
                 }
             }
 
-            copyAndShareFileLink(this, file, link, themeSnackbarUtils);
+            copyAndShareFileLink(this, file, link, viewThemeUtils);
 
             if (sharingFragment != null) {
                 sharingFragment.onUpdateShareInformation(result, file);
@@ -834,7 +831,7 @@ public abstract class FileActivity extends DrawerActivity
                                                                                            operation,
                                                                                            getResources()),
                                                   Snackbar.LENGTH_LONG);
-                themeSnackbarUtils.colorSnackbar(this, snackbar);
+                viewThemeUtils.material.themeSnackbar(snackbar);
                 snackbar.show();
             }
         }

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

@@ -332,7 +332,7 @@ public class FileDisplayActivity extends FileActivity
             if (dialog != null && dialog.isShowing()) {
                 dialog.dismiss();
                 getSupportFragmentManager().beginTransaction().remove(fragment).commitNowAllowingStateLoss();
-                PermissionUtil.requestExternalStoragePermission(this, themeSnackbarUtils);
+                PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils);
             }
         }
     }
@@ -342,7 +342,7 @@ public class FileDisplayActivity extends FileActivity
         super.onPostCreate(savedInstanceState);
 
 
-        PermissionUtil.requestExternalStoragePermission(this, themeSnackbarUtils);
+        PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils);
 
         if (getIntent().getParcelableExtra(OCFileListFragment.SEARCH_EVENT) != null) {
             switchToSearchFragment(savedInstanceState);

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

@@ -66,7 +66,6 @@ import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment.OnSy
 import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable
 import com.owncloud.android.utils.PermissionUtil
 import com.owncloud.android.utils.SyncedFolderUtils
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
 import com.owncloud.android.utils.theme.newm3.ViewThemeUtils
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
@@ -161,9 +160,6 @@ class SyncedFoldersActivity :
     @Inject
     lateinit var viewThemeUtils: ViewThemeUtils
 
-    @Inject
-    lateinit var themeSnackBarUtils: ThemeSnackbarUtils
-
     private lateinit var binding: SyncedFoldersLayoutBinding
     private lateinit var adapter: SyncedFolderAdapter
     private lateinit var syncedFolderProvider: SyncedFolderProvider
@@ -300,7 +296,7 @@ class SyncedFoldersActivity :
                 perFolderMediaItemLimit,
                 this@SyncedFoldersActivity,
                 false,
-                themeSnackbarUtils
+                viewThemeUtils
             )
             mediaFolders.addAll(
                 MediaProvider.getVideoFolders(
@@ -308,7 +304,7 @@ class SyncedFoldersActivity :
                     perFolderMediaItemLimit,
                     this@SyncedFoldersActivity,
                     false,
-                    themeSnackbarUtils
+                    viewThemeUtils
                 )
             )
             val syncedFolderArrayList = syncedFolderProvider.syncedFolders
@@ -557,7 +553,7 @@ class SyncedFoldersActivity :
                     )
                     onSyncFolderSettingsClick(0, emptyCustomFolder)
                 } else {
-                    PermissionUtil.requestExternalStoragePermission(this, themeSnackBarUtils, true)
+                    PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils, true)
                 }
                 result = super.onOptionsItemSelected(item)
             }
@@ -784,7 +780,7 @@ class SyncedFoldersActivity :
                     load(getItemsDisplayedPerFolder(), true)
                 } else {
                     // permission denied --> request again
-                    PermissionUtil.requestExternalStoragePermission(this, themeSnackbarUtils, true)
+                    PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils, true)
                 }
             }
             else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)

+ 1 - 3
app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java

@@ -55,7 +55,6 @@ import com.owncloud.android.ui.fragment.LocalFileListFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -98,7 +97,6 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
     private static final String WAIT_DIALOG_TAG = "WAIT";
 
     @Inject AppPreferences preferences;
-    @Inject ThemeSnackbarUtils themeSnackbarUtils;
     private Account mAccountOnCreation;
     private ArrayAdapter<String> mDirectories;
     private boolean mLocalFolderPickerMode;
@@ -261,7 +259,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
     }
 
     private void requestPermissions() {
-        PermissionUtil.requestExternalStoragePermission(this, themeSnackbarUtils, true);
+        PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils, true);
     }
 
     public void showToolbarSpinner() {

+ 6 - 6
app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.java

@@ -29,7 +29,7 @@ import com.owncloud.android.ui.components.SendButtonData;
 import com.owncloud.android.ui.helpers.FileOperationsHelper;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -80,7 +80,7 @@ public class SendShareDialog extends BottomSheetDialogFragment implements Inject
     private boolean sharingPublicAskForPassword;
     private FileOperationsHelper fileOperationsHelper;
     @Inject ThemeColorUtils themeColorUtils;
-    @Inject ThemeSnackbarUtils themeSnackbarUtils;
+    @Inject ViewThemeUtils viewThemeUtils;
 
     public static SendShareDialog newInstance(OCFile file, boolean hideNcSharingOptions, OCCapability capability) {
 
@@ -131,11 +131,11 @@ public class SendShareDialog extends BottomSheetDialogFragment implements Inject
 
         // Share via link button
         TextView shareLinkText = view.findViewById(R.id.share_link_button);
-        shareLinkText.setOnClickListener(v -> shareByLink(themeSnackbarUtils));
+        shareLinkText.setOnClickListener(v -> shareByLink());
 
         ImageView shareLinkImageView = view.findViewById(R.id.share_link_icon);
         themeShareButtonImage(shareLinkImageView);
-        shareLinkImageView.setOnClickListener(v -> shareByLink(themeSnackbarUtils));
+        shareLinkImageView.setOnClickListener(v -> shareByLink());
 
         if (hideNcSharingOptions) {
             sendShareButtons.setVisibility(View.GONE);
@@ -185,9 +185,9 @@ public class SendShareDialog extends BottomSheetDialogFragment implements Inject
         BottomSheetBehavior.from((View) requireView().getParent()).setState(BottomSheetBehavior.STATE_EXPANDED);
     }
 
-    private void shareByLink(ThemeSnackbarUtils themeSnackbarUtils) {
+    private void shareByLink() {
         if (file.isSharedViaLink()) {
-            ((FileActivity) getActivity()).getFileOperationsHelper().getFileWithLink(file, themeSnackbarUtils);
+            ((FileActivity) getActivity()).getFileOperationsHelper().getFileWithLink(file, viewThemeUtils);
         } else if (sharingPublicPasswordEnforced || sharingPublicAskForPassword) {
             // password enforced by server, request to the user before trying to create
             requestPasswordForShareViaLink();

+ 2 - 4
app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java

@@ -63,7 +63,6 @@ import com.owncloud.android.utils.ClipboardUtil;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeDrawableUtils;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 import com.owncloud.android.utils.theme.newm3.ViewThemeUtils;
 
@@ -103,7 +102,6 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     @Inject ClientFactory clientFactory;
     @Inject ThemeColorUtils themeColorUtils;
     @Inject ThemeToolbarUtils themeToolbarUtils;
-    @Inject ThemeSnackbarUtils themeSnackbarUtils;
     @Inject ThemeDrawableUtils themeDrawableUtils;
     @Inject ViewThemeUtils viewThemeUtils;
 
@@ -288,7 +286,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     private void showSendLinkTo(OCShare publicShare) {
         if (file.isSharedViaLink()) {
             if (TextUtils.isEmpty(publicShare.getShareLink())) {
-                fileOperationsHelper.getFileWithLink(file, themeSnackbarUtils);
+                fileOperationsHelper.getFileWithLink(file, viewThemeUtils);
             } else {
                 FileDisplayActivity.showShareLinkDialog(fileActivity, file, publicShare.getShareLink());
             }
@@ -298,7 +296,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     public void copyLink(OCShare share) {
         if (file.isSharedViaLink()) {
             if (TextUtils.isEmpty(share.getShareLink())) {
-                fileOperationsHelper.getFileWithLink(file, themeSnackbarUtils);
+                fileOperationsHelper.getFileWithLink(file, viewThemeUtils);
             } else {
                 ClipboardUtil.copyToClipboard(getActivity(), share.getShareLink());
             }

+ 3 - 3
app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java

@@ -85,7 +85,7 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.PermissionUtil;
 import com.owncloud.android.utils.UriUtils;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils;
 
 import org.greenrobot.eventbus.EventBus;
 
@@ -497,13 +497,13 @@ public class FileOperationsHelper {
         }
     }
 
-    public void getFileWithLink(@NonNull OCFile file, ThemeSnackbarUtils themeSnackbarUtils) {
+    public void getFileWithLink(@NonNull OCFile file, final ViewThemeUtils viewThemeUtils) {
         List<OCShare> shares = fileActivity.getStorageManager().getSharesByPathAndType(file.getRemotePath(),
                                                                                        ShareType.PUBLIC_LINK,
                                                                                        "");
 
         if (shares.size() == SINGLE_LINK_SIZE) {
-            FileActivity.copyAndShareFileLink(fileActivity, file, shares.get(0).getShareLink(), themeSnackbarUtils);
+            FileActivity.copyAndShareFileLink(fileActivity, file, shares.get(0).getShareLink(), viewThemeUtils);
         } else {
             if (fileActivity instanceof FileDisplayActivity) {
                 ((FileDisplayActivity) fileActivity).showDetails(file, 1);

+ 10 - 9
app/src/main/java/com/owncloud/android/utils/PermissionUtil.kt

@@ -42,7 +42,7 @@ import com.nextcloud.client.preferences.AppPreferences
 import com.nextcloud.client.preferences.AppPreferencesImpl
 import com.owncloud.android.R
 import com.owncloud.android.ui.dialog.StoragePermissionDialogFragment
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils
 
 object PermissionUtil {
     const val PERMISSIONS_EXTERNAL_STORAGE = 1
@@ -116,7 +116,7 @@ object PermissionUtil {
     @JvmOverloads
     fun requestExternalStoragePermission(
         activity: AppCompatActivity,
-        themeSnackbarUtils: ThemeSnackbarUtils,
+        viewThemeUtils: ViewThemeUtils,
         permissionRequired: Boolean = false
     ) {
         if (!checkExternalStoragePermission(activity)) {
@@ -124,20 +124,20 @@ object PermissionUtil {
                 Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
                     if (canRequestAllFilesPermission(activity)) {
                         // can request All Files, show choice
-                        showPermissionChoiceDialog(activity, permissionRequired, themeSnackbarUtils)
+                        showPermissionChoiceDialog(activity, permissionRequired, viewThemeUtils)
                     } else {
                         // can not request all files, request READ_EXTERNAL_STORAGE
                         requestStoragePermission(
                             activity,
                             Manifest.permission.READ_EXTERNAL_STORAGE,
-                            themeSnackbarUtils
+                            viewThemeUtils
                         )
                     }
                 }
                 else -> requestStoragePermission(
                     activity,
                     Manifest.permission.WRITE_EXTERNAL_STORAGE,
-                    themeSnackbarUtils
+                    viewThemeUtils
                 )
             }
         }
@@ -146,10 +146,11 @@ object PermissionUtil {
     /**
      * Request a storage permission
      */
+    // TODO inject this class to avoid passing ViewThemeUtils around
     private fun requestStoragePermission(
         activity: Activity,
         permission: String,
-        themeSnackbarUtils: ThemeSnackbarUtils
+        viewThemeUtils: ViewThemeUtils
     ) {
         fun doRequest() {
             ActivityCompat.requestPermissions(
@@ -171,7 +172,7 @@ object PermissionUtil {
                 .setAction(R.string.common_ok) {
                     doRequest()
                 }
-                .also { themeSnackbarUtils.colorSnackbar(activity, it) }
+                .also { viewThemeUtils.material.themeSnackbar(it) }
                 .show()
         } else {
             // No explanation needed, request the permission.
@@ -205,7 +206,7 @@ object PermissionUtil {
     private fun showPermissionChoiceDialog(
         activity: AppCompatActivity,
         permissionRequired: Boolean,
-        themeSnackbarUtils: ThemeSnackbarUtils
+        viewThemeUtils: ViewThemeUtils
     ) {
         val preferences: AppPreferences = AppPreferencesImpl.fromContext(activity)
 
@@ -228,7 +229,7 @@ object PermissionUtil {
                         requestStoragePermission(
                             activity,
                             Manifest.permission.READ_EXTERNAL_STORAGE,
-                            themeSnackbarUtils
+                            viewThemeUtils
                         )
                     }
                 }

+ 0 - 46
app/src/main/java/com/owncloud/android/utils/theme/ThemeSnackbarUtils.java

@@ -1,46 +0,0 @@
-/*
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * @author Andy Scherzinger
- * Copyright (C) 2017 Tobias Kaminsky
- * Copyright (C) 2017 Nextcloud GmbH
- * Copyright (C) 2018 Andy Scherzinger
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package com.owncloud.android.utils.theme;
-
-import android.content.Context;
-
-import com.google.android.material.snackbar.Snackbar;
-import com.owncloud.android.R;
-
-import androidx.core.content.ContextCompat;
-
-/**
- * Utility class with methods for client side button theming.
- */
-public final class ThemeSnackbarUtils {
-    /**
-     * set the Nextcloud standard colors for the snackbar.
-     *
-     * @param context  the context relevant for setting the color according to the context's theme
-     * @param snackbar the snackbar to be colored
-     */
-    public void colorSnackbar(Context context, Snackbar snackbar) {
-        // Changing action button text color
-        snackbar.setActionTextColor(ContextCompat.getColor(context, R.color.fg_inverse));
-    }
-}

+ 4 - 5
app/src/test/java/com/nextcloud/client/jobs/BackgroundJobFactoryTest.kt

@@ -36,7 +36,7 @@ import com.nextcloud.client.preferences.AppPreferences
 import com.owncloud.android.datamodel.ArbitraryDataProvider
 import com.owncloud.android.datamodel.UploadsStorageManager
 import com.owncloud.android.utils.theme.ThemeColorUtils
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils
+import com.owncloud.android.utils.theme.newm3.ViewThemeUtils
 import org.greenrobot.eventbus.EventBus
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertNull
@@ -45,7 +45,6 @@ import org.junit.Test
 import org.mockito.Mock
 import org.mockito.MockitoAnnotations
 import org.mockito.kotlin.whenever
-import javax.inject.Provider
 
 class BackgroundJobFactoryTest {
 
@@ -104,7 +103,7 @@ class BackgroundJobFactoryTest {
     private lateinit var themeColorUtils: ThemeColorUtils
 
     @Mock
-    private lateinit var themeSnackbarUtils: ThemeSnackbarUtils
+    private lateinit var viewThemeUtils: ViewThemeUtils
 
     private lateinit var factory: BackgroundJobFactory
 
@@ -117,7 +116,7 @@ class BackgroundJobFactoryTest {
             contentResolver,
             clock,
             powerManagementService,
-            Provider { backgroundJobManager },
+            { backgroundJobManager },
             deviceInfo,
             accountManager,
             resources,
@@ -128,7 +127,7 @@ class BackgroundJobFactoryTest {
             eventBus,
             deckApi,
             themeColorUtils,
-            themeSnackbarUtils
+            { viewThemeUtils }
         )
     }