Просмотр исходного кода

Merge pull request #10134 from nextcloud/fix/dagger-mediacontrolview

Fix theme utils injection in custom views
Álvaro Brey 3 лет назад
Родитель
Сommit
26aef8e462

+ 6 - 0
app/src/main/java/com/nextcloud/client/di/AppComponent.java

@@ -30,6 +30,8 @@ import com.nextcloud.client.network.NetworkModule;
 import com.nextcloud.client.onboarding.OnboardingModule;
 import com.nextcloud.client.preferences.PreferencesModule;
 import com.owncloud.android.MainApp;
+import com.owncloud.android.media.MediaControlView;
+import com.owncloud.android.ui.ThemeableSwitchPreference;
 
 import javax.inject.Singleton;
 
@@ -55,6 +57,10 @@ public interface AppComponent {
 
     void inject(MainApp app);
 
+    void inject(MediaControlView mediaControlView);
+
+    void inject(ThemeableSwitchPreference switchPreference);
+
     @Component.Builder
     interface Builder {
         @BindsInstance

+ 27 - 4
app/src/main/java/com/owncloud/android/MainApp.java

@@ -45,6 +45,7 @@ import com.nextcloud.client.appinfo.AppInfo;
 import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.device.PowerManagementService;
 import com.nextcloud.client.di.ActivityInjector;
+import com.nextcloud.client.di.AppComponent;
 import com.nextcloud.client.di.DaggerAppComponent;
 import com.nextcloud.client.errorhandling.ExceptionHandler;
 import com.nextcloud.client.jobs.BackgroundJobManager;
@@ -178,6 +179,8 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
     @SuppressWarnings("unused")
     private boolean mBound;
 
+    private static AppComponent appComponent;
+
     /**
      * Temporary hack
      */
@@ -226,10 +229,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         super.attachBaseContext(base);
 
         initGlobalContext(this);
-        DaggerAppComponent.builder()
-            .application(this)
-            .build()
-            .inject(this);
+        initDagger();
 
         // we don't want to handle crashes occurring inside crash reporter activity/process;
         // let the platform deal with those
@@ -243,6 +243,29 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         }
     }
 
+    private void initDagger() {
+        appComponent = DaggerAppComponent.builder()
+            .application(this)
+            .build();
+
+        appComponent.inject(this);
+    }
+
+    /**
+     * <b>USE SPARINGLY!</b> This should only be used for injection of Theme classes in custom Views, and they need to
+     * be added as methods in the {@link AppComponent} itself.
+     * <p>
+     * Once we adopt Hilt this won't be necessary either, as View is a supported target in Hilt.
+     *
+     * @return the {@link AppComponent} for this app
+     */
+    public static AppComponent getAppComponent() {
+        if (appComponent == null) {
+            throw new IllegalStateException("Dagger not initialized!");
+        }
+        return appComponent;
+    }
+
     @SuppressFBWarnings("ST")
     @Override
     public void onCreate() {

+ 11 - 7
app/src/main/java/com/owncloud/android/media/MediaControlView.java

@@ -38,6 +38,7 @@ import android.widget.SeekBar;
 import android.widget.SeekBar.OnSeekBarChangeListener;
 import android.widget.TextView;
 
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.theme.ThemeBarUtils;
@@ -46,6 +47,8 @@ import com.owncloud.android.utils.theme.ThemeColorUtils;
 import java.util.Formatter;
 import java.util.Locale;
 
+import javax.inject.Inject;
+
 
 /**
  * View containing controls for a {@link MediaPlayer}.
@@ -67,17 +70,18 @@ public class MediaControlView extends FrameLayout implements OnClickListener, On
     private ImageButton pauseButton;
     private ImageButton forwardButton;
     private ImageButton rewindButton;
-    private final ThemeColorUtils themeColorUtils;
-    private final ThemeBarUtils themeBarUtils;
+
+    @Inject
+    ThemeColorUtils themeColorUtils;
+    @Inject
+    ThemeBarUtils themeBarUtils;
+
 
     public MediaControlView(Context context,
-                            AttributeSet attrs,
-                            ThemeColorUtils themeColorUtils,
-                            ThemeBarUtils themeBarUtils) {
+                            AttributeSet attrs) {
         super(context, attrs);
 
-        this.themeColorUtils = themeColorUtils;
-        this.themeBarUtils = themeBarUtils;
+        MainApp.getAppComponent().inject(this);
 
         FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
             ViewGroup.LayoutParams.MATCH_PARENT,

+ 8 - 5
app/src/main/java/com/owncloud/android/ui/ThemeableSwitchPreference.java

@@ -29,9 +29,12 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Switch;
 
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 
+import javax.inject.Inject;
+
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.core.graphics.drawable.DrawableCompat;
 
@@ -40,22 +43,22 @@ import androidx.core.graphics.drawable.DrawableCompat;
  * Themeable switch preference TODO Migrate to androidx
  */
 public class ThemeableSwitchPreference extends SwitchPreference {
-    private ThemeColorUtils themeColorUtils;
+    @Inject
+    ThemeColorUtils themeColorUtils;
 
     public ThemeableSwitchPreference(Context context) {
         super(context);
+        MainApp.getAppComponent().inject(this);
     }
 
     public ThemeableSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
+        MainApp.getAppComponent().inject(this);
     }
 
     public ThemeableSwitchPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-    }
-
-    public void setThemeColorUtils(ThemeColorUtils themeColorUtils) {
-        this.themeColorUtils = themeColorUtils;
+        MainApp.getAppComponent().inject(this);
     }
 
     @Override

+ 0 - 6
app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java

@@ -540,7 +540,6 @@ public class SettingsActivity extends ThemedPreferenceActivity
                                                  boolean fShowMediaScanNotifications) {
         ThemeableSwitchPreference mShowMediaScanNotifications =
             (ThemeableSwitchPreference) findPreference(PREFERENCE_SHOW_MEDIA_SCAN_NOTIFICATIONS);
-        mShowMediaScanNotifications.setThemeColorUtils(themeColorUtils);
 
         if (fShowMediaScanNotifications) {
             preferenceCategoryDetails.removePreference(mShowMediaScanNotifications);
@@ -550,7 +549,6 @@ public class SettingsActivity extends ThemedPreferenceActivity
     private void setupHiddenFilesPreference(PreferenceCategory preferenceCategoryDetails,
                                             boolean fShowHiddenFilesEnabled) {
         showHiddenFiles = (ThemeableSwitchPreference) findPreference("show_hidden_files");
-        showHiddenFiles.setThemeColorUtils(themeColorUtils);
         if (fShowHiddenFilesEnabled) {
             showHiddenFiles.setOnPreferenceClickListener(preference -> {
                 preferences.setShowHiddenFilesEnabled(showHiddenFiles.isChecked());
@@ -617,10 +615,6 @@ public class SettingsActivity extends ThemedPreferenceActivity
         preferenceCategorySyncedFolders.setTitle(themeTextUtils.getColoredTitle(getString(R.string.drawer_synced_folders),
                                                                                 accentColor));
 
-        ThemeableSwitchPreference syncedFolderOnWifiSwitch =
-            (ThemeableSwitchPreference) findPreference("synced_folder_on_wifi");
-        syncedFolderOnWifiSwitch.setThemeColorUtils(themeColorUtils);
-
         if (!getResources().getBoolean(R.bool.syncedFolder_light)) {
             preferenceScreen.removePreference(preferenceCategorySyncedFolders);
         } else {

+ 1 - 1
scripts/analysis/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 88 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 87 warnings</span>