소스 검색

Inject AppPreferences into activities and fragments

Signed-off-by: Chris Narkiewicz <hello@ezaquarii.com>
Chris Narkiewicz 6 년 전
부모
커밋
8761e50b0f
22개의 변경된 파일201개의 추가작업 그리고 79개의 파일을 삭제
  1. 78 4
      src/main/java/com/nextcloud/client/di/ComponentsModule.java
  2. 3 4
      src/main/java/com/nextcloud/client/di/Injectable.java
  3. 1 1
      src/main/java/com/owncloud/android/MainApp.java
  4. 2 2
      src/main/java/com/owncloud/android/providers/FileContentProvider.java
  5. 8 5
      src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java
  6. 2 1
      src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
  7. 6 3
      src/main/java/com/owncloud/android/ui/activity/FirstRunActivity.java
  8. 5 4
      src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java
  9. 5 4
      src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java
  10. 5 3
      src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java
  11. 8 6
      src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
  12. 7 4
      src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
  13. 2 1
      src/main/java/com/owncloud/android/ui/activity/ShareActivity.java
  14. 7 3
      src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java
  15. 5 3
      src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java
  16. 5 3
      src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java
  17. 11 10
      src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java
  18. 10 5
      src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java
  19. 8 3
      src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java
  20. 7 3
      src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
  21. 7 3
      src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java
  22. 9 4
      src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java

+ 78 - 4
src/main/java/com/nextcloud/client/di/ComponentsModule.java

@@ -20,8 +20,46 @@
 
 package com.nextcloud.client.di;
 
+import com.owncloud.android.authentication.AuthenticatorActivity;
+import com.owncloud.android.authentication.DeepLinkLoginActivity;
+import com.owncloud.android.ui.activities.ActivitiesActivity;
+import com.owncloud.android.ui.activity.ConflictsResolveActivity;
+import com.owncloud.android.ui.activity.ContactsPreferenceActivity;
+import com.owncloud.android.ui.activity.CopyToClipboardActivity;
+import com.owncloud.android.ui.activity.DrawerActivity;
+import com.owncloud.android.ui.activity.ErrorsWhileCopyingHandlerActivity;
+import com.owncloud.android.ui.activity.ExternalSiteWebView;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
+import com.owncloud.android.ui.activity.FilePickerActivity;
+import com.owncloud.android.ui.activity.FirstRunActivity;
+import com.owncloud.android.ui.activity.FolderPickerActivity;
+import com.owncloud.android.ui.activity.HookActivity;
+import com.owncloud.android.ui.activity.LogHistoryActivity;
+import com.owncloud.android.ui.activity.ManageAccountsActivity;
+import com.owncloud.android.ui.activity.ManageSpaceActivity;
+import com.owncloud.android.ui.activity.NotificationsActivity;
+import com.owncloud.android.ui.activity.ParticipateActivity;
+import com.owncloud.android.ui.activity.PassCodeActivity;
+import com.owncloud.android.ui.activity.ReceiveExternalFilesActivity;
+import com.owncloud.android.ui.activity.RequestCredentialsActivity;
+import com.owncloud.android.ui.activity.RichDocumentsWebView;
+import com.owncloud.android.ui.activity.SettingsActivity;
+import com.owncloud.android.ui.activity.ShareActivity;
+import com.owncloud.android.ui.activity.SsoGrantPermissionActivity;
+import com.owncloud.android.ui.activity.SyncedFoldersActivity;
+import com.owncloud.android.ui.activity.UploadFilesActivity;
+import com.owncloud.android.ui.activity.UploadListActivity;
+import com.owncloud.android.ui.activity.UploadPathActivity;
+import com.owncloud.android.ui.activity.UserInfoActivity;
+import com.owncloud.android.ui.activity.WhatsNewActivity;
+import com.owncloud.android.ui.errorhandling.ErrorShowActivity;
+import com.owncloud.android.ui.fragment.ExtendedListFragment;
 import com.owncloud.android.ui.fragment.FileDetailFragment;
+import com.owncloud.android.ui.fragment.LocalFileListFragment;
+import com.owncloud.android.ui.fragment.OCFileListFragment;
+import com.owncloud.android.ui.preview.PreviewImageActivity;
+import com.owncloud.android.ui.preview.PreviewVideoActivity;
+import com.owncloud.android.ui.trashbin.TrashbinActivity;
 
 import dagger.Module;
 import dagger.android.ContributesAndroidInjector;
@@ -32,9 +70,45 @@ import dagger.android.ContributesAndroidInjector;
  */
 @Module
 abstract class ComponentsModule {
-    @ContributesAndroidInjector
-    abstract FileDisplayActivity fileDisplayActivity();
+    @ContributesAndroidInjector abstract ActivitiesActivity activitiesActivity();
+    @ContributesAndroidInjector abstract AuthenticatorActivity authenticatorActivity();
+    @ContributesAndroidInjector abstract ConflictsResolveActivity conflictsResolveActivity();
+    @ContributesAndroidInjector abstract ContactsPreferenceActivity contactsPreferenceActivity();
+    @ContributesAndroidInjector abstract CopyToClipboardActivity copyToClipboardActivity();
+    @ContributesAndroidInjector abstract DeepLinkLoginActivity deepLinkLoginActivity();
+    @ContributesAndroidInjector abstract DrawerActivity drawerActivity();
+    @ContributesAndroidInjector abstract ErrorShowActivity errorShowActivity();
+    @ContributesAndroidInjector abstract ErrorsWhileCopyingHandlerActivity errorsWhileCopyingHandlerActivity();
+    @ContributesAndroidInjector abstract ExternalSiteWebView externalSiteWebView();
+    @ContributesAndroidInjector abstract FileDisplayActivity fileDisplayActivity();
+    @ContributesAndroidInjector abstract FilePickerActivity filePickerActivity();
+    @ContributesAndroidInjector abstract FirstRunActivity firstRunActivity();
+    @ContributesAndroidInjector abstract FolderPickerActivity folderPickerActivity();
+    @ContributesAndroidInjector abstract HookActivity hookActivity();
+    @ContributesAndroidInjector abstract LogHistoryActivity logHistoryActivity();
+    @ContributesAndroidInjector abstract ManageAccountsActivity manageAccountsActivity();
+    @ContributesAndroidInjector abstract ManageSpaceActivity manageSpaceActivity();
+    @ContributesAndroidInjector abstract NotificationsActivity notificationsActivity();
+    @ContributesAndroidInjector abstract ParticipateActivity participateActivity();
+    @ContributesAndroidInjector abstract PassCodeActivity passCodeActivity();
+    @ContributesAndroidInjector abstract PreviewImageActivity previewImageActivity();
+    @ContributesAndroidInjector abstract PreviewVideoActivity previewVideoActivity();
+    @ContributesAndroidInjector abstract ReceiveExternalFilesActivity receiveExternalFilesActivity();
+    @ContributesAndroidInjector abstract RequestCredentialsActivity requestCredentialsActivity();
+    @ContributesAndroidInjector abstract RichDocumentsWebView richDocumentsWebView();
+    @ContributesAndroidInjector abstract SettingsActivity settingsActivity();
+    @ContributesAndroidInjector abstract ShareActivity shareActivity();
+    @ContributesAndroidInjector abstract SsoGrantPermissionActivity ssoGrantPermissionActivity();
+    @ContributesAndroidInjector abstract SyncedFoldersActivity syncedFoldersActivity();
+    @ContributesAndroidInjector abstract TrashbinActivity trashbinActivity();
+    @ContributesAndroidInjector abstract UploadFilesActivity uploadFilesActivity();
+    @ContributesAndroidInjector abstract UploadListActivity uploadListActivity();
+    @ContributesAndroidInjector abstract UploadPathActivity uploadPathActivity();
+    @ContributesAndroidInjector abstract UserInfoActivity userInfoActivity();
+    @ContributesAndroidInjector abstract WhatsNewActivity whatsNewActivity();
 
-    @ContributesAndroidInjector
-    abstract FileDetailFragment fileDetailFragment();
+    @ContributesAndroidInjector abstract ExtendedListFragment extendedListFragment();
+    @ContributesAndroidInjector abstract FileDetailFragment fileDetailFragment();
+    @ContributesAndroidInjector abstract LocalFileListFragment localFileListFragment();
+    @ContributesAndroidInjector abstract OCFileListFragment ocFileListFragment();
 }

+ 3 - 4
src/main/java/com/nextcloud/client/di/Injectable.java

@@ -21,15 +21,14 @@
 package com.nextcloud.client.di;
 
 /**
- * Marks object as injectable by {@link DependencyInjector}.
+ * Marks object as injectable by {@link ActivityInjector} and {@link FragmentInjector}.
  * <p>
  * Any {@link android.app.Activity} or {@link androidx.fragment.app.Fragment} implementing
- * this interface will be automatically supplied with dependencies by {@link DependencyInjector}.
+ * this interface will be automatically supplied with dependencies.
  * <p>
  * Activities are considered fully-initialized after call to {@link android.app.Activity#onCreate(Bundle)}
  * (this means after {@code super.onCreate(savedStateInstance)} returns).
  * <p>
  * Injectable Fragments are supplied with dependencies before {@link androidx.fragment.app.Fragment#onAttach(Context)}.
  */
-public interface Injectable {
-}
+public interface Injectable {}

+ 1 - 1
src/main/java/com/owncloud/android/MainApp.java

@@ -218,7 +218,7 @@ public class MainApp extends MultiDexApplication implements
             @Override
             public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                 Log_OC.d(activity.getClass().getSimpleName(), "onCreate(Bundle) starting");
-                WhatsNewActivity.runIfNeeded(activity);
+                WhatsNewActivity.runIfNeeded(activity, preferences);
                 passCodeManager.onActivityCreated(activity);
             }
 

+ 2 - 2
src/main/java/com/owncloud/android/providers/FileContentProvider.java

@@ -154,7 +154,7 @@ public class FileContentProvider extends ContentProvider {
                 count = db.delete(ProviderTableMeta.FILESYSTEM_TABLE_NAME, where, whereArgs);
                 break;
             default:
-                throw new IllegalArgumentException("Unknown uri: " + uri.toString());
+                throw new IllegalArgumentException(String.format(Locale.US, "Unknown uri: %s", uri.toString()));
         }
 
         return count;
@@ -225,7 +225,7 @@ public class FileContentProvider extends ContentProvider {
             case SINGLE_FILE:
                 return ProviderTableMeta.CONTENT_TYPE_ITEM;
             default:
-                throw new IllegalArgumentException("Unknown Uri id: " + uri.toString());
+                throw new IllegalArgumentException(String.format(Locale.US, "Unknown Uri id: %s", uri));
         }
     }
 

+ 8 - 5
src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -54,8 +54,8 @@ import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.animation.GlideAnimation;
 import com.bumptech.glide.request.target.SimpleTarget;
 import com.google.android.material.navigation.NavigationView;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
-import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
@@ -102,6 +102,8 @@ import org.parceler.Parcels;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.ActionBarDrawerToggle;
 import androidx.appcompat.graphics.drawable.DrawerArrowDrawable;
@@ -112,7 +114,9 @@ import androidx.drawerlayout.widget.DrawerLayout;
  * Base class to handle setup of the drawer implementation including user switching and avatar fetching and fallback
  * generation.
  */
-public abstract class DrawerActivity extends ToolbarActivity implements DisplayUtils.AvatarGenerationListener {
+public abstract class DrawerActivity extends ToolbarActivity
+    implements DisplayUtils.AvatarGenerationListener, Injectable {
+
     private static final String TAG = DrawerActivity.class.getSimpleName();
     private static final String KEY_IS_ACCOUNT_CHOOSER_ACTIVE = "IS_ACCOUNT_CHOOSER_ACTIVE";
     private static final String KEY_CHECKED_MENU_ITEM = "CHECKED_MENU_ITEM";
@@ -205,7 +209,8 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
     private ExternalLinksProvider externalLinksProvider;
     private ArbitraryDataProvider arbitraryDataProvider;
 
-    private AppPreferences preferences;
+    @Inject
+    AppPreferences preferences;
 
     /**
      * Initializes the drawer, its content and highlights the menu item with the given id.
@@ -1153,8 +1158,6 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        preferences = PreferenceManager.fromContext(this);
-
         if (savedInstanceState != null) {
             mIsAccountChooserActive = savedInstanceState.getBoolean(KEY_IS_ACCOUNT_CHOOSER_ACTIVE, false);
             mCheckedMenuItem = savedInstanceState.getInt(KEY_CHECKED_MENU_ITEM, Menu.NONE);

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

@@ -132,6 +132,7 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Locale;
 
 import javax.inject.Inject;
 
@@ -566,7 +567,7 @@ public class FileDisplayActivity extends HookActivity
                 }
 
             } else {
-                Log_OC.e(TAG, "Unexpected intent " + intent.toString());
+                Log_OC.e(TAG, String.format(Locale.US, "Unexpected intent %s", intent));
             }
     }
 

+ 6 - 3
src/main/java/com/owncloud/android/ui/activity/FirstRunActivity.java

@@ -36,6 +36,8 @@ import android.widget.Button;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 import androidx.viewpager.widget.ViewPager;
+
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.MainApp;
@@ -47,23 +49,24 @@ import com.owncloud.android.ui.adapter.FeaturesViewAdapter;
 import com.owncloud.android.ui.whatsnew.ProgressIndicator;
 import com.owncloud.android.utils.DisplayUtils;
 
+import javax.inject.Inject;
+
 /**
  * Activity displaying general feature after a fresh install.
  */
-public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageChangeListener {
+public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageChangeListener, Injectable {
 
     public static final String EXTRA_ALLOW_CLOSE = "ALLOW_CLOSE";
     public static final String EXTRA_EXIT = "EXIT";
     public static final int FIRST_RUN_RESULT_CODE = 199;
 
     private ProgressIndicator progressIndicator;
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.first_run_activity);
-        preferences = PreferenceManager.fromContext(this);
 
         boolean isProviderOrOwnInstallationVisible = getResources().getBoolean(R.bool.show_provider_or_own_installation);
 

+ 5 - 4
src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java

@@ -39,6 +39,7 @@ import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.R;
@@ -61,13 +62,15 @@ import com.owncloud.android.utils.ThemeUtils;
 
 import java.util.ArrayList;
 
+import javax.inject.Inject;
+
 import androidx.appcompat.app.ActionBar;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
 public class FolderPickerActivity extends FileActivity implements FileFragment.ContainerActivity,
-    OnClickListener, OnEnforceableRefreshListener {
+    OnClickListener, OnEnforceableRefreshListener, Injectable {
 
     public static final String EXTRA_FOLDER = FolderPickerActivity.class.getCanonicalName() + ".EXTRA_FOLDER";
     public static final String EXTRA_FILES = FolderPickerActivity.class.getCanonicalName() + ".EXTRA_FILES";
@@ -91,14 +94,12 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
     protected Button mCancelBtn;
     protected Button mChooseBtn;
     private String caption;
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         Log_OC.d(TAG, "onCreate() start");
-
         super.onCreate(savedInstanceState);
-        preferences = PreferenceManager.fromContext(this);
 
         if (this instanceof FilePickerActivity) {
             setContentView(R.layout.files_picker);

+ 5 - 4
src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java

@@ -28,6 +28,7 @@ import android.widget.Button;
 import android.widget.TextView;
 
 import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.R;
@@ -35,15 +36,17 @@ import com.owncloud.android.lib.common.utils.Log_OC;
 
 import java.io.File;
 
+import javax.inject.Inject;
+
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
 
-public class ManageSpaceActivity extends AppCompatActivity {
+public class ManageSpaceActivity extends AppCompatActivity implements Injectable {
 
     private static final String TAG = ManageSpaceActivity.class.getSimpleName();
     private static final String LIB_FOLDER = "lib";
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -65,8 +68,6 @@ public class ManageSpaceActivity extends AppCompatActivity {
                 clearDataTask.execute();
             }
         });
-
-        preferences = PreferenceManager.fromContext(this);
     }
 
     @Override

+ 5 - 3
src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java

@@ -39,6 +39,7 @@ import android.widget.EditText;
 import android.widget.TextView;
 
 import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
@@ -46,9 +47,11 @@ import com.owncloud.android.utils.ThemeUtils;
 
 import java.util.Arrays;
 
+import javax.inject.Inject;
+
 import androidx.appcompat.app.AppCompatActivity;
 
-public class PassCodeActivity extends AppCompatActivity {
+public class PassCodeActivity extends AppCompatActivity implements Injectable {
 
     private static final String TAG = PassCodeActivity.class.getSimpleName();
 
@@ -65,7 +68,7 @@ public class PassCodeActivity extends AppCompatActivity {
     public final static String PREFERENCE_PASSCODE_D3 = "PrefPinCode3";
     public final static String PREFERENCE_PASSCODE_D4 = "PrefPinCode4";
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
     private Button mBCancel;
     private TextView mPassCodeHdr;
     private TextView mPassCodeHdrExplanation;
@@ -90,7 +93,6 @@ public class PassCodeActivity extends AppCompatActivity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.passcodelock);
-        preferences = com.nextcloud.client.preferences.PreferenceManager.fromContext(this);
 
         int elementColor = ThemeUtils.elementColor(this);
 

+ 8 - 6
src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -72,6 +72,8 @@ import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.view.MenuItemCompat;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.FragmentManager;
+
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.MainApp;
@@ -117,12 +119,14 @@ import java.util.List;
 import java.util.Stack;
 import java.util.Vector;
 
+import javax.inject.Inject;
+
 /**
  * This can be used to upload things to an ownCloud instance.
  */
 public class ReceiveExternalFilesActivity extends FileActivity
         implements OnItemClickListener, View.OnClickListener, CopyAndUploadContentUrisTask.OnCopyTmpFilesTaskListener,
-        SortingOrderDialogFragment.OnSortingOrderListener {
+        SortingOrderDialogFragment.OnSortingOrderListener, Injectable {
 
     private static final String TAG = ReceiveExternalFilesActivity.class.getSimpleName();
 
@@ -133,7 +137,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
     public static final String DESKTOP_FILE_SUFFIX = ".desktop";
     public static final int SINGLE_PARENT = 1;
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
     private AccountManager mAccountManager;
     private Stack<String> mParents = new Stack<>();
     private List<Parcelable> mStreamsToUpload;
@@ -176,7 +180,6 @@ public class ReceiveExternalFilesActivity extends FileActivity
         mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
 
         super.onCreate(savedInstanceState);
-        preferences = PreferenceManager.fromContext(this);
 
         // Listen for sync messages
         IntentFilter syncIntentFilter = new IntentFilter(RefreshFolderOperation.
@@ -327,7 +330,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
         }
     }
 
-    public static class DialogInputUploadFilename extends DialogFragment {
+    public static class DialogInputUploadFilename extends DialogFragment implements Injectable {
         private static final String KEY_SUBJECT_TEXT = "SUBJECT_TEXT";
         private static final String KEY_EXTRA_TEXT = "EXTRA_TEXT";
 
@@ -342,7 +345,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
         private int mFileCategory;
 
         private Spinner mSpinner;
-        private AppPreferences preferences;
+        @Inject AppPreferences preferences;
 
         public static DialogInputUploadFilename newInstance(String subjectText, String extraText) {
             DialogInputUploadFilename dialog = new DialogInputUploadFilename();
@@ -356,7 +359,6 @@ public class ReceiveExternalFilesActivity extends FileActivity
         @Override
         public void onAttach(Context context) {
             super.onAttach(context);
-            preferences = PreferenceManager.fromContext(context);
         }
 
         @NonNull

+ 7 - 4
src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java

@@ -54,6 +54,8 @@ import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.core.content.res.ResourcesCompat;
+
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.BuildConfig;
 import com.owncloud.android.MainApp;
@@ -78,13 +80,16 @@ import com.owncloud.android.utils.ThemeUtils;
 
 import java.util.ArrayList;
 
+import javax.inject.Inject;
+
 /**
  * An Activity that allows the user to change the application's settings.
  *
  * It proxies the necessary calls via {@link androidx.appcompat.app.AppCompatDelegate} to be used with AppCompat.
  */
 public class SettingsActivity extends PreferenceActivity
-        implements StorageMigration.StorageMigrationProgressListener, LoadingVersionNumberTask.VersionDevInterface {
+    implements StorageMigration.StorageMigrationProgressListener, LoadingVersionNumberTask.VersionDevInterface,
+    Injectable {
 
     private static final String TAG = SettingsActivity.class.getSimpleName();
 
@@ -118,7 +123,7 @@ public class SettingsActivity extends PreferenceActivity
 
     private Account account;
     private ArbitraryDataProvider arbitraryDataProvider;
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
 
     @SuppressWarnings("deprecation")
     @Override
@@ -128,8 +133,6 @@ public class SettingsActivity extends PreferenceActivity
             setTheme(R.style.FallbackThemingTheme);
         }
 
-        preferences = com.nextcloud.client.preferences.PreferenceManager.fromContext(this);
-
         getDelegate().installViewFactory();
         getDelegate().onCreate(savedInstanceState);
         super.onCreate(savedInstanceState);

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

@@ -50,6 +50,7 @@ import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.GetShareWithUsersAsyncTask;
 
 import java.util.ArrayList;
+import java.util.Locale;
 
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
@@ -124,7 +125,7 @@ public class ShareActivity extends FileActivity implements ShareFragmentListener
             }
 
         } else {
-            Log_OC.e(TAG, "Unexpected intent " + intent.toString());
+            Log_OC.e(TAG, String.format(Locale.US, "Unexpected intent %s", intent));
         }
     }
 

+ 7 - 3
src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java

@@ -42,6 +42,8 @@ import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
+import com.nextcloud.client.di.Injectable;
+import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.BuildConfig;
 import com.owncloud.android.MainApp;
@@ -76,6 +78,8 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AlertDialog;
@@ -92,7 +96,7 @@ import static com.owncloud.android.datamodel.SyncedFolderDisplayItem.UNPERSISTED
  * Activity displaying all auto-synced folders and/or instant upload media folders.
  */
 public class SyncedFoldersActivity extends FileActivity implements SyncedFolderAdapter.ClickListener,
-        SyncedFolderPreferencesDialogFragment.OnSyncedFolderPreferenceListener {
+        SyncedFolderPreferencesDialogFragment.OnSyncedFolderPreferenceListener, Injectable {
 
     private static final String[] PRIORITIZED_FOLDERS = new String[]{"Camera", "Screenshots"};
     private static final List<String> SPECIAL_MANUFACTURER = Arrays.asList("Samsung", "Huawei", "Xiaomi");
@@ -110,6 +114,7 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
 
     private String path;
     private int type;
+    @Inject AppPreferences preferences;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -188,8 +193,7 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
         final int gridWidth = getResources().getInteger(R.integer.media_grid_width);
         boolean lightVersion = getResources().getBoolean(R.bool.syncedFolder_light);
         mAdapter = new SyncedFolderAdapter(this, gridWidth, this, lightVersion);
-        mSyncedFolderProvider = new SyncedFolderProvider(getContentResolver(),
-            PreferenceManager.fromContext(this));
+        mSyncedFolderProvider = new SyncedFolderProvider(getContentResolver(), preferences);
 
         final GridLayoutManager lm = new GridLayoutManager(this, gridWidth);
         mAdapter.setLayoutManager(lm);

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

@@ -42,6 +42,7 @@ import android.widget.Spinner;
 import android.widget.TextView;
 
 import com.google.android.material.button.MaterialButton;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.R;
@@ -63,6 +64,8 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.ActionBar;
@@ -80,7 +83,7 @@ import androidx.fragment.app.FragmentTransaction;
 public class UploadFilesActivity extends FileActivity implements
     LocalFileListFragment.ContainerActivity, ActionBar.OnNavigationListener,
     OnClickListener, ConfirmationDialogFragmentListener, SortingOrderDialogFragment.OnSortingOrderListener,
-    CheckAvailableSpaceTask.CheckAvailableSpaceListener, StoragePathAdapter.StoragePathAdapterListener {
+    CheckAvailableSpaceTask.CheckAvailableSpaceListener, StoragePathAdapter.StoragePathAdapterListener, Injectable {
 
     private static final String SORT_ORDER_DIALOG_TAG = "SORT_ORDER_DIALOG";
     private static final int SINGLE_DIR = 1;
@@ -118,7 +121,7 @@ public class UploadFilesActivity extends FileActivity implements
     private static final String QUERY_TO_MOVE_DIALOG_TAG = "QUERY_TO_MOVE";
     public static final String REQUEST_CODE_KEY = "requestCode";
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
     private int requestCode;
     private LocalStoragePathPickerDialogFragment dialog;
 
@@ -126,7 +129,6 @@ public class UploadFilesActivity extends FileActivity implements
     public void onCreate(Bundle savedInstanceState) {
         Log_OC.d(TAG, "onCreate() start");
         super.onCreate(savedInstanceState);
-        preferences = PreferenceManager.fromContext(this);
 
         Bundle extras = getIntent().getExtras();
         if (extras != null) {

+ 5 - 3
src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java

@@ -51,6 +51,7 @@ import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.animation.GlideAnimation;
 import com.bumptech.glide.request.target.SimpleTarget;
 import com.google.gson.Gson;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.R;
@@ -75,6 +76,8 @@ import org.parceler.Parcels;
 import java.util.LinkedList;
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.annotation.ColorInt;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
@@ -92,7 +95,7 @@ import butterknife.Unbinder;
 /**
  * This Activity presents the user information.
  */
-public class UserInfoActivity extends FileActivity {
+public class UserInfoActivity extends FileActivity implements Injectable {
     public static final String KEY_ACCOUNT = "ACCOUNT";
 
     private static final String TAG = UserInfoActivity.class.getSimpleName();
@@ -114,7 +117,7 @@ public class UserInfoActivity extends FileActivity {
 
     @BindString(R.string.user_information_retrieval_error) protected String sorryMessage;
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
     private float mCurrentAccountAvatarRadiusDimension;
 
     private Unbinder unbinder;
@@ -126,7 +129,6 @@ public class UserInfoActivity extends FileActivity {
     public void onCreate(Bundle savedInstanceState) {
         Log_OC.v(TAG, "onCreate() start");
         super.onCreate(savedInstanceState);
-        preferences = PreferenceManager.fromContext(this);
         Bundle bundle = getIntent().getExtras();
 
         account = Parcels.unwrap(bundle.getParcelable(KEY_ACCOUNT));

+ 11 - 10
src/main/java/com/owncloud/android/ui/activity/WhatsNewActivity.java

@@ -31,6 +31,7 @@ import android.widget.Button;
 import android.widget.ImageButton;
 import android.widget.TextView;
 
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
@@ -42,25 +43,26 @@ import com.owncloud.android.ui.adapter.FeaturesWebViewAdapter;
 import com.owncloud.android.ui.whatsnew.ProgressIndicator;
 import com.owncloud.android.utils.ThemeUtils;
 
+import javax.inject.Inject;
+
 import androidx.fragment.app.FragmentActivity;
 import androidx.viewpager.widget.ViewPager;
 
 /**
  * Activity displaying new features after an update.
  */
-public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPageChangeListener {
+public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, Injectable {
 
     private ImageButton mForwardFinishButton;
     private Button mSkipButton;
     private ProgressIndicator mProgress;
     private ViewPager mPager;
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.whats_new_activity);
-        preferences = PreferenceManager.fromContext(this);
 
         int fontColor = getResources().getColor(R.color.login_text_color);
 
@@ -77,7 +79,7 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
             mPager.setAdapter(featuresWebViewAdapter);
         } else {
             FeaturesViewAdapter featuresViewAdapter = new FeaturesViewAdapter(getSupportFragmentManager(),
-                    getWhatsNew(this));
+                    getWhatsNew(this, preferences));
             mProgress.setNumberOfSteps(featuresViewAdapter.getCount());
             mPager.setAdapter(featuresViewAdapter);
         }
@@ -142,18 +144,18 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
         preferences.setLastSeenVersionCode(MainApp.getVersionCode());
     }
 
-    public static void runIfNeeded(Context context) {
+    public static void runIfNeeded(Context context, AppPreferences preferences) {
         if (!context.getResources().getBoolean(R.bool.show_whats_new) || context instanceof WhatsNewActivity) {
             return;
         }
 
-        if (shouldShow(context)) {
+        if (shouldShow(context, preferences)) {
             context.startActivity(new Intent(context, WhatsNewActivity.class));
         }
     }
 
-    private static boolean shouldShow(Context context) {
-        return !(context instanceof PassCodeActivity) && getWhatsNew(context).length > 0;
+    private static boolean shouldShow(Context context, AppPreferences preferences) {
+        return !(context instanceof PassCodeActivity) && getWhatsNew(context, preferences).length > 0;
     }
 
     @Override
@@ -176,9 +178,8 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
         return AccountUtils.getCurrentOwnCloudAccount(context) == null;
     }
 
-    private static FeatureItem[] getWhatsNew(Context context) {
+    private static FeatureItem[] getWhatsNew(Context context, AppPreferences preferences) {
         int itemVersionCode = 30030099;
-        AppPreferences preferences = PreferenceManager.fromContext(context);
 
         if (!isFirstRun(context) && MainApp.getVersionCode() >= itemVersionCode
                 && preferences.getLastSeenVersionCode() < itemVersionCode) {

+ 10 - 5
src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -52,6 +52,7 @@ import android.widget.TextView;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
@@ -74,6 +75,8 @@ import org.parceler.Parcel;
 
 import java.util.ArrayList;
 
+import javax.inject.Inject;
+
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
@@ -85,9 +88,12 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 
-public class ExtendedListFragment extends Fragment
-        implements OnItemClickListener, OnEnforceableRefreshListener, SearchView.OnQueryTextListener,
-        SearchView.OnCloseListener {
+public class ExtendedListFragment extends Fragment implements
+        OnItemClickListener,
+        OnEnforceableRefreshListener,
+        SearchView.OnQueryTextListener,
+        SearchView.OnCloseListener,
+        Injectable {
 
     protected static final String TAG = ExtendedListFragment.class.getSimpleName();
 
@@ -105,7 +111,7 @@ public class ExtendedListFragment extends Fragment
     private int maxColumnSizePortrait = 5;
     private int maxColumnSizeLandscape = 10;
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
     private ScaleGestureDetector mScaleGestureDetector;
     protected SwipeRefreshLayout mRefreshListLayout;
     protected LinearLayout mEmptyListContainer;
@@ -358,7 +364,6 @@ public class ExtendedListFragment extends Fragment
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        preferences = PreferenceManager.fromContext(context);
     }
 
     @Override

+ 8 - 3
src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java

@@ -30,6 +30,7 @@ import android.view.MenuInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.R;
@@ -40,6 +41,8 @@ import com.owncloud.android.utils.FileSortOrder;
 
 import java.io.File;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
@@ -48,10 +51,13 @@ import androidx.recyclerview.widget.RecyclerView;
 /**
  * A Fragment that lists all files and folders in a given LOCAL path.
  */
-public class LocalFileListFragment extends ExtendedListFragment implements LocalFileListFragmentInterface {
+public class LocalFileListFragment extends ExtendedListFragment implements
+        LocalFileListFragmentInterface,
+        Injectable {
+
     private static final String TAG = LocalFileListFragment.class.getSimpleName();
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
 
     /** Reference to the Activity which this fragment is attached to. For callbacks */
     private LocalFileListFragment.ContainerActivity mContainerActivity;
@@ -65,7 +71,6 @@ public class LocalFileListFragment extends ExtendedListFragment implements Local
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        preferences = PreferenceManager.fromContext(context);
     }
 
     @Override

+ 7 - 3
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -49,6 +49,7 @@ import android.widget.RelativeLayout;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
@@ -114,6 +115,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
@@ -130,7 +133,9 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
  * TODO refactor to get rid of direct dependency on FileDisplayActivity
  */
 public class OCFileListFragment extends ExtendedListFragment implements
-        OCFileListFragmentInterface, OCFileListBottomSheetActions {
+        OCFileListFragmentInterface,
+        OCFileListBottomSheetActions,
+        Injectable {
 
     private static final String TAG = OCFileListFragment.class.getSimpleName();
 
@@ -162,7 +167,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
 
     private static final int SINGLE_SELECTION = 1;
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
     private FileFragment.ContainerActivity mContainerActivity;
 
     private OCFile mFile;
@@ -238,7 +243,6 @@ public class OCFileListFragment extends ExtendedListFragment implements
     public void onAttach(Context context) {
         super.onAttach(context);
         Log_OC.i(TAG, "onAttach");
-        preferences = PreferenceManager.fromContext(context);
         try {
             mContainerActivity = (FileFragment.ContainerActivity) context;
 

+ 7 - 3
src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java

@@ -32,6 +32,7 @@ import android.view.MenuItem;
 import android.view.View;
 
 import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.PreferenceManager;
 import com.owncloud.android.MainApp;
@@ -60,6 +61,8 @@ import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.ThemeUtils;
 
+import javax.inject.Inject;
+
 import androidx.appcompat.app.ActionBar;
 import androidx.drawerlayout.widget.DrawerLayout;
 import androidx.viewpager.widget.ViewPager;
@@ -72,7 +75,9 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 @SuppressWarnings("PMD.AvoidDuplicateLiterals")
 public class PreviewImageActivity extends FileActivity implements
         FileFragment.ContainerActivity,
-        ViewPager.OnPageChangeListener, OnRemoteOperationListener {
+        ViewPager.OnPageChangeListener,
+        OnRemoteOperationListener,
+        Injectable {
 
     public static final String TAG = PreviewImageActivity.class.getSimpleName();
 
@@ -88,12 +93,11 @@ public class PreviewImageActivity extends FileActivity implements
     private boolean mRequestWaitingForBinder;
     private DownloadFinishReceiver mDownloadFinishReceiver;
     private View mFullScreenAnchorView;
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        preferences = PreferenceManager.fromContext(this);
 
         final ActionBar actionBar = getSupportActionBar();
 

+ 9 - 4
src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java

@@ -30,6 +30,7 @@ import android.widget.PopupMenu;
 import android.widget.TextView;
 
 import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.R;
 import com.nextcloud.client.preferences.PreferenceManager;
@@ -45,6 +46,8 @@ import com.owncloud.android.utils.ThemeUtils;
 
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.appcompat.widget.Toolbar;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
@@ -58,8 +61,11 @@ import butterknife.Unbinder;
 /**
  * Presenting trashbin data, received from presenter
  */
-public class TrashbinActivity extends FileActivity implements TrashbinActivityInterface,
-        SortingOrderDialogFragment.OnSortingOrderListener, TrashbinContract.View {
+public class TrashbinActivity extends FileActivity implements
+        TrashbinActivityInterface,
+        SortingOrderDialogFragment.OnSortingOrderListener,
+        TrashbinContract.View,
+        Injectable {
 
     @BindView(R.id.empty_list_view_text)
     public TextView emptyContentMessage;
@@ -82,7 +88,7 @@ public class TrashbinActivity extends FileActivity implements TrashbinActivityIn
     @BindString(R.string.trashbin_empty_message)
     public String noResultsMessage;
 
-    private AppPreferences preferences;
+    @Inject AppPreferences preferences;
     private Unbinder unbinder;
     private TrashbinListAdapter trashbinListAdapter;
     private TrashbinPresenter trashbinPresenter;
@@ -93,7 +99,6 @@ public class TrashbinActivity extends FileActivity implements TrashbinActivityIn
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        preferences = PreferenceManager.fromContext(this);
         trashbinPresenter = new TrashbinPresenter(new RemoteTrashbinRepository(this), this);
 
         setContentView(R.layout.trashbin_activity);