diff --git a/app/src/main/java/com/nextcloud/client/di/ThemeModule.kt b/app/src/main/java/com/nextcloud/client/di/ThemeModule.kt index 99a32ad0be83..e4366cf0e67a 100644 --- a/app/src/main/java/com/nextcloud/client/di/ThemeModule.kt +++ b/app/src/main/java/com/nextcloud/client/di/ThemeModule.kt @@ -10,7 +10,6 @@ package com.nextcloud.client.di import com.nextcloud.android.common.ui.theme.MaterialSchemes import com.owncloud.android.utils.theme.MaterialSchemesProvider import com.owncloud.android.utils.theme.MaterialSchemesProviderImpl -import com.owncloud.android.utils.theme.ThemeColorUtils import com.owncloud.android.utils.theme.ThemeUtils import dagger.Binds import dagger.Module @@ -25,10 +24,6 @@ internal abstract class ThemeModule { companion object { - @Provides - @Singleton - fun themeColorUtils(): ThemeColorUtils = ThemeColorUtils() - @Provides @Singleton fun themeUtils(): ThemeUtils = ThemeUtils() diff --git a/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt b/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt index 7424948cae90..a545cee8acc4 100644 --- a/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt +++ b/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt @@ -24,7 +24,7 @@ import com.owncloud.android.R import com.owncloud.android.databinding.ActivityDocumentScanBinding import com.owncloud.android.databinding.DialogScanExportTypeBinding import com.owncloud.android.ui.activity.ToolbarActivity -import com.owncloud.android.utils.theme.ViewThemeUtils +import com.owncloud.android.ui.navigation.model.ActionBarStyle import javax.inject.Inject class DocumentScanActivity : @@ -37,9 +37,6 @@ class DocumentScanActivity : @Inject lateinit var logger: Logger - @Inject - lateinit var viewThemeUtils: ViewThemeUtils - @Inject lateinit var appScanOptionalFeature: AppScanOptionalFeature @@ -71,7 +68,7 @@ class DocumentScanActivity : binding = ActivityDocumentScanBinding.inflate(layoutInflater) setContentView(binding.root) - setupToolbar() + showActionBar(ActionBarStyle.Plain) supportActionBar?.let { it.setDisplayHomeAsUpEnabled(true) it.setDisplayShowHomeEnabled(true) diff --git a/app/src/main/java/com/nextcloud/client/etm/EtmActivity.kt b/app/src/main/java/com/nextcloud/client/etm/EtmActivity.kt index 9e3f41039989..320790a5f64e 100644 --- a/app/src/main/java/com/nextcloud/client/etm/EtmActivity.kt +++ b/app/src/main/java/com/nextcloud/client/etm/EtmActivity.kt @@ -17,6 +17,7 @@ import com.nextcloud.client.di.Injectable import com.nextcloud.client.di.ViewModelFactory import com.owncloud.android.R import com.owncloud.android.ui.activity.ToolbarActivity +import com.owncloud.android.ui.navigation.model.ActionBarStyle import javax.inject.Inject class EtmActivity : @@ -38,8 +39,8 @@ class EtmActivity : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_etm) - setupToolbar() - updateActionBarTitleAndHomeButtonByString(getString(R.string.etm_title)) + showActionBar(ActionBarStyle.Plain) + setActionBarTitle(getString(R.string.etm_title)) vm = ViewModelProvider(this, viewModelFactory).get(EtmViewModel::class.java) vm.currentPage.observe( this, @@ -80,12 +81,12 @@ class EtmActivity : supportFragmentManager.beginTransaction() .replace(R.id.etm_page_container, fragment) .commit() - updateActionBarTitleAndHomeButtonByString("ETM - ${getString(page.titleRes)}") + setActionBarTitle("ETM - ${getString(page.titleRes)}") } else { supportFragmentManager.beginTransaction() .replace(R.id.etm_page_container, EtmMenuFragment()) .commitNow() - updateActionBarTitleAndHomeButtonByString(getString(R.string.etm_title)) + setActionBarTitle(getString(R.string.etm_title)) } } } diff --git a/app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt b/app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt index e61d016abdfc..3740299e6961 100644 --- a/app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt +++ b/app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt @@ -18,6 +18,7 @@ import com.nextcloud.client.di.ViewModelFactory import com.owncloud.android.R import com.owncloud.android.databinding.LogsActivityBinding import com.owncloud.android.ui.activity.ToolbarActivity +import com.owncloud.android.ui.navigation.model.ActionBarStyle import javax.inject.Inject class LogsActivity : ToolbarActivity() { @@ -60,7 +61,7 @@ class LogsActivity : ToolbarActivity() { vm.status.observe(this) { binding.logsStatus.text = it } vm.load() - setupToolbar() + showActionBar(ActionBarStyle.Plain) supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.let { diff --git a/app/src/main/java/com/nextcloud/client/systembars/SystemBarBackgroundCallbacks.kt b/app/src/main/java/com/nextcloud/client/systembars/SystemBarBackgroundCallbacks.kt index 1f2fd258b023..6f309d474e85 100644 --- a/app/src/main/java/com/nextcloud/client/systembars/SystemBarBackgroundCallbacks.kt +++ b/app/src/main/java/com/nextcloud/client/systembars/SystemBarBackgroundCallbacks.kt @@ -62,7 +62,7 @@ class SystemBarBackgroundCallbacks(private val viewThemeUtilsProvider: Provider< @ColorInt private fun statusBarColor(activity: Activity, @ColorInt actionBarColor: Int): Int { - if (activity is ToolbarActivity && activity.isHomeSearchToolbarVisible) { + if (activity is ToolbarActivity && activity.isSearchActionBarVisible) { return ContextCompat.getColor(activity, R.color.bg_default) } diff --git a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt index 6afc23a55fa8..d6108fbd76be 100644 --- a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt +++ b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt @@ -91,7 +91,7 @@ class ComposeActivity : DrawerActivity() { private fun setupActivityUIFor(destination: ComposeDestination) { if (destination is ComposeDestination.AssistantScreen) { setupDrawer(menuItemId) - setupToolbarShowOnlyMenuButtonAndTitle(destination.title) { + showMenuAndTitleActionBar(destination.title) { openDrawer() } } else { diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt index 95acef0970ef..800fbeb9c9dd 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt @@ -12,13 +12,14 @@ import com.owncloud.android.MainApp import com.owncloud.android.R import com.owncloud.android.ui.activity.DrawerActivity import com.owncloud.android.ui.activity.FileDisplayActivity +import com.owncloud.android.ui.navigation.model.ActionBarStyle @JvmOverloads fun DrawerActivity.navigateToAllFiles(onlyPersonal: Boolean = false) { MainApp.showOnlyFilesOnDevice(false) MainApp.showOnlyPersonalFiles(onlyPersonal) highlightNavigationViewItem(R.id.nav_all_files) - setupHomeSearchToolbarWithSortAndListButtons() + showActionBar(ActionBarStyle.Search) Intent(applicationContext, FileDisplayActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/AlbumsPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/AlbumsPickerActivity.kt index 52562d890619..f60d598d29df 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/AlbumsPickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/AlbumsPickerActivity.kt @@ -29,6 +29,7 @@ import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.ui.fragment.GalleryFragment import com.owncloud.android.ui.fragment.OCFileListFragment import com.owncloud.android.ui.fragment.albums.AlbumsFragment +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.utils.ErrorMessageAdapter class AlbumsPickerActivity : @@ -57,7 +58,7 @@ class AlbumsPickerActivity : super.onCreate(savedInstanceState) initBinding() - setupToolbar() + showActionBar(ActionBarStyle.Plain) setupAction() setupActionBar() initExtras() @@ -66,7 +67,7 @@ class AlbumsPickerActivity : createFragments() } - updateActionBarTitleAndHomeButtonByString(captionText) + setActionBarTitle(captionText) } private fun setupActionBar() { diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java index 0811c5dbfbad..15f27b5c2eb6 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java @@ -21,6 +21,7 @@ import com.owncloud.android.ui.fragment.contactsbackup.BackupFragment; import com.owncloud.android.ui.fragment.contactsbackup.BackupListFragment; +import com.owncloud.android.ui.navigation.model.ActionBarStyle; import javax.inject.Inject; import androidx.activity.OnBackPressedCallback; @@ -69,7 +70,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.contacts_preference); // setup toolbar - setupToolbar(); + showActionBar(ActionBarStyle.Plain); // setup drawer //setupDrawer(R.id.nav_contacts); // TODO needed? diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 20c0a8933a3e..1c5f1731084d 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -12,6 +12,7 @@ */ package com.owncloud.android.ui.activity; +import android.accounts.Account; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.content.Context; @@ -50,7 +51,9 @@ import com.google.android.material.progressindicator.LinearProgressIndicator; import com.nextcloud.android.common.core.utils.ecosystem.EcosystemApp; import com.nextcloud.android.common.core.utils.ecosystem.EcosystemManager; +import com.nextcloud.android.common.ui.color.ColorUtil; import com.nextcloud.android.common.ui.theme.utils.ColorRole; +import com.nextcloud.android.common.ui.util.PlatformThemeUtil; import com.nextcloud.client.account.User; import com.nextcloud.client.di.Injectable; import com.nextcloud.client.files.DeepLinkConstants; @@ -106,6 +109,7 @@ import com.owncloud.android.ui.fragment.albums.AlbumsFragment; import com.owncloud.android.ui.navigation.NavigatorActivity; import com.owncloud.android.ui.navigation.NavigatorScreen; +import com.owncloud.android.ui.navigation.model.ActionBarStyle; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.DrawableUtil; import com.owncloud.android.utils.DrawerMenuUtil; @@ -244,6 +248,9 @@ protected int getMenuItemId() { @Inject public AvatarGenerator avatarGenerator; + @Inject + ColorUtil colorUtil; + @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); @@ -340,7 +347,7 @@ private void checkAssistantBottomNavigationMenu() { private void openFavoritesTab() { resetOnlyPersonalAndOnDevice(); - setupToolbar(); + showActionBar(ActionBarStyle.Plain); SearchEvent searchEvent = new SearchEvent("", SearchRemoteOperation.SearchType.FAVORITE_SEARCH); launchActivityForSearch(searchEvent, R.id.nav_favorites); } @@ -348,7 +355,7 @@ private void openFavoritesTab() { private void openMediaTab(int menuItemId) { GalleryFragment.Companion.clearSavedViewState(); resetOnlyPersonalAndOnDevice(); - setupToolbar(); + showActionBar(ActionBarStyle.Plain); startPhotoSearch(menuItemId); } @@ -417,7 +424,7 @@ public void updateHeader() { if (optionalCapability.isPresent()) { final var capability = optionalCapability.get(); if (account != null && capability.getServerBackground() != null && !isClientBranded) { - int primaryColor = themeColorUtils.unchangedPrimaryColor(account, this); + int primaryColor = getServerPrimaryColor(account); String serverLogoURL = capability.getServerLogo(); // set background to primary color @@ -528,7 +535,7 @@ private void showTopBanner(ConstraintLayout banner) { int iconColor; final var account = getAccount(); if (account != null) { - int primaryColor = themeColorUtils.unchangedPrimaryColor(account, this); + int primaryColor = getServerPrimaryColor(account); if (Hct.fromInt(primaryColor).getTone() < 80.0) { iconColor = Color.WHITE; } else { @@ -559,11 +566,22 @@ private void setDrawerHeaderLogo(Drawable drawable, String serverName) { TextView serverNameView = mNavigationViewHeader.findViewById(R.id.drawer_header_server_name); serverNameView.setVisibility(View.VISIBLE); serverNameView.setText(serverName); - serverNameView.setTextColor(themeColorUtils.unchangedFontColor(this)); + serverNameView.setTextColor(getServerTextColor()); } } + private int getServerPrimaryColor(Account account) { + final var serverColor = CapabilityUtils.getCapability(account, this).getServerColor(); + return colorUtil.getNullSafeColor(serverColor, getColor(R.color.primary)); + } + + private int getServerTextColor() { + final var serverTextColor = CapabilityUtils.getCapability(this).getServerTextColor(); + final int fallbackColor = PlatformThemeUtil.isDarkMode(this) ? Color.WHITE : Color.BLACK; + return colorUtil.getNullSafeColor(serverTextColor, fallbackColor); + } + /** * setup drawer content, basically setting the item selected listener. * diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.kt b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.kt index ab9dd2dc2d43..fbb4689cb40e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.kt @@ -29,6 +29,7 @@ import com.owncloud.android.R import com.owncloud.android.databinding.ExternalsiteWebviewBinding import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.ui.NextcloudWebViewClient +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.utils.ProxyUtil import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import java.lang.ref.WeakReference @@ -99,7 +100,7 @@ open class ExternalSiteWebView : FileActivity() { private fun setupToolbarAndDrawer() { if (showToolbar) { - setupToolbar() + showActionBar(ActionBarStyle.Plain) } else { findViewById(R.id.appbar)?.isVisible = false } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index c009bcf1bd9f..a15055bc6c9a 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -92,6 +92,7 @@ import com.owncloud.android.ui.fragment.filesRepository.RemoteFilesRepository; import com.owncloud.android.ui.helpers.CredentialsUpdateHelper; import com.owncloud.android.ui.helpers.FileOperationsHelper; +import com.owncloud.android.ui.navigation.model.ActionBarStyle; import com.owncloud.android.ui.preview.media.PreviewMediaActivity; import com.owncloud.android.utils.ClipboardUtil; import com.owncloud.android.utils.ErrorMessageAdapter; @@ -192,9 +193,9 @@ public void showFiles(boolean onDeviceOnly, boolean personalFiles) { MainApp.showOnlyFilesOnDevice(onDeviceOnly); MainApp.showOnlyPersonalFiles(personalFiles); if (onDeviceOnly) { - setupToolbar(); + showActionBar(ActionBarStyle.Plain); } else { - setupHomeSearchToolbarWithSortAndListButtons(); + showActionBar(ActionBarStyle.Search); } } 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 ff83034b36db..991f623dba03 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 @@ -138,6 +138,7 @@ import com.owncloud.android.ui.fragment.albums.AlbumsFragment import com.owncloud.android.ui.helpers.FileOperationsHelper import com.owncloud.android.ui.navigation.NavigatorScreen import com.owncloud.android.ui.navigation.animator.NavigationAnimator +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.ui.preview.media.PreviewMediaActivity import com.owncloud.android.ui.preview.media.PreviewMediaFragment import com.owncloud.android.ui.preview.pdf.PreviewPdfFragment @@ -354,7 +355,7 @@ class FileDisplayActivity : } if (isToolbarStyleSearch) { - setupHomeSearchToolbarWithSortAndListButtons() + showActionBar(ActionBarStyle.Search) } syncCurrentFolder(ignoreETag = true, ignoreFocus = true) refreshFileListOnResume(currentLeftFragment, listFragmentJustCreated) @@ -389,7 +390,7 @@ class FileDisplayActivity : putParcelable(KEY_WAITING_TO_SEND, waitingToSend) searchView?.let { putBoolean(KEY_IS_SEARCH_OPEN, !it.isIconified) } putString(KEY_SEARCH_QUERY, searchQuery) - putBoolean(KEY_IS_SORT_GROUP_VISIBLE, sortListGroupVisibility()) + putBoolean(KEY_IS_SORT_GROUP_VISIBLE, isSortListGroupVisible) } } @@ -444,11 +445,11 @@ class FileDisplayActivity : } private fun setupViews() { - setupHomeSearchToolbarWithSortAndListButtons() - mMenuButton.setOnClickListener { openDrawer() } + showActionBar(ActionBarStyle.Search) + menuButton.setOnClickListener { openDrawer() } findViewById(R.id.toolbar).setOnClickListener { openCurrentFolderActions() } - mSwitchAccountButton.setOnClickListener { showManageAccountsDialog() } - mNotificationButton.setOnClickListener { pushFragment(NavigatorScreen.Notifications) } + switchAccountButton.setOnClickListener { showManageAccountsDialog() } + notificationButton.setOnClickListener { pushFragment(NavigatorScreen.Notifications) } fastScrollUtils.fixAppBarForFastScroll(binding.appbar.appbar, binding.rootLayout) listOfFilesFragment?.resetSearchAttributes() } @@ -504,7 +505,7 @@ class FileDisplayActivity : val result = GetNotificationsRemoteOperation().execute(client) result.isSuccess && result.resultData?.isEmpty() == false } - mNotificationButton.setVisibleIf(hasNotifications) + notificationButton.setVisibleIf(hasNotifications) } } @@ -560,13 +561,13 @@ class FileDisplayActivity : setFile(initialFile) val accountName = currentUser.accountName - mSwitchAccountButton.tag = accountName + switchAccountButton.tag = accountName avatarGenerator.setAccountAvatar( currentUser, this, resources.getDimension(R.dimen.nav_drawer_menu_avatar_radius), - mSwitchAccountButton + switchAccountButton ) if (accountName != lastDisplayedAccountName) { @@ -1204,7 +1205,7 @@ class FileDisplayActivity : val searchMenuItem = menu.findItem(R.id.action_search) searchView = searchMenuItem.actionView as? SearchView searchMenuItem.isVisible = false - mSearchText.setOnClickListener { + searchText.setOnClickListener { showSearchView() searchView?.postDelayed({ searchView?.isIconified = false diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt index 9abf7924e82a..06a65f6f1aa5 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt @@ -47,6 +47,7 @@ import com.owncloud.android.ui.events.SearchEvent import com.owncloud.android.ui.fragment.EmptyListState import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.ui.fragment.OCFileListFragment +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.utils.DataHolderUtil import com.owncloud.android.utils.ErrorMessageAdapter import com.owncloud.android.utils.FileSortOrder @@ -98,7 +99,7 @@ open class FolderPickerActivity : initBinding() initControls() - setupToolbar() + showActionBar(ActionBarStyle.Plain) setupActionBar() setupAction() initTargetFilesPath() @@ -107,7 +108,7 @@ open class FolderPickerActivity : createFragments() } - updateActionBarTitleAndHomeButtonByString(captionText) + setActionBarTitle(captionText) handleBackPress() } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt index eb831c871e13..47a32e0b150d 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt @@ -28,6 +28,7 @@ import com.owncloud.android.R import com.owncloud.android.databinding.InternalTwoWaySyncLayoutBinding import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.ui.adapter.InternalTwoWaySyncAdapter +import com.owncloud.android.ui.navigation.model.ActionBarStyle import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -58,7 +59,7 @@ class InternalTwoWaySyncActivity : binding = InternalTwoWaySyncLayoutBinding.inflate(layoutInflater) setContentView(binding.root) - setupToolbar() + showActionBar(ActionBarStyle.Plain) setupActionBar() setupTwoWaySyncAdapter() setupEmptyList() @@ -68,7 +69,7 @@ class InternalTwoWaySyncActivity : } private fun setupActionBar() { - updateActionBarTitleAndHomeButtonByString(getString(R.string.two_way_sync_activity_title)) + setActionBarTitle(getString(R.string.two_way_sync_activity_title)) supportActionBar?.setDisplayHomeAsUpEnabled(true) } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt index 8e77bdd26a6b..3660d64b59fe 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt @@ -53,6 +53,7 @@ import com.owncloud.android.ui.adapter.UserListItem import com.owncloud.android.ui.dialog.AccountRemovalDialog.Companion.newInstance import com.owncloud.android.ui.events.AccountRemovedEvent import com.owncloud.android.ui.helpers.FileOperationsHelper +import com.owncloud.android.ui.navigation.model.ActionBarStyle import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import javax.inject.Inject @@ -85,7 +86,7 @@ class ManageAccountsActivity : setContentView(R.layout.accounts_layout) - setupToolbar() + showActionBar(ActionBarStyle.Plain) setupActionBar() setupUsers() 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 aa90fbe4d512..1aaa3caf3da8 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 @@ -87,6 +87,7 @@ import com.owncloud.android.ui.fragment.TaskRetainerFragment; import com.owncloud.android.ui.helpers.FileOperationsHelper; import com.owncloud.android.ui.helpers.UriUploader; +import com.owncloud.android.ui.navigation.model.ActionBarStyle; import com.owncloud.android.utils.DataHolderUtil; import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.FileSortOrder; @@ -751,7 +752,7 @@ private void setupActionBarSubtitle() { private void populateDirectoryList(OCFile file) { setupEmptyList(); - setupToolbar(); + showActionBar(ActionBarStyle.Plain); ActionBar actionBar = getSupportActionBar(); setupActionBarSubtitle(); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java deleted file mode 100644 index 1d0c1d3a182f..000000000000 --- a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 ZetaTom - * SPDX-FileCopyrightText: 2023 Parneet Singh - * SPDX-FileCopyrightText: 2022 Brey Álvaro Brey - * SPDX-FileCopyrightText: 2022 TSI-mc - * SPDX-FileCopyrightText: 2020 Joris Bodin - * SPDX-FileCopyrightText: 2016-2022 Andy Scherzinger - * SPDX-FileCopyrightText: 2018-2022 Tobias Kaminsky - * SPDX-FileCopyrightText: 2016 Nextcloud - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -package com.owncloud.android.ui.activity; - -import android.animation.AnimatorInflater; -import android.annotation.SuppressLint; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.google.android.material.appbar.AppBarLayout; -import com.google.android.material.appbar.MaterialToolbar; -import com.google.android.material.button.MaterialButton; -import com.google.android.material.card.MaterialCardView; -import com.google.android.material.textview.MaterialTextView; -import com.nextcloud.android.common.ui.theme.utils.ColorRole; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.systembars.SystemBarBackgroundCallbacks; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.datamodel.OCFileDepth; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.fragment.OCFileListFragment; -import com.owncloud.android.ui.fragment.SearchType; -import com.owncloud.android.utils.theme.ThemeColorUtils; -import com.owncloud.android.utils.theme.ThemeUtils; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.AppCompatSpinner; -import androidx.core.content.ContextCompat; - -/** - * Base class providing toolbar registration functionality, see {@link #setupToolbar(boolean, boolean)}. - */ -public abstract class ToolbarActivity extends BaseActivity implements Injectable { - protected MaterialButton mMenuButton; - protected MaterialTextView mSearchText; - protected MaterialButton mSwitchAccountButton; - protected MaterialButton mNotificationButton; - - private AppBarLayout mAppBar; - private RelativeLayout mDefaultToolbar; - private MaterialToolbar mToolbar; - private MaterialCardView mHomeSearchContainer; - private LinearLayout mHomeSearchToolbar; - private ImageView mPreviewImage; - private FrameLayout mPreviewImageContainer; - private LinearLayout mInfoBox; - private TextView mInfoBoxMessage; - protected AppCompatSpinner mToolbarSpinner; - private boolean isHomeSearchToolbarShow = false; - private static final String TAG = "ToolbarActivity"; - - @Inject public ThemeColorUtils themeColorUtils; - @Inject public ThemeUtils themeUtils; - @Inject public ViewThemeUtils viewThemeUtils; - - /** - * Toolbar setup that must be called in implementer's {@link #onCreate} after {@link #setContentView} if they want - * to use the toolbar. - */ - private void setupToolbar(boolean isHomeSearchToolbarShow, boolean showSortListButtonGroup) { - mToolbar = findViewById(R.id.toolbar); - setSupportActionBar(mToolbar); - - mAppBar = findViewById(R.id.appbar); - mDefaultToolbar = findViewById(R.id.default_toolbar); - mHomeSearchToolbar = findViewById(R.id.home_toolbar); - mHomeSearchContainer = findViewById(R.id.home_search_container); - mMenuButton = findViewById(R.id.menu_button); - mSearchText = findViewById(R.id.search_text); - mSwitchAccountButton = findViewById(R.id.switch_account_button); - mNotificationButton = findViewById(R.id.notification_button); - - if (showSortListButtonGroup) { - findViewById(R.id.sort_list_button_group).setVisibility(View.VISIBLE); - } - - this.isHomeSearchToolbarShow = isHomeSearchToolbarShow; - updateActionBarTitleAndHomeButton(null); - - mInfoBox = findViewById(R.id.info_box); - mInfoBoxMessage = findViewById(R.id.info_box_message); - - mPreviewImage = findViewById(R.id.preview_image); - mPreviewImageContainer = findViewById(R.id.preview_image_frame); - - mToolbarSpinner = findViewById(R.id.toolbar_spinner); - - viewThemeUtils.material.themeToolbar(mToolbar); - viewThemeUtils.material.colorToolbarOverflowIcon(mToolbar); - viewThemeUtils.platform.themeStatusBar(this); - viewThemeUtils.material.colorMaterialTextButton(mSwitchAccountButton); - - viewThemeUtils.material.themeSearchCardView(mHomeSearchContainer); - viewThemeUtils.material.colorMaterialButtonContent(mMenuButton, ColorRole.ON_SURFACE); - viewThemeUtils.material.colorMaterialButtonContent(mNotificationButton, ColorRole.ON_SURFACE); - viewThemeUtils.platform.colorTextView(mSearchText, ColorRole.ON_SURFACE_VARIANT); - } - - public void setupToolbarShowOnlyMenuButtonAndTitle(String title, View.OnClickListener toggleDrawer) { - setupToolbar(false, false); - - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayShowTitleEnabled(false); - } - - LinearLayout toolbar = findViewById(R.id.toolbar_linear_layout); - MaterialButton menuButton = findViewById(R.id.toolbar_menu_button); - MaterialTextView titleTextView = findViewById(R.id.toolbar_title); - titleTextView.setText(title); - - titleTextView.setTextColor(ContextCompat.getColor(this, R.color.foreground_highlight)); - menuButton.setIconTint(ContextCompat.getColorStateList(this, R.color.foreground_highlight)); - - toolbar.setVisibility(View.VISIBLE); - menuButton.setOnClickListener(toggleDrawer); - } - - /** - * Shows plain action bar - */ - public void setupToolbar() { - if (mHomeSearchToolbar != null && mDefaultToolbar != null && mHomeSearchToolbar.getVisibility() == View.GONE && mDefaultToolbar.getVisibility() == View.VISIBLE) { - Log_OC.d(TAG, "Search toolbar is already hidden, skipping update."); - return; - } - - setupToolbar(false, false); - } - - /** - * Shows action bar with search - */ - public void setupHomeSearchToolbarWithSortAndListButtons() { - if (mHomeSearchToolbar != null && mDefaultToolbar != null && mHomeSearchToolbar.getVisibility() == View.VISIBLE && mDefaultToolbar.getVisibility() == View.GONE) { - Log_OC.d(TAG, "Search toolbar is already visible, skipping update."); - return; - } - - setupToolbar(true, true); - } - - private OCFileListFragment getOCFileListFragment() { - if (this instanceof FileDisplayActivity fda) { - return fda.getListOfFilesFragment(); - } - - return null; - } - - private OCFileDepth getCurrentDirDepth() { - OCFileListFragment fragment = getOCFileListFragment(); - if (fragment != null) { - return fragment.getFileDepth(); - } - - return null; - } - - private SearchType getSearchType() { - final OCFileListFragment fragment = getOCFileListFragment(); - if (fragment != null) { - return fragment.getCurrentSearchType(); - } - return SearchType.NO_SEARCH; - } - - public String getActionBarRootTitle() { - final SearchType searchType = getSearchType(); - Integer rootTitleId = searchType.titleId(); - String result = themeUtils.getDefaultDisplayNameForRootFolder(this); - - if (rootTitleId != null) { - result = getString(rootTitleId); - } - - return result; - } - - public String getActionBarTitle(OCFile chosenFile, boolean isRoot) { - if (isRoot) { - return getActionBarRootTitle(); - } - - return getActionBarTitleFromFile(chosenFile); - } - - private String getActionBarTitleFromFile(OCFile file) { - // if offline rename operation already pointing same file, offline operation name will be used - return fileDataStorageManager.getFilenameConsideringOfflineOperation(file); - } - - protected void updateActionBarTitleAndHomeButton(OCFile file) { - final OCFileDepth currentDirDepth = getCurrentDirDepth(); - final boolean isRoot = isRoot(file) || currentDirDepth == OCFileDepth.Root; - final String title = getActionBarTitle(file, isRoot); - updateActionBarTitleAndHomeButtonByString(title); - - boolean isToolbarStyleSearch = false; - if (this instanceof DrawerActivity drawerActivity) { - isToolbarStyleSearch = drawerActivity.isToolbarStyleSearch(); - } - final boolean canShowSearchBar = (isHomeSearchToolbarShow && isRoot && isToolbarStyleSearch); - - showHomeSearchToolbar(canShowSearchBar); - - if (mSearchText != null) { - mSearchText.setText(getString(R.string.appbar_search_in, title)); - } - - final var actionBar = getSupportActionBar(); - if (actionBar != null) { - viewThemeUtils.files.themeActionBar(this, actionBar, title, isRoot); - } - } - - protected void updateActionBarForFile(@Nullable OCFile file) { - if (file == null) { - return; - } - - final String title = getActionBarTitleFromFile(file); - updateActionBarTitleAndHomeButtonByString(title); - - showHomeSearchToolbar(false); - final var actionBar = getSupportActionBar(); - if (actionBar != null) { - viewThemeUtils.files.themeActionBar(this, actionBar, title, false); - } - } - - public void showSearchView() { - if (isHomeSearchToolbarShow) { - showHomeSearchToolbar(false); - } - } - - public void hideSearchView(OCFile chosenFile) { - if (isHomeSearchToolbarShow) { - showHomeSearchToolbar(isRoot(chosenFile)); - } - } - - @SuppressLint("PrivateResource") - private void showHomeSearchToolbar(boolean isShow) { - if (mAppBar == null) { - return; - } - - viewThemeUtils.material.themeToolbar(mToolbar); - - if (isShow) { - viewThemeUtils.platform.resetStatusBar(this); - mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(), - R.animator.appbar_elevation_off)); - mDefaultToolbar.setVisibility(View.GONE); - mHomeSearchToolbar.setVisibility(View.VISIBLE); - viewThemeUtils.material.themeSearchCardView(mHomeSearchContainer); - viewThemeUtils.material.themeSearchBarText(mSearchText); - } else { - mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(), - R.animator.appbar_elevation_on)); - viewThemeUtils.platform.themeStatusBar(this); - mDefaultToolbar.setVisibility(View.VISIBLE); - mHomeSearchToolbar.setVisibility(View.GONE); - } - - SystemBarBackgroundCallbacks.apply(this, viewThemeUtils); - } - - public boolean isHomeSearchToolbarVisible() { - return mHomeSearchToolbar != null && mHomeSearchToolbar.getVisibility() == View.VISIBLE; - } - - /** - * Updates title bar and home buttons (state and icon). - */ - public void updateActionBarTitleAndHomeButtonByString(String title) { - // set & color the chosen title - ActionBar actionBar = getSupportActionBar(); - - // set home button properties - if (actionBar != null) { - if (title != null) { - actionBar.setTitle(title); - actionBar.setDisplayShowTitleEnabled(true); - } else { - actionBar.setDisplayShowTitleEnabled(false); - } - } - } - - /** - * checks if the given file is the root folder. - * - * @param file file to be checked if it is the root folder - * @return true if it is null or the root folder, else returns false - */ - public boolean isRoot(OCFile file) { - - return file == null || (file.isFolder() && file.getParentId() == FileDataStorageManager.ROOT_PARENT_ID); - } - - /** - * shows the toolbar's info box with the given text. - * - * @param text the text to be displayed - */ - protected final void showInfoBox(@StringRes int text) { - if (mInfoBox != null && mInfoBoxMessage != null) { - mInfoBox.setVisibility(View.VISIBLE); - mInfoBoxMessage.setText(text); - } - } - - /** - * Hides the toolbar's info box. - */ - public final void hideInfoBox() { - if (mInfoBox != null) { - mInfoBox.setVisibility(View.GONE); - } - } - - public void setPreviewImageVisibility(boolean isVisibility) { - if (mPreviewImageContainer != null) { - mPreviewImageContainer.setVisibility(isVisibility ? View.VISIBLE : View.GONE); - } - } - - public void hidePreviewImage() { - setPreviewImageVisibility(false); - } - - public void showSortListGroup(boolean show) { - final var view = findViewById(R.id.sort_list_button_group); - if (view == null) { - return; - } - - view.setVisibility(show ? View.VISIBLE : View.GONE); - } - - public boolean sortListGroupVisibility(){ - final var view = findViewById(R.id.sort_list_button_group); - if (view == null) { - return false; - } - - return view.getVisibility() == View.VISIBLE; - } - /** - * get the toolbar's preview image view. - */ - public ImageView getPreviewImageView() { - return mPreviewImage; - } - - public void updateToolbarSubtitle(@NonNull String subtitle) { - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setSubtitle(subtitle); - viewThemeUtils.androidx.themeActionBarSubtitle(this, actionBar); - } - } - - public void clearToolbarSubtitle() { - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setSubtitle(null); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.kt new file mode 100644 index 000000000000..3a14fc353272 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.kt @@ -0,0 +1,295 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +package com.owncloud.android.ui.activity + +import android.animation.AnimatorInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.annotation.AnimatorRes +import androidx.annotation.StringRes +import androidx.appcompat.widget.AppCompatSpinner +import androidx.core.content.ContextCompat +import androidx.core.view.isGone +import androidx.core.view.isVisible +import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.appbar.MaterialToolbar +import com.google.android.material.button.MaterialButton +import com.google.android.material.card.MaterialCardView +import com.google.android.material.textview.MaterialTextView +import com.nextcloud.android.common.ui.theme.utils.ColorRole +import com.nextcloud.client.di.Injectable +import com.nextcloud.client.systembars.SystemBarBackgroundCallbacks +import com.owncloud.android.R +import com.owncloud.android.datamodel.FileDataStorageManager +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.datamodel.OCFileDepth +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.ui.fragment.OCFileListFragment +import com.owncloud.android.ui.fragment.SearchType +import com.owncloud.android.ui.navigation.model.ActionBarStyle +import com.owncloud.android.utils.theme.ThemeUtils +import com.owncloud.android.utils.theme.ViewThemeUtils +import javax.inject.Inject + +abstract class ToolbarActivity : + BaseActivity(), + Injectable { + + @Inject + lateinit var themeUtils: ThemeUtils + + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + + protected lateinit var menuButton: MaterialButton + protected lateinit var searchText: MaterialTextView + protected lateinit var switchAccountButton: MaterialButton + protected lateinit var notificationButton: MaterialButton + protected lateinit var toolbarSpinner: AppCompatSpinner + + private lateinit var toolbar: MaterialToolbar + private lateinit var defaultToolbar: RelativeLayout + private lateinit var homeSearchToolbar: LinearLayout + private lateinit var homeSearchContainer: MaterialCardView + + private var appBar: AppBarLayout? = null + var previewImageView: ImageView? = null + private set + private var previewImageContainer: FrameLayout? = null + private var infoBox: LinearLayout? = null + private var infoBoxMessage: TextView? = null + + private var actionBarStyle = ActionBarStyle.Plain + + private val isToolbarBound: Boolean + get() = ::homeSearchToolbar.isInitialized + + // region Action bar setup + fun showActionBar(style: ActionBarStyle) { + if (isActionBarDisplayed(style)) { + Log_OC.d(TAG, "$style action bar is already displayed, skipping update.") + return + } + + configureActionBar(style) + } + + fun showMenuAndTitleActionBar(title: String, onMenuClick: View.OnClickListener) { + configureActionBar(ActionBarStyle.Plain) + supportActionBar?.setDisplayShowTitleEnabled(false) + + val toolbarLayout = findViewById(R.id.toolbar_linear_layout) + val toolbarMenuButton = findViewById(R.id.toolbar_menu_button) + findViewById(R.id.toolbar_title).run { + text = title + setTextColor(ContextCompat.getColor(this@ToolbarActivity, R.color.foreground_highlight)) + } + toolbarMenuButton.iconTint = ContextCompat.getColorStateList(this, R.color.foreground_highlight) + toolbarLayout.isVisible = true + toolbarMenuButton.setOnClickListener(onMenuClick) + } + + private fun isActionBarDisplayed(style: ActionBarStyle): Boolean { + if (!isToolbarBound) return false + val (displayed, hidden) = when (style) { + ActionBarStyle.Plain -> defaultToolbar to homeSearchToolbar + ActionBarStyle.Search -> homeSearchToolbar to defaultToolbar + } + return displayed.isVisible && hidden.isGone + } + + private fun configureActionBar(style: ActionBarStyle) { + toolbar = findViewById(R.id.toolbar) + setSupportActionBar(toolbar) + bindToolbarViews() + + if (style == ActionBarStyle.Search) sortListButtonGroup?.isVisible = true + + actionBarStyle = style + updateActionBarTitleAndHomeButton(null) + + infoBox = findViewById(R.id.info_box) + infoBoxMessage = findViewById(R.id.info_box_message) + previewImageView = findViewById(R.id.preview_image) + previewImageContainer = findViewById(R.id.preview_image_frame) + + themeToolbarViews() + } + + private fun bindToolbarViews() { + appBar = findViewById(R.id.appbar) + defaultToolbar = findViewById(R.id.default_toolbar) + homeSearchToolbar = findViewById(R.id.home_toolbar) + homeSearchContainer = findViewById(R.id.home_search_container) + menuButton = findViewById(R.id.menu_button) + searchText = findViewById(R.id.search_text) + switchAccountButton = findViewById(R.id.switch_account_button) + notificationButton = findViewById(R.id.notification_button) + toolbarSpinner = findViewById(R.id.toolbar_spinner) + } + + private fun themeToolbarViews() { + viewThemeUtils.run { + material.themeToolbar(toolbar) + material.colorToolbarOverflowIcon(toolbar) + platform.themeStatusBar(this@ToolbarActivity) + material.colorMaterialTextButton(switchAccountButton) + material.themeSearchCardView(homeSearchContainer) + material.colorMaterialButtonContent(menuButton, ColorRole.ON_SURFACE) + material.colorMaterialButtonContent(notificationButton, ColorRole.ON_SURFACE) + platform.colorTextView(searchText, ColorRole.ON_SURFACE_VARIANT) + } + } + // endregion + + // region Title and subtitle + private val ocFileListFragment: OCFileListFragment? + get() = (this as? FileDisplayActivity)?.listOfFilesFragment + + private val isCurrentDirRoot: Boolean + get() = ocFileListFragment?.fileDepth == OCFileDepth.Root + + private val searchType: SearchType + get() = ocFileListFragment?.currentSearchType ?: SearchType.NO_SEARCH + + val actionBarRootTitle: String + get() = searchType.titleId()?.let { getString(it) } ?: themeUtils.getDefaultDisplayNameForRootFolder(this) + + fun getActionBarTitle(chosenFile: OCFile, isRoot: Boolean): String = + if (isRoot) actionBarRootTitle else getActionBarTitleFromFile(chosenFile) + + private fun getActionBarTitleFromFile(file: OCFile): String = + fileDataStorageManager.getFilenameConsideringOfflineOperation(file) + + protected open fun updateActionBarTitleAndHomeButton(chosenFile: OCFile?) { + val isRoot = isRoot(chosenFile) || isCurrentDirRoot + val title = chosenFile?.let { getActionBarTitle(it, isRoot) } ?: actionBarRootTitle + setActionBarTitle(title) + + val isToolbarStyleSearch = (this as? DrawerActivity)?.isToolbarStyleSearch == true + val canShowSearchBar = actionBarStyle == ActionBarStyle.Search && isRoot && isToolbarStyleSearch + switchActionBar(if (canShowSearchBar) ActionBarStyle.Search else ActionBarStyle.Plain) + + if (isToolbarBound) searchText.text = getString(R.string.appbar_search_in, title) + + supportActionBar?.let { viewThemeUtils.files.themeActionBar(this, it, title, isRoot) } + } + + protected fun updateActionBarForFile(file: OCFile?) { + if (file == null) return + val title = getActionBarTitleFromFile(file) + setActionBarTitle(title) + switchActionBar(ActionBarStyle.Plain) + supportActionBar?.let { viewThemeUtils.files.themeActionBar(this, it, title, false) } + } + + fun setActionBarTitle(title: String?) { + val actionBar = supportActionBar ?: return + title?.let { actionBar.title = it } + actionBar.setDisplayShowTitleEnabled(title != null) + } + + fun isRoot(file: OCFile?): Boolean = + file == null || (file.isFolder && file.parentId == FileDataStorageManager.ROOT_PARENT_ID.toLong()) + + fun updateToolbarSubtitle(subtitle: String) { + val actionBar = supportActionBar ?: return + actionBar.subtitle = subtitle + viewThemeUtils.androidx.themeActionBarSubtitle(this, actionBar) + } + + fun clearToolbarSubtitle() { + supportActionBar?.subtitle = null + } + // endregion + + // region Search action bar + val isSearchActionBarVisible: Boolean + get() = isToolbarBound && homeSearchToolbar.isVisible + + fun showSearchView() { + if (actionBarStyle != ActionBarStyle.Search) return + switchActionBar(ActionBarStyle.Plain) + } + + fun hideSearchView(chosenFile: OCFile?) { + if (actionBarStyle != ActionBarStyle.Search) return + switchActionBar(if (isRoot(chosenFile)) ActionBarStyle.Search else ActionBarStyle.Plain) + } + + private fun switchActionBar(style: ActionBarStyle) { + val appBar = appBar ?: return + + viewThemeUtils.material.themeToolbar(toolbar) + + when (style) { + ActionBarStyle.Search -> { + viewThemeUtils.platform.resetStatusBar(this) + setAppBarStateListAnimator(appBar, R.animator.appbar_elevation_off) + defaultToolbar.isVisible = false + homeSearchToolbar.isVisible = true + viewThemeUtils.material.themeSearchCardView(homeSearchContainer) + viewThemeUtils.material.themeSearchBarText(searchText) + } + + ActionBarStyle.Plain -> { + setAppBarStateListAnimator(appBar, R.animator.appbar_elevation_on) + viewThemeUtils.platform.themeStatusBar(this) + defaultToolbar.isVisible = true + homeSearchToolbar.isVisible = false + } + } + + SystemBarBackgroundCallbacks.apply(this, viewThemeUtils) + } + + private fun setAppBarStateListAnimator(appBar: AppBarLayout, @AnimatorRes animatorId: Int) { + appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(appBar.context, animatorId) + } + // endregion + + // region Info box + protected fun showInfoBox(@StringRes text: Int) { + val infoBox = infoBox ?: return + val infoBoxMessage = infoBoxMessage ?: return + infoBox.isVisible = true + infoBoxMessage.setText(text) + } + + fun hideInfoBox() { + infoBox?.isVisible = false + } + // endregion + + // region Preview image + fun setPreviewImageVisibility(isVisible: Boolean) { + previewImageContainer?.isVisible = isVisible + } + + fun hidePreviewImage() = setPreviewImageVisibility(false) + // endregion + + // region Sort list group + private val sortListButtonGroup: View? + get() = findViewById(R.id.sort_list_button_group) + + val isSortListGroupVisible: Boolean + get() = sortListButtonGroup?.isVisible == true + + open fun showSortListGroup(show: Boolean) { + sortListButtonGroup?.isVisible = show + } + // endregion + + companion object { + private const val TAG = "ToolbarActivity" + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.kt index 887b474f67b3..4eae09235429 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.kt @@ -50,6 +50,7 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDia import com.owncloud.android.ui.dialog.SortingOrderDialogFragment.OnSortingOrderListener import com.owncloud.android.ui.fragment.localfilelist.LocalFileListFragment import com.owncloud.android.ui.fragment.localfilelist.LocalFileListListener +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.utils.FileSortOrder import com.owncloud.android.utils.PermissionUtil.checkStoragePermission import java.io.File @@ -129,7 +130,7 @@ class UploadFilesActivity : searchView = (menu.findItem(R.id.action_search).actionView as SearchView).also { viewThemeUtils.androidx.themeToolbarSearchView(it) - it.setOnSearchClickListener { mToolbarSpinner.visibility = View.GONE } + it.setOnSearchClickListener { toolbarSpinner.visibility = View.GONE } } menu.findItem(R.id.action_choose_storage_path)?.let { item -> @@ -187,7 +188,7 @@ class UploadFilesActivity : uploadBehaviour = UploadBehaviourSelector(this, binding, preferences).apply { setup(themeUtils.getDefaultDisplayNameForRootFolder(this@UploadFilesActivity)) } - setupToolbar() + showActionBar(ActionBarStyle.Plain) setupActionBar() setupToolbarSpinner() uploadBehaviour.checkWritableFolder(currentDir) @@ -247,15 +248,15 @@ class UploadFilesActivity : } private fun setupToolbarSpinner() { - mToolbarSpinner.visibility = View.VISIBLE - mToolbarSpinner.adapter = directories - mToolbarSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + toolbarSpinner.visibility = View.VISIBLE + toolbarSpinner.adapter = directories + toolbarSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { // Dirs are ordered deepest first, so 0 is current, 1 is parent ... until "/" . // So we must go up by "position" and then set selection to the folder we reached, that is the new 0. repeat(position) { navigateToParentDirectory() } if (position != 0) { - mToolbarSpinner.setSelection(0) + toolbarSpinner.setSelection(0) } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index f830eb7ddc8c..cc5fc52526f3 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -47,6 +47,7 @@ import com.owncloud.android.ui.adapter.UserInfoAdapter; import com.owncloud.android.ui.dialog.AccountRemovalDialog; import com.owncloud.android.ui.events.TokenPushEvent; +import com.owncloud.android.ui.navigation.model.ActionBarStyle; import com.owncloud.android.utils.PushUtils; import org.greenrobot.eventbus.Subscribe; @@ -115,7 +116,7 @@ public void onCreate(Bundle savedInstanceState) { binding = UserInfoLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - setupToolbar(); + showActionBar(ActionBarStyle.Plain); // set the back button from action bar ActionBar actionBar = getSupportActionBar(); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt index 056d570bbbaf..226f799182a0 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt @@ -264,7 +264,7 @@ class GalleryFragment : super.onResume() val fda = getTypedActivity(FileDisplayActivity::class.java) - fda?.updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_gallery)) + fda?.setActionBarTitle(getString(R.string.drawer_item_gallery)) fda?.setMainFabVisible(false) } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GroupfolderListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/GroupfolderListFragment.kt index 4b186ef95806..fce02bdf6af6 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/GroupfolderListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/GroupfolderListFragment.kt @@ -77,7 +77,7 @@ class GroupfolderListFragment : Handler().post { if (activity is FileDisplayActivity) { val fileDisplayActivity = activity as FileDisplayActivity - fileDisplayActivity.updateActionBarTitleAndHomeButtonByString( + fileDisplayActivity.setActionBarTitle( getString(R.string.drawer_item_groupfolders) ) fileDisplayActivity.setMainFabVisible(false) diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt index 01f945d5f4bb..3aed6e84447b 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt @@ -108,6 +108,7 @@ import com.owncloud.android.ui.fragment.FileFragment.ContainerActivity import com.owncloud.android.ui.fragment.helper.ParentFolderFinder import com.owncloud.android.ui.helpers.FileOperationsHelper import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.utils.FileSortOrder import com.owncloud.android.utils.FileStorageUtils import com.owncloud.android.utils.PermissionUtil @@ -1442,7 +1443,7 @@ open class OCFileListFragment : (activity as? FileDisplayActivity)?.run { invalidateOptionsMenu() intent.removeExtra(SEARCH_EVENT) - setupHomeSearchToolbarWithSortAndListButtons() + showActionBar(ActionBarStyle.Search) updateActionBarTitleAndHomeButton(null) } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt index e7f6eb021cb1..56c73e0bac4d 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt @@ -57,6 +57,7 @@ import com.owncloud.android.ui.adapter.UnifiedSearchListAdapter import com.owncloud.android.ui.fragment.util.PairMediatorLiveData import com.owncloud.android.ui.interfaces.UnifiedSearchCurrentDirItemAction import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.ui.unifiedsearch.IUnifiedSearchViewModel import com.owncloud.android.ui.unifiedsearch.ProviderID import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection @@ -182,9 +183,9 @@ class UnifiedSearchFragment : override fun onResume() { super.onResume() typedActivity()?.run { - setupToolbar() + showActionBar(ActionBarStyle.Plain) setMainFabVisible(false) - updateActionBarTitleAndHomeButtonByString(null) + setActionBarTitle(null) setDrawerIndicatorEnabled(false) } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumItemsFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumItemsFragment.kt index 5e768d1a86be..1255b6896983 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumItemsFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumItemsFragment.kt @@ -89,6 +89,7 @@ import com.owncloud.android.ui.fragment.albums.util.AlbumCollageLayout import com.owncloud.android.ui.fragment.helper.ColumnCount import com.owncloud.android.ui.helpers.UriUploader import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.ui.preview.media.PreviewMediaFragment import com.owncloud.android.utils.ClipboardUtil import com.owncloud.android.utils.ErrorMessageAdapter @@ -212,7 +213,7 @@ class AlbumItemsFragment : override fun onResume() { super.onResume() getTypedActivity(FileDisplayActivity::class.java)?.run { - setupToolbar() + showActionBar(ActionBarStyle.Plain) supportActionBar?.let { viewThemeUtils.files.themeActionBar(requireContext(), it, albumName) } showSortListGroup(false) setMainFabVisible(false) @@ -511,7 +512,7 @@ class AlbumItemsFragment : fun onAlbumRenamed(newAlbumName: String) { albumName = newAlbumName - getTypedActivity(FileDisplayActivity::class.java)?.updateActionBarTitleAndHomeButtonByString(albumName) + getTypedActivity(FileDisplayActivity::class.java)?.setActionBarTitle(albumName) } fun onAlbumDeleted() { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumsFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumsFragment.kt index 690e28f9bb4b..31a4ba1afedd 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumsFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumsFragment.kt @@ -49,6 +49,7 @@ import com.owncloud.android.ui.dialog.CreateAlbumDialogFragment import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.ui.fragment.albums.model.AlbumsEmptyState import com.owncloud.android.ui.fragment.helper.ColumnCount +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.utils.theme.ViewThemeUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -276,7 +277,7 @@ class AlbumsFragment : } (activity as? FileDisplayActivity)?.run { - setupToolbar() + showActionBar(ActionBarStyle.Plain) supportActionBar?.let { actionBar -> viewThemeUtils.files.themeActionBar( requireContext(), diff --git a/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt index 263bb63c7f6d..567288e8aa01 100644 --- a/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt @@ -19,7 +19,6 @@ import com.owncloud.android.R import com.owncloud.android.databinding.ActivityNavigatorBinding import com.owncloud.android.ui.activity.DrawerActivity import com.owncloud.android.ui.navigation.listener.NavigatorOnBackPressListener -import com.owncloud.android.ui.navigation.model.ActionBarStyle import dagger.android.support.AndroidSupportInjection class NavigatorActivity : DrawerActivity() { @@ -121,12 +120,8 @@ class NavigatorActivity : DrawerActivity() { private fun setupActionBar(screen: NavigatorScreen) { val (style, titleId) = screen.actionBarStyle() - if (style == ActionBarStyle.Plain) { - setupToolbar() - } else { - setupHomeSearchToolbarWithSortAndListButtons() - } - updateActionBarTitleAndHomeButtonByString(getString(titleId)) + showActionBar(style) + setActionBarTitle(getString(titleId)) if (screen.hasDrawer) { setupDrawer(menuItemId) diff --git a/app/src/main/java/com/owncloud/android/utils/theme/ThemeColorUtils.java b/app/src/main/java/com/owncloud/android/utils/theme/ThemeColorUtils.java deleted file mode 100644 index 2d4656b3824f..000000000000 --- a/app/src/main/java/com/owncloud/android/utils/theme/ThemeColorUtils.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2018 Andy Scherzinger - * SPDX-FileCopyrightText: 2017 Tobias Kaminsky - * SPDX-FileCopyrightText: 2017 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -package com.owncloud.android.utils.theme; - -import android.accounts.Account; -import android.content.Context; -import android.graphics.Color; - -import com.nextcloud.android.common.ui.util.PlatformThemeUtil; -import com.owncloud.android.R; - -import static com.owncloud.android.utils.theme.CapabilityUtils.getCapability; - -/** - * Utility class with methods for theming related. - * - * @deprecated use material 3 Schemes and utilities from common lib instead - */ -@Deprecated -public class ThemeColorUtils { - public int unchangedPrimaryColor(Account account, Context context) { - try { - return Color.parseColor(getCapability(account, context).getServerColor()); - } catch (Exception e) { - return context.getResources().getColor(R.color.primary); - } - } - - public int unchangedFontColor(Context context) { - try { - return Color.parseColor(getCapability(context).getServerTextColor()); - } catch (Exception e) { - if (PlatformThemeUtil.isDarkMode(context)) { - return Color.WHITE; - } else { - return Color.BLACK; - } - } - } -}