diff --git a/app/src/main/java/com/nextcloud/client/onboarding/FirstRunActivity.kt b/app/src/main/java/com/nextcloud/client/onboarding/FirstRunActivity.kt index 972c96e87bf1..51ae3973dbe2 100644 --- a/app/src/main/java/com/nextcloud/client/onboarding/FirstRunActivity.kt +++ b/app/src/main/java/com/nextcloud/client/onboarding/FirstRunActivity.kt @@ -20,10 +20,8 @@ import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.viewpager2.widget.ViewPager2 import com.nextcloud.android.common.ui.theme.utils.ColorRole -import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.appinfo.AppInfo import com.nextcloud.client.di.Injectable -import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.client.utils.IntentUtil import com.nextcloud.utils.SnackbarUtil import com.nextcloud.utils.mdm.MDMConfig @@ -46,14 +44,6 @@ class FirstRunActivity : BaseActivity(), Injectable { - @JvmField - @Inject - var userAccountManager: UserAccountManager? = null - - @JvmField - @Inject - var preferences: AppPreferences? = null - @JvmField @Inject var appInfo: AppInfo? = null @@ -103,13 +93,13 @@ class FirstRunActivity : if (RESULT_OK == result.resultCode) { val data = result.data val accountName = data?.getStringExtra(AccountManager.KEY_ACCOUNT_NAME) - val account = userAccountManager?.getAccountByName(accountName) + val account = userAccountManager.getAccountByName(accountName) if (account == null) { SnackbarUtil.show(this, R.string.account_creation_failed) return@registerForActivityResult } - userAccountManager?.setCurrentOwnCloudAccount(account.name) + userAccountManager.setCurrentOwnCloudAccount(account.name) val i = Intent(this, FileDisplayActivity::class.java) i.action = FileDisplayActivity.RESTART @@ -169,7 +159,7 @@ class FirstRunActivity : // Sometimes, accounts are not deleted when you uninstall the application so we'll do it now private fun deleteAccountAtFirstLaunch() { if (onboarding?.isFirstRun == true) { - userAccountManager?.removeAllAccounts() + userAccountManager.removeAllAccounts() } } @@ -235,7 +225,7 @@ class FirstRunActivity : } private fun onFinish() { - preferences?.lastSeenVersionCode = BuildConfig.VERSION_CODE + preferences.lastSeenVersionCode = BuildConfig.VERSION_CODE } override fun onStop() { diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java index 4f4e85599480..d044a4d576a7 100644 --- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java @@ -23,35 +23,10 @@ /** * This interface provides single point of entry for access to all application - * preferences and allows clients to subscribe for specific configuration changes. + * preferences. */ public interface AppPreferences { - /** - * Preferences listener. Callbacks should be invoked on main thread. - * Maintainers should extend this interface with callbacks for specific events. - */ - interface Listener { - default void onDarkThemeModeChanged(DarkMode mode) { - /* default empty implementation */ - }; - } - - /** - * Registers preferences listener. It no-ops if listener - * is already registered. - * - * @param listener application preferences listener - */ - void addListener(@Nullable Listener listener); - - /** - * Unregister listener. It no-ops if listener is not registered. - * - * @param listener application preferences listener - */ - void removeListener(@Nullable Listener listener); - void setKeysReInitEnabled(); boolean isKeysReInitEnabled(); diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java index 509e659bdf7a..3e749051b4bd 100644 --- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java +++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java @@ -34,8 +34,6 @@ import java.lang.reflect.Type; import java.util.List; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -126,48 +124,11 @@ public final class AppPreferencesImpl implements AppPreferences { private final SharedPreferences preferences; private final UserAccountManager userAccountManager; private final ArbitraryDataProvider arbitraryDataProvider; - private final ListenerRegistry listeners; private static final int AUTO_UPLOAD_ON_START_DEBOUNCE_IN_MINUTES = 10; private static final long AUTO_UPLOAD_ON_START_DEBOUNCE_MS = TimeUnit.MINUTES.toMillis(AUTO_UPLOAD_ON_START_DEBOUNCE_IN_MINUTES); - /** - * Adapter delegating raw {@link SharedPreferences.OnSharedPreferenceChangeListener} calls with key-value pairs to - * respective {@link com.nextcloud.client.preferences.AppPreferences.Listener} method. - */ - static class ListenerRegistry implements SharedPreferences.OnSharedPreferenceChangeListener { - private final AppPreferences preferences; - private final Set listeners; - - ListenerRegistry(AppPreferences preferences) { - this.preferences = preferences; - this.listeners = new CopyOnWriteArraySet<>(); - } - - void add(@Nullable final Listener listener) { - if (listener != null) { - listeners.add(listener); - } - } - - void remove(@Nullable final Listener listener) { - if (listener != null) { - listeners.remove(listener); - } - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (PREF__DARK_THEME.equals(key)) { - DarkMode mode = preferences.getDarkThemeMode(); - for (Listener l : listeners) { - l.onDarkThemeModeChanged(mode); - } - } - } - } - /** * This is a temporary workaround to access app preferences in places that cannot use dependency injection yet. Use * injected component via {@link AppPreferences} interface. @@ -193,18 +154,6 @@ public static AppPreferences fromContext(Context context) { this.preferences = preferences; this.userAccountManager = userAccountManager; this.arbitraryDataProvider = arbitraryDataProvider; - this.listeners = new ListenerRegistry(this); - this.preferences.registerOnSharedPreferenceChangeListener(listeners); - } - - @Override - public void addListener(@Nullable AppPreferences.Listener listener) { - this.listeners.add(listener); - } - - @Override - public void removeListener(@Nullable AppPreferences.Listener listener) { - this.listeners.remove(listener); } @Override diff --git a/app/src/main/java/com/owncloud/android/ui/activities/data/files/FilesServiceApiImpl.kt b/app/src/main/java/com/owncloud/android/ui/activities/data/files/FilesServiceApiImpl.kt index 93236764450c..be23eb6d6610 100644 --- a/app/src/main/java/com/owncloud/android/ui/activities/data/files/FilesServiceApiImpl.kt +++ b/app/src/main/java/com/owncloud/android/ui/activities/data/files/FilesServiceApiImpl.kt @@ -66,7 +66,7 @@ class FilesServiceApiImpl(private val accountManager: UserAccountManager, privat if (!result.isSuccess) return null val remoteFile = result.getData()[0] as RemoteFile - val ocFile = activity.storageManager.saveFileWithParent( + val ocFile = activity.getStorageManager().saveFileWithParent( FileStorageUtils.fillOCFile(remoteFile), context ) @@ -77,7 +77,7 @@ class FilesServiceApiImpl(private val accountManager: UserAccountManager, privat System.currentTimeMillis(), false, true, - activity.storageManager, + activity.getStorageManager(), activity.user.orElseThrow { RuntimeException() }, context ).execute(client) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java deleted file mode 100644 index fc5d538659d9..000000000000 --- a/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2024 TSI-mc - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -package com.owncloud.android.ui.activity; - -import android.accounts.Account; -import android.content.Intent; -import android.os.Bundle; - -import com.nextcloud.android.common.ui.util.extensions.AppCompatActivityExtensionsKt; -import com.nextcloud.client.account.User; -import com.nextcloud.client.account.UserAccountManager; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.mixins.MixinRegistry; -import com.nextcloud.client.mixins.SessionMixin; -import com.nextcloud.client.preferences.AppPreferences; -import com.nextcloud.client.preferences.DarkMode; -import com.nextcloud.repository.ClientRepository; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.status.OCCapability; - -import java.util.Optional; - -import javax.inject.Inject; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; - -/** - * Base activity with common behaviour for activities dealing with ownCloud {@link Account}s . - */ -public abstract class BaseActivity extends AppCompatActivity implements Injectable { - - private static final String TAG = BaseActivity.class.getSimpleName(); - - /** - * Tracks whether the activity should be recreate()'d after a theme change - */ - private boolean themeChangePending; - private boolean paused; - protected boolean enableAccountHandling = true; - - private final MixinRegistry mixinRegistry = new MixinRegistry(); - private SessionMixin sessionMixin; - - @Inject protected UserAccountManager accountManager; - @Inject protected AppPreferences preferences; - @Inject protected FileDataStorageManager fileDataStorageManager; - @Inject protected ClientRepository clientRepository; - - private final AppPreferences.Listener onPreferencesChanged = new AppPreferences.Listener() { - @Override - public void onDarkThemeModeChanged(DarkMode mode) { - onThemeSettingsModeChanged(); - } - }; - - public UserAccountManager getUserAccountManager() { - return accountManager; - } - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - AppCompatActivityExtensionsKt.applyEdgeToEdgeWithSystemBarPadding(this); - super.onCreate(savedInstanceState); - sessionMixin = new SessionMixin(this, accountManager); - mixinRegistry.add(sessionMixin); - - if (enableAccountHandling) { - mixinRegistry.onCreate(savedInstanceState); - } - } - - @Override - protected void onPostCreate(@Nullable Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - preferences.addListener(onPreferencesChanged); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - mixinRegistry.onDestroy(); - preferences.removeListener(onPreferencesChanged); - } - - @Override - protected void onPause() { - super.onPause(); - mixinRegistry.onPause(); - paused = true; - } - - @Override - protected void onResume() { - super.onResume(); - if (enableAccountHandling) { - mixinRegistry.onResume(); - } - paused = false; - - if (themeChangePending) { - recreate(); - } - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - mixinRegistry.onNewIntent(intent); - } - - @Override - protected void onRestart() { - Log_OC.v(TAG, "onRestart() start"); - super.onRestart(); - if (enableAccountHandling) { - mixinRegistry.onRestart(); - } - } - - private void onThemeSettingsModeChanged() { - if (paused) { - themeChangePending = true; - } else { - recreate(); - } - } - - /** - * Sets and validates the ownCloud {@link Account} associated to the Activity. - * - * If not valid, tries to swap it for other valid and existing ownCloud {@link Account}. - * - * @param account New {@link Account} to set. - * @param savedAccount When 'true', account was retrieved from a saved instance state. - */ - @Deprecated - protected void setAccount(Account account, boolean savedAccount) { - sessionMixin.setAccount(account); - } - - public void setUser(User user) { - sessionMixin.setUser(user); - } - - protected void startAccountCreation() { - sessionMixin.startAccountCreation(); - } - - /** - * Getter for the capabilities of the server where the current OC account lives. - * - * @return Capabilities of the server where the current OC account lives. Null if the account is not - * set yet. - */ - public Optional getCapabilities() { - return sessionMixin.getCapabilities(); - } - - /** - * Getter for the ownCloud {@link Account} where the main {@link OCFile} handled by the activity - * is located. - * - * @return OwnCloud {@link Account} where the main {@link OCFile} handled by the activity - * is located. - */ - public Account getAccount() { - return sessionMixin.getCurrentAccount(); - } - - public Optional getUser() { - return sessionMixin.getUser(); - } - - public FileDataStorageManager getStorageManager() { - return fileDataStorageManager; - } - - public ClientRepository getClientRepository() { - return clientRepository; - } - -} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.kt new file mode 100644 index 000000000000..0f8881b7198b --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.kt @@ -0,0 +1,121 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 TSI-mc + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +package com.owncloud.android.ui.activity + +import android.accounts.Account +import android.content.Intent +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.nextcloud.android.common.ui.util.extensions.applyEdgeToEdgeWithSystemBarPadding +import com.nextcloud.client.account.User +import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.client.di.Injectable +import com.nextcloud.client.mixins.MixinRegistry +import com.nextcloud.client.mixins.SessionMixin +import com.nextcloud.client.preferences.AppPreferences +import com.nextcloud.repository.ClientRepository +import com.owncloud.android.datamodel.FileDataStorageManager +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.resources.status.OCCapability +import java.util.Optional +import javax.inject.Inject + +abstract class BaseActivity : + AppCompatActivity(), + Injectable { + + protected var enableAccountHandling = true + + private val mixinRegistry = MixinRegistry() + private lateinit var sessionMixin: SessionMixin + + @Inject + lateinit var accountManager: UserAccountManager + + @Inject + lateinit var preferences: AppPreferences + + @Inject + lateinit var fileDataStorageManager: FileDataStorageManager + + @Inject + lateinit var clientRepository: ClientRepository + + val userAccountManager: UserAccountManager + get() = accountManager + + val capabilities: Optional + get() = sessionMixin.getCapabilities() + + val account: Account + get() = sessionMixin.currentAccount + + val user: Optional + get() = sessionMixin.getUser() + + open fun getStorageManager(): FileDataStorageManager = fileDataStorageManager + + override fun onCreate(savedInstanceState: Bundle?) { + applyEdgeToEdgeWithSystemBarPadding() + super.onCreate(savedInstanceState) + sessionMixin = SessionMixin(this, accountManager) + mixinRegistry.add(sessionMixin) + + if (enableAccountHandling) { + mixinRegistry.onCreate(savedInstanceState) + } + } + + override fun onDestroy() { + super.onDestroy() + mixinRegistry.onDestroy() + } + + override fun onPause() { + super.onPause() + mixinRegistry.onPause() + } + + override fun onResume() { + super.onResume() + if (enableAccountHandling) { + mixinRegistry.onResume() + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + mixinRegistry.onNewIntent(intent) + } + + override fun onRestart() { + Log_OC.v(TAG, "onRestart() start") + super.onRestart() + if (enableAccountHandling) { + mixinRegistry.onRestart() + } + } + + @Deprecated("Use setUser(User) instead") + protected open fun setAccount(account: Account) { + sessionMixin.setAccount(account) + } + + fun setUser(user: User) { + sessionMixin.setUser(user) + } + + protected open fun startAccountCreation() { + sessionMixin.startAccountCreation() + } + + companion object { + private val TAG = BaseActivity::class.java.simpleName + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index d3ae4fa89eee..d5fef55779d8 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -65,7 +65,6 @@ import com.nextcloud.client.jobs.download.FileDownloadHelper import com.nextcloud.client.jobs.upload.FileUploadEventBroadcaster import com.nextcloud.client.player.model.file.toPlaybackCollection import com.nextcloud.client.player.ui.audio.AudioPlayerLauncher -import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.client.utils.IntentUtil import com.nextcloud.ui.composeActivity.ComposeProcessTextAlias import com.nextcloud.utils.SnackbarUtil @@ -187,9 +186,6 @@ class FileDisplayActivity : @Inject lateinit var composeProcessTextAlias: ComposeProcessTextAlias - @Inject - lateinit var preferences: AppPreferences - @Inject lateinit var inAppReviewHelper: InAppReviewHelper diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java index 1aaa3caf3da8..6cc3c99af913 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java @@ -220,7 +220,7 @@ protected void onCreate(Bundle savedInstanceState) { } @Override - protected void setAccount(Account account, boolean savedAccount) { + protected void setAccount(Account account) { Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAccountType(this)); if (accounts.length == 0) { Log_OC.i(TAG, "No ownCloud account is available"); @@ -235,7 +235,7 @@ protected void setAccount(Account account, boolean savedAccount) { ); } - super.setAccount(account, savedAccount); + super.setAccount(account); } private void showAccountChooserDialog() { @@ -249,7 +249,7 @@ private Activity getActivity() { @Override public void onAccountChosen(@NonNull User user) { - setAccount(user.toPlatformAccount(), false); + setAccount(user.toPlatformAccount()); initTargetFolder(); populateDirectoryList(null); } @@ -734,7 +734,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { // there is no need for checking for is there more then one // account at this point // since account setup can set only one account at time - setAccount(accounts[0], false); + setAccount(accounts[0]); populateDirectoryList(null); } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/drawer/DrawerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/drawer/DrawerActivity.kt index 8f16eda75bee..e6320506f420 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/drawer/DrawerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/drawer/DrawerActivity.kt @@ -424,7 +424,7 @@ abstract class DrawerActivity : if (!data.getBooleanExtra(ManageAccountsActivity.KEY_ACCOUNT_LIST_CHANGED, false)) return if (!data.getBooleanExtra(ManageAccountsActivity.KEY_CURRENT_ACCOUNT_CHANGED, false)) return - setAccount(userAccountManager.currentAccount, false) + setAccount(userAccountManager.currentAccount) restart() } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/drawer/externallinks/ExternalLinksSynchronizer.kt b/app/src/main/java/com/owncloud/android/ui/activity/drawer/externallinks/ExternalLinksSynchronizer.kt index a0974e1dd1d0..9acacdad47a4 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/drawer/externallinks/ExternalLinksSynchronizer.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/drawer/externallinks/ExternalLinksSynchronizer.kt @@ -35,14 +35,11 @@ class ExternalLinksSynchronizer( private fun refreshCapabilities() { val capability = activity.capabilities.getOrNull() ?: return if (capability.accountName?.isEmpty() == true) return - val storageManager = activity.storageManager ?: return - GetCapabilitiesOperation(storageManager).execute(activity.baseContext) + GetCapabilitiesOperation(activity.getStorageManager()).execute(activity.baseContext) } private fun syncExternalLinks(user: User, force: Boolean) { - val isExternalLinksEnabled = - activity.storageManager != null && CapabilityUtils.getCapability(user, activity).externalLinks.isTrue - if (!isExternalLinksEnabled) { + if (!CapabilityUtils.getCapability(user, activity).externalLinks.isTrue) { externalLinksProvider.deleteAllExternalLinks() Log_OC.d(TAG, "links disabled") return diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/helper/UploadListAdapterHelper.kt b/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/helper/UploadListAdapterHelper.kt index d90ba0eb1883..9976d5acb2e9 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/helper/UploadListAdapterHelper.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/helper/UploadListAdapterHelper.kt @@ -56,7 +56,7 @@ class UploadListAdapterHelper(private val activity: DrawerActivity) { } fun onUploadedItemClick(upload: OCUpload) { - val file = activity.storageManager.getFileByEncryptedRemotePath(upload.remotePath) + val file = activity.getStorageManager().getFileByEncryptedRemotePath(upload.remotePath) if (file == null) { SnackbarUtil.show(activity, R.string.error_retrieving_file) Log_OC.i(TAG, "Could not find uploaded file on remote.") diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListConflictHandler.kt b/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListConflictHandler.kt index c2e594e842bc..cd4bc4c3335d 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListConflictHandler.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListConflictHandler.kt @@ -81,7 +81,7 @@ class UploadListConflictHandler( fragment.lifecycleScope.launch(Dispatchers.IO) { val client = activity.clientRepository.getOwncloudClient() - val file = activity.storageManager.getFileByPath(upload.remotePath) + val file = activity.getStorageManager().getFileByPath(upload.remotePath) val parentPath = (file?.parentRemotePath ?: upload.remotePath?.webDavParentPath()) parentPath?.let { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListFragment.kt index 74306573276b..ee4d5d289442 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListFragment.kt @@ -215,7 +215,7 @@ class UploadListFragment : val adapterHelper = UploadListAdapterHelper(activity) uploadListAdapter = UploadListAdapter( activity, - activity.storageManager, + activity.getStorageManager(), uploadsStorageManager, userAccountManager, connectivityService, diff --git a/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaActivity.kt index 0e40d9a31346..4e6d225d619b 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaActivity.kt @@ -41,7 +41,6 @@ import com.nextcloud.client.player.model.file.PlaybackCollection import com.nextcloud.client.player.model.file.toPlaybackCollection import com.nextcloud.client.player.ui.MediaNavigator import com.nextcloud.client.player.ui.VideoPictureInPicture -import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.utils.SnackbarUtil import com.nextcloud.utils.extensions.getParcelableArgument import com.nextcloud.utils.extensions.getSerializableArgument @@ -115,9 +114,6 @@ class PreviewMediaActivity : private var wasActionBarVisibleBeforePictureInPicture = true private var keepPlaybackOnFinish = false - @Inject - lateinit var preferences: AppPreferences - @Inject lateinit var localBroadcastManager: LocalBroadcastManager diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinFragment.kt b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinFragment.kt index bde190d61579..3971b743f22b 100644 --- a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinFragment.kt @@ -149,7 +149,7 @@ class TrashbinFragment : trashbinListAdapter = TrashbinListAdapter( this, - navigatorActivity?.storageManager, + navigatorActivity?.getStorageManager(), preferences, syncedFolderProvider, requireContext(), diff --git a/app/src/test/java/com/nextcloud/client/preferences/TestAppPreferences.java b/app/src/test/java/com/nextcloud/client/preferences/TestAppPreferences.java index 93ca59a610c4..321038ebc437 100644 --- a/app/src/test/java/com/nextcloud/client/preferences/TestAppPreferences.java +++ b/app/src/test/java/com/nextcloud/client/preferences/TestAppPreferences.java @@ -22,108 +22,15 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(Suite.class) @Suite.SuiteClasses({ - TestAppPreferences.Preferences.class, - TestAppPreferences.ListenerRegistery.class + TestAppPreferences.Preferences.class }) public class TestAppPreferences { - public static class ListenerRegistery { - private static final SharedPreferences NOT_USED_NULL = null; - - @Mock - private AppPreferences.Listener listener1; - - @Mock - private AppPreferences.Listener listener2; - - @Mock - private AppPreferences.Listener listener3; - - @Mock - private AppPreferences.Listener listener4; - - @Mock - AppPreferences appPreferences; - - private AppPreferencesImpl.ListenerRegistry registry; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - when(appPreferences.getDarkThemeMode()).thenReturn(DarkMode.DARK); - registry = new AppPreferencesImpl.ListenerRegistry(appPreferences); - } - - @Test - public void canRemoveListenersFromCallback() { - - // GIVEN - // registery has few listeners - // one listener will try to remove itself and other listener - registry.add(listener1); - registry.add(listener2); - registry.add(listener3); - registry.add(listener4); - - doAnswer((i) -> { - registry.remove(listener2); - registry.remove(listener3); - return null; - }).when(listener2).onDarkThemeModeChanged(DarkMode.DARK); - - // WHEN - // callback is called twice - registry.onSharedPreferenceChanged(NOT_USED_NULL, AppPreferencesImpl.PREF__DARK_THEME); - registry.onSharedPreferenceChanged(NOT_USED_NULL, AppPreferencesImpl.PREF__DARK_THEME); - - // THEN - // no ConcurrentModificationException - // 1st time, all listeners (including removed) are called - // 2nd time removed callbacks are not called - verify(listener1, times(2)).onDarkThemeModeChanged(DarkMode.DARK); - verify(listener2).onDarkThemeModeChanged(DarkMode.DARK); - verify(listener3).onDarkThemeModeChanged(DarkMode.DARK); - verify(listener4, times(2)).onDarkThemeModeChanged(DarkMode.DARK); - } - - @Test - public void nullsAreNotAddedToRegistry() { - // GIVEN - // registry has no listeners - // attempt to add null listener was made - registry.add(null); - - // WHEN - // callback is called - registry.onSharedPreferenceChanged(NOT_USED_NULL, AppPreferencesImpl.PREF__DARK_THEME); - - // THEN - // nothing happens - // null was not added to registry - } - - @Test - public void nullsAreNotRemovedFromRegistry() { - // GIVEN - // registry has no listeners - - // WHEN - // attempt to remove null listener was made - registry.remove(null); - - // THEN - // null is ignored - } - } - public static class Preferences { @Mock private Context testContext;