diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8014d33ba07c..b07c591992c6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -379,14 +379,13 @@ android:name=".ui.activity.SettingsActivity" android:enableOnBackInvokedCallback="false" android:exported="false" - android:theme="@style/PreferenceTheme" /> + android:theme="@style/Theme.ownCloud" /> + android:launchMode="singleTask" /> val bottomNavItems = setOf(R.id.nav_assistant, R.id.nav_all_files, R.id.nav_favorites, R.id.nav_gallery) diff --git a/app/src/main/java/com/nmc/android/utils/DrawableThemeUtils.kt b/app/src/main/java/com/nmc/android/utils/DrawableThemeUtils.kt new file mode 100644 index 000000000000..90d87bc6dcd6 --- /dev/null +++ b/app/src/main/java/com/nmc/android/utils/DrawableThemeUtils.kt @@ -0,0 +1,18 @@ +package com.nmc.android.utils + +import android.graphics.drawable.Drawable +import androidx.annotation.ColorInt +import androidx.core.graphics.BlendModeColorFilterCompat +import androidx.core.graphics.BlendModeCompat +import androidx.core.graphics.drawable.DrawableCompat + +object DrawableThemeUtils { + @JvmStatic + fun tintDrawable(drawable: Drawable, @ColorInt color: Int): Drawable { + val wrap: Drawable = DrawableCompat.wrap(drawable) + wrap.colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat( + color, BlendModeCompat.SRC_ATOP + ) + return wrap + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nmc/android/utils/NavigationViewThemeUtils.kt b/app/src/main/java/com/nmc/android/utils/NavigationViewThemeUtils.kt new file mode 100644 index 000000000000..c3155e7e7f50 --- /dev/null +++ b/app/src/main/java/com/nmc/android/utils/NavigationViewThemeUtils.kt @@ -0,0 +1,46 @@ +package com.nmc.android.utils + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import com.google.android.material.navigation.NavigationView +import com.nextcloud.android.common.ui.util.buildColorStateList +import com.owncloud.android.R + +object NavigationViewThemeUtils { + @JvmStatic + @JvmOverloads + fun colorNavigationView( + context: Context, + navigationView: NavigationView, + colorIcons: Boolean = true + ) { + if (navigationView.itemBackground != null) { + navigationView.itemBackground?.setTintList( + buildColorStateList( + android.R.attr.state_checked to context.resources.getColor(R.color.nav_selected_bg_color, null), + -android.R.attr.state_checked to Color.TRANSPARENT + ) + ) + } + navigationView.background.setTintList( + ColorStateList.valueOf( + context.resources.getColor( + R.color.nav_bg_color, + null + ) + ) + ) + + val colorStateList = + buildColorStateList( + android.R.attr.state_checked to context.resources.getColor(R.color.nav_txt_selected_color, null), + -android.R.attr.state_checked to context.resources.getColor(R.color.nav_txt_unselected_color, null), + ) + + navigationView.itemTextColor = colorStateList + if (colorIcons) { + navigationView.itemIconTintList = colorStateList + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nmc/android/utils/ToolbarThemeUtils.kt b/app/src/main/java/com/nmc/android/utils/ToolbarThemeUtils.kt new file mode 100644 index 000000000000..de28f3a33952 --- /dev/null +++ b/app/src/main/java/com/nmc/android/utils/ToolbarThemeUtils.kt @@ -0,0 +1,27 @@ +package com.nmc.android.utils + +import android.content.Context +import android.graphics.Typeface +import android.text.Spannable +import android.text.style.StyleSpan +import androidx.appcompat.app.ActionBar +import com.owncloud.android.R +import com.owncloud.android.utils.StringUtils + +object ToolbarThemeUtils { + @JvmStatic + fun setColoredTitle(context: Context, actionBar: ActionBar?, title: String) { + if (actionBar != null) { + val text: Spannable = StringUtils.getColorSpan(title, context.resources.getColor(R.color.fontAppbar, null)) + + //bold the magenta from MagentaCLOUD title + if (title.contains(context.resources.getString(R.string.app_name))) { + val textToBold = context.resources.getString(R.string.splashScreenBold) + val indexStart = title.indexOf(textToBold) + val indexEnd = indexStart + textToBold.length + text.setSpan(StyleSpan(Typeface.BOLD), indexStart, indexEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + } + actionBar.title = text + } + } +} \ No newline at end of file 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 ac256cd2375c..574d64c1cb5b 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 @@ -252,7 +252,9 @@ public void networkAndServerConnectionListener(boolean isNetworkAndServerAvailab refreshList(); } } else { - if (this instanceof AudioPlayerActivity) { + if (this instanceof AudioPlayerActivity + // NMC-4150 fix + || this instanceof PreviewMediaActivity) { hideInfoBox(); } else { showInfoBox(R.string.offline_mode); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java index 0b8c51755f78..b04f20eada09 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java @@ -23,6 +23,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.graphics.drawable.Drawable; +import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -1020,15 +1021,10 @@ private void setupActionBar() { actionBar.setDisplayShowTitleEnabled(true); if (getResources() == null) return; - Drawable menuIcon = ResourcesCompat.getDrawable(getResources(), - R.drawable.ic_arrow_back, - null); - - if (menuIcon == null) return; - viewThemeUtils.androidx.themeActionBar(this, - actionBar, - getString(R.string.actionbar_settings), - menuIcon); + // custom color for back arrow for NMC + viewThemeUtils.files.themeActionBar(this, actionBar, getResources().getString(R.string.actionbar_settings)); + // required for NMC + actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.bg_default, null))); } private void launchDavDroidLogin() { diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.kt index a0df0673cf4c..24a326b6e50d 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.kt @@ -121,7 +121,6 @@ class ShareActivity : setupFileIcon(binding, file, user) with(binding) { shareFileName.text = getString(R.string.share_file, file.fileName) - viewThemeUtils.platform.colorViewBackground(shareHeaderDivider) shareFileSize.text = HumanReadableFormatter.formatBytes(file.fileLength) } } 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 index d52539f636dc..9833e7167725 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.kt @@ -26,7 +26,8 @@ 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.nmc.android.utils.DrawableThemeUtils +import com.nmc.android.utils.ToolbarThemeUtils import com.owncloud.android.R import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.datamodel.OCFile @@ -36,6 +37,7 @@ import com.owncloud.android.ui.activity.drawer.DrawerActivity 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.StringUtils import com.owncloud.android.utils.theme.ThemeUtils import com.owncloud.android.utils.theme.ViewThemeUtils import javax.inject.Inject @@ -60,7 +62,7 @@ abstract class ToolbarActivity : private lateinit var defaultToolbar: RelativeLayout private lateinit var homeSearchToolbar: LinearLayout private lateinit var homeSearchContainer: MaterialCardView - + private lateinit var mDefaultToolbarDivider: View private var appBar: AppBarLayout? = null var previewImageView: ImageView? = null private set @@ -134,13 +136,16 @@ abstract class ToolbarActivity : searchText = findViewById(R.id.search_text) switchAccountButton = findViewById(R.id.switch_account_button) notificationButton = findViewById(R.id.notification_button) + mDefaultToolbarDivider = findViewById(R.id.default_toolbar_divider) toolbarSpinner = findViewById(R.id.toolbar_spinner) } private fun themeToolbarViews() { viewThemeUtils.run { - material.themeToolbar(toolbar) - material.colorToolbarOverflowIcon(toolbar) + // custom color for overflow icon required for NMC + toolbar.overflowIcon?.let { icon -> + DrawableThemeUtils.tintDrawable(icon, resources.getColor(R.color.fontAppbar, null)) + } platform.themeStatusBar(this@ToolbarActivity) material.colorMaterialTextButton(switchAccountButton) material.themeSearchCardView(homeSearchContainer) @@ -194,7 +199,10 @@ abstract class ToolbarActivity : fun setActionBarTitle(title: String?) { val actionBar = supportActionBar ?: return - title?.let { actionBar.title = it } + title?.let { + // custom styling for action bar title required for NMC + ToolbarThemeUtils.setColoredTitle(this, actionBar, it) + } actionBar.setDisplayShowTitleEnabled(title != null) } @@ -203,8 +211,8 @@ abstract class ToolbarActivity : fun updateToolbarSubtitle(subtitle: String) { val actionBar = supportActionBar ?: return - actionBar.subtitle = subtitle - viewThemeUtils.androidx.themeActionBarSubtitle(this, actionBar) + // required for NMC + actionBar.subtitle = StringUtils.getColorSpan(subtitle, resources.getColor(R.color.fontAppbar, null)) } fun clearToolbarSubtitle() { @@ -229,27 +237,11 @@ abstract class ToolbarActivity : 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) + appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(appBar.context, + R.animator.appbar_elevation_on) + viewThemeUtils.platform.themeStatusBar(this) + defaultToolbar.visibility = View.VISIBLE + homeSearchToolbar.visibility = View.GONE } private fun setAppBarStateListAnimator(appBar: AppBarLayout, @AnimatorRes animatorId: Int) { 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..42e134fbe2c1 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 @@ -41,6 +41,8 @@ import com.nextcloud.utils.extensions.getSelectedMenuItemId import com.nextcloud.utils.extensions.highlightNavigationView import com.nextcloud.utils.extensions.setVisibleIf import com.nextcloud.utils.mdm.MDMConfig +import com.nmc.android.utils.DrawableThemeUtils +import com.nmc.android.utils.NavigationViewThemeUtils import com.owncloud.android.R import com.owncloud.android.authentication.PassCodeManager import com.owncloud.android.datamodel.ArbitraryDataProviderImpl @@ -57,7 +59,6 @@ import com.owncloud.android.ui.activity.drawer.externallinks.DrawerExternalLinks import com.owncloud.android.ui.activity.drawer.externallinks.ExternalLinkOpener import com.owncloud.android.ui.activity.drawer.externallinks.ExternalLinksSynchronizer import com.owncloud.android.ui.activity.drawer.fragment.DrawerFragmentFinder -import com.owncloud.android.ui.activity.drawer.header.DrawerHeaderController import com.owncloud.android.ui.activity.drawer.navigation.DrawerDeepLinkHandler import com.owncloud.android.ui.activity.drawer.navigation.DrawerMenuFilter import com.owncloud.android.ui.activity.drawer.navigation.DrawerMenuItemClickHandler @@ -107,7 +108,6 @@ abstract class DrawerActivity : private set private var drawerLayout: DrawerLayout? = null - private var navigationViewHeader: View? = null private var pendingRunnable: Runnable? = null private lateinit var externalLinksSynchronizer: ExternalLinksSynchronizer @@ -116,7 +116,6 @@ abstract class DrawerActivity : private val externalLinkOpener = ExternalLinkOpener(this) private val externalLinksMenu by lazy { DrawerExternalLinksMenu(this, externalLinkOpener) } private val quotaController by lazy { DrawerQuotaController(this, externalLinkOpener) } - private val headerController by lazy { DrawerHeaderController(this, drawerNavigator) } private val menuItemClickHandler by lazy { DrawerMenuItemClickHandler(this, drawerNavigator, externalLinksMenu) } private val deepLinkHandler by lazy { DrawerDeepLinkHandler(this, drawerNavigator, menuItemClickHandler) } @@ -238,9 +237,10 @@ abstract class DrawerActivity : } private fun setupDrawerNavigationView(navigationView: NavigationView, id: Int) { - viewThemeUtils.files.colorNavigationView(navigationView) - navigationViewHeader = navigationView.getHeaderView(0) - updateHeader() + // NMC Customization: theme navigation view + drawerNavigationView?.let { + NavigationViewThemeUtils.colorNavigationView(this, it) + } navigationView.setNavigationItemSelectedListener { menuItem -> drawerLayout?.closeDrawers() @@ -281,7 +281,14 @@ abstract class DrawerActivity : toggle.isDrawerIndicatorEnabled = true toggle.isDrawerSlideAnimationEnabled = true ResourcesCompat.getDrawable(resources, R.drawable.ic_arrow_back, null)?.let { backArrow -> - viewThemeUtils.platform.tintToolbarArrowDrawable(this, toggle, backArrow) + // custom color for back arrow required for NMC + toggle.setHomeAsUpIndicator( + DrawableThemeUtils.tintDrawable( + backArrow, + resources.getColor(R.color.fontAppbar, null) + ) + ) + toggle.drawerArrowDrawable.color = resources.getColor(R.color.fontAppbar, null) } } @@ -290,11 +297,6 @@ abstract class DrawerActivity : Handler(Looper.getMainLooper()).post(runnable) pendingRunnable = null } - - fun updateHeader() { - val header = navigationViewHeader ?: return - headerController.update(header) - } // endregion // region Navigation @@ -316,7 +318,8 @@ abstract class DrawerActivity : fun getFragment(tag: String?, clazz: Class): Optional = fragmentFinder.getFragment(tag, clazz) fun showBottomNavigationBar(show: Boolean) { - bottomNavigationView.setVisibleIf(show) + // NMC Customization: always hide bottom bar + bottomNavigationView.setVisibleIf(false) } protected fun handleDeepLink(uri: Uri) = deepLinkHandler.handle(uri) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/drawer/navigation/DrawerMenuFilter.kt b/app/src/main/java/com/owncloud/android/ui/activity/drawer/navigation/DrawerMenuFilter.kt index 2abc4c4e6bc5..f8faa46e33ca 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/drawer/navigation/DrawerMenuFilter.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/drawer/navigation/DrawerMenuFilter.kt @@ -17,7 +17,9 @@ object DrawerMenuFilter { fun filter(menu: Menu, user: User, capability: OCCapability?, resources: Resources) { capability?.let { - DrawerMenuUtil.filterTrashbinMenuItem(menu, it) + // NMC: trashbin icon is depending on capability due to this it doesn't appear in some of the devices + // so removing the check as we need this option always + // DrawerMenuUtil.filterTrashbinMenuItem(menu, it) DrawerMenuUtil.filterActivityMenuItem(menu, it) DrawerMenuUtil.filterGroupfoldersMenuItem(menu, it) DrawerMenuUtil.filterAssistantMenuItem(menu, it, resources) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/drawer/navigation/DrawerMenuItemClickHandler.kt b/app/src/main/java/com/owncloud/android/ui/activity/drawer/navigation/DrawerMenuItemClickHandler.kt index 0e0ef9cadf21..2daeb60ba67d 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/drawer/navigation/DrawerMenuItemClickHandler.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/drawer/navigation/DrawerMenuItemClickHandler.kt @@ -15,6 +15,7 @@ import com.owncloud.android.ui.activity.drawer.DrawerActivity import com.owncloud.android.ui.activity.drawer.externallinks.DrawerExternalLinksMenu import com.owncloud.android.ui.events.ChangeMenuEvent import com.owncloud.android.ui.navigation.NavigatorScreen +import com.nmc.android.marketTracking.MoEngageSdkUtils import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import org.greenrobot.eventbus.EventBus @@ -39,6 +40,12 @@ class DrawerMenuItemClickHandler( R.id.nav_recent_files -> navigator.openRecentFiles() R.id.nav_assistant -> navigator.openAssistant() R.id.nav_groupfolders -> navigator.openGroupfolders() + R.id.nav_notifications -> { + navigator.pushFragment(NavigatorScreen.Notifications) + // NMC: track notification screen event + MoEngageSdkUtils.trackNotificationsScreenEvent(activity) + } + else -> onOtherNavigationItemClicked(menuItem) } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/drawer/quota/DrawerQuotaController.kt b/app/src/main/java/com/owncloud/android/ui/activity/drawer/quota/DrawerQuotaController.kt index a8384d88ef1c..33421bdea160 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/drawer/quota/DrawerQuotaController.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/drawer/quota/DrawerQuotaController.kt @@ -10,13 +10,13 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView import androidx.annotation.IdRes +import androidx.appcompat.widget.AppCompatTextView import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.google.android.material.navigation.NavigationView import com.google.android.material.progressindicator.LinearProgressIndicator -import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.utils.GlideHelper -import com.nextcloud.utils.HumanReadableFormatter +import com.nextcloud.utils.HumanReadableFormatter.formatBytes import com.nextcloud.utils.mdm.MDMConfig import com.owncloud.android.R import com.owncloud.android.lib.common.ExternalLink @@ -25,7 +25,12 @@ import com.owncloud.android.lib.common.Quota import com.owncloud.android.lib.resources.users.GetUserInfoRemoteOperation import com.owncloud.android.ui.activity.drawer.DrawerActivity import com.owncloud.android.ui.activity.drawer.externallinks.ExternalLinkOpener +import com.owncloud.android.utils.StringUtils import kotlinx.coroutines.launch +import java.lang.String +import kotlin.Boolean +import kotlin.Int +import kotlin.let import kotlin.math.ceil import kotlin.math.roundToInt @@ -36,7 +41,7 @@ class DrawerQuotaController(private val activity: DrawerActivity, private val ex private var quotaProgressBar: LinearProgressIndicator? = null private var quotaTextPercentage: TextView? = null private var quotaTextLink: TextView? = null - + private var mQuotaTextUsage: AppCompatTextView? = null private val Quota.isDisplayable: Boolean get() = quota > 0 || quota == GetUserInfoRemoteOperation.SPACE_UNLIMITED || @@ -46,13 +51,13 @@ class DrawerQuotaController(private val activity: DrawerActivity, private val ex quotaView = findQuotaViewById(navigationView, R.id.drawer_quota) quotaProgressBar = findQuotaViewById(navigationView, R.id.drawer_quota_ProgressBar) quotaTextPercentage = findQuotaViewById(navigationView, R.id.drawer_quota_percentage) + mQuotaTextUsage = findQuotaViewById(navigationView, R.id.drawer_quota_usage) quotaTextLink = findQuotaViewById(navigationView, R.id.drawer_quota_link) quotaProgressBar?.let { - activity.viewThemeUtils.material.colorProgressBar(it, ColorRole.PRIMARY) + activity.viewThemeUtils.material.colorProgressBar(it, activity.resources.getColor(R.color.primary, null)) it.trackStopIndicatorSize = 0 } - quotaView?.let { activity.viewThemeUtils.platform.colorViewBackground(it) } } fun fetchAndDisplay() { @@ -84,24 +89,28 @@ class DrawerQuotaController(private val activity: DrawerActivity, private val ex } private fun findQuotaViewById(navigationView: NavigationView, @IdRes id: Int): T? = - navigationView.getHeaderView(0)?.findViewById(id) ?: activity.findViewById(id) + navigationView.findViewById(id) ?: activity.findViewById(id) private fun showQuotaInformation(quota: Quota) { - quotaTextPercentage?.text = if (quota.quota == GetUserInfoRemoteOperation.SPACE_UNLIMITED) { - activity.getString(R.string.drawer_quota_unlimited, HumanReadableFormatter.formatBytes(quota.used)) - } else { - activity.getString( - R.string.drawer_quota, - HumanReadableFormatter.formatBytes(quota.used), - HumanReadableFormatter.formatBytes(quota.total) - ) - } + // NMC: custom text and formatting + val usageText = String.format( + activity.getString(R.string.drawer_quota_usage), + formatBytes(quota.used), + formatBytes(quota.total) + ) + + mQuotaTextUsage?.text = StringUtils.makeTextBold(usageText, formatBytes(quota.used)) + quotaTextPercentage?.text = String.format( + activity.getString(R.string.drawer_quota_percentage), quota.relative) val relative = ceil(quota.relative).toInt() quotaProgressBar?.let { progressBar -> progressBar.progress = relative if (relative < RELATIVE_THRESHOLD_WARNING) { - activity.viewThemeUtils.material.colorProgressBar(progressBar, ColorRole.PRIMARY) + activity.viewThemeUtils.material.colorProgressBar( + progressBar, + activity.resources.getColor(R.color.primary, null) + ) } else { activity.viewThemeUtils.material.colorProgressBar( progressBar, diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.kt index b788e2ad6e23..26fac356386a 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.kt @@ -65,11 +65,12 @@ class SortingOrderDialogFragment : view.tag = sortOrder view.let { it.setOnClickListener(OnSortOrderClickListener()) - viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(it) + // NMC Customization + it.setTextColor(resources.getColor(R.color.standard_grey, null)) + it.setIconTintResource(R.color.standard_grey) } } - viewThemeUtils?.material?.colorMaterialButtonPrimaryTonal(binding.cancel) binding.cancel.setOnClickListener { dismiss() } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt index 5ed2c45e47a4..b304501f3e2c 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt @@ -323,14 +323,7 @@ open class ExtendedListFragment : } mSortButton = requireActivity().findViewById(R.id.sort_button) - mSortButton?.let { - viewThemeUtils.material.colorMaterialTextButton(it) - } - mSwitchGridViewButton = requireActivity().findViewById(R.id.switch_grid_view_button) - mSwitchGridViewButton?.let { - viewThemeUtils.material.colorMaterialTextButton(it) - } return v } 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 154248d0014a..649fec16acb0 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 @@ -18,7 +18,6 @@ import android.view.MenuItem import android.view.View import androidx.activity.OnBackPressedCallback import androidx.core.content.ContextCompat -import androidx.core.graphics.drawable.toDrawable import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat @@ -66,6 +65,7 @@ import com.owncloud.android.ui.fragment.GalleryFragment import com.owncloud.android.ui.fragment.GalleryFragmentBottomSheetDialog.MediaState import com.owncloud.android.ui.navigation.animator.NavigationAnimator import com.owncloud.android.ui.navigation.animator.SharedElementTransition +import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.ui.preview.model.PreviewImageActivityState import com.owncloud.android.utils.MimeTypeUtil import edu.umd.cs.findbugs.annotations.SuppressFBWarnings @@ -135,6 +135,7 @@ class PreviewMediaActivity : } setContentView(R.layout.preview_image_activity) + showActionBar(ActionBarStyle.Plain) setupDrawer(menuItemId) @@ -145,7 +146,6 @@ class PreviewMediaActivity : updateActionBarTitleAndHomeButton(chosenFile) viewThemeUtils.files.setWhiteBackButton(this, it) it.setDisplayHomeAsUpEnabled(true) - it.setBackgroundDrawable(R.color.black.toDrawable()) } setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) @@ -155,7 +155,9 @@ class PreviewMediaActivity : screenState = PreviewImageActivityState.WaitingForBinder } - applyDisplayCutOutTopPadding() + // NMC-4604 fix: we don't need to call this function + // as we using toolbar_standard directly inside the xml and no padding is required + // applyDisplayCutOutTopPadding() handleBackPress() @@ -402,7 +404,8 @@ class PreviewMediaActivity : return } - updateActionBarTitle(file.fileName) + // NMC Customization + updateActionBarTitleAndHomeButton(getFile()) if (pagerNeedsRebuild) { savedPosition = null @@ -614,15 +617,12 @@ class PreviewMediaActivity : } if (currentFile != null) { - updateActionBarTitle(currentFile.fileName) + // NMC Customization + updateActionBarTitleAndHomeButton(currentFile) setDrawerIndicatorEnabled(false) } } - private fun updateActionBarTitle(title: String?) { - supportActionBar?.title = title - } - /** * Class waiting for broadcast events from the [FileDownloadWorker] service. * diff --git a/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaFragment.kt b/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaFragment.kt index 8306217a58e4..858d0e4266aa 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaFragment.kt @@ -143,8 +143,9 @@ class PreviewMediaFragment : binding = PreviewImageFragmentBinding.inflate(inflater, container, false) binding.image.visibility = View.GONE - binding.root.setOnClickListener { togglePreviewImageFullScreen() } - binding.image.setOnClickListener { togglePreviewImageFullScreen() } + // NMC: no full screen for image preview + // binding.root.setOnClickListener { togglePreviewImageFullScreen() } + // binding.image.setOnClickListener { togglePreviewImageFullScreen() } checkLivePhotoAvailability() setMultiListLoadingMessage() diff --git a/app/src/main/java/com/owncloud/android/utils/StringUtils.java b/app/src/main/java/com/owncloud/android/utils/StringUtils.java index d4339f0003eb..637b6c4ea15d 100644 --- a/app/src/main/java/com/owncloud/android/utils/StringUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/StringUtils.java @@ -7,7 +7,14 @@ */ package com.owncloud.android.utils; + +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.ForegroundColorSpan; + import java.util.Locale; +import android.graphics.Typeface; +import android.text.style.StyleSpan; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -55,6 +62,15 @@ String searchAndColor(@Nullable String text, @Nullable String searchText, } } + public static Spannable getColorSpan(@NonNull String title, @ColorInt int color) { + Spannable text = new SpannableString(title); + text.setSpan(new ForegroundColorSpan(color), + 0, + text.length(), + Spannable.SPAN_INCLUSIVE_INCLUSIVE); + return text; + } + public static @NonNull String removePrefix(@NonNull String s, @NonNull String prefix) { @@ -63,4 +79,19 @@ String removePrefix(@NonNull String s, @NonNull String prefix) { } return s; } + + /** + * make the passed text bold + * + * @param fullText actual text + * @param textToBold to be bold + * @return + */ + public static Spannable makeTextBold(String fullText, String textToBold) { + Spannable spannable = new SpannableString(fullText); + int indexStart = fullText.indexOf(textToBold); + int indexEnd = indexStart + textToBold.length(); + spannable.setSpan(new StyleSpan(Typeface.BOLD), indexStart, indexEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + return spannable; + } } diff --git a/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt b/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt index 5b2c6701e078..b357b2aebee5 100644 --- a/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt +++ b/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt @@ -38,7 +38,9 @@ import com.nextcloud.android.common.ui.theme.utils.AndroidViewThemeUtils import com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.android.common.ui.util.buildColorStateList +import com.nmc.android.utils.ToolbarThemeUtils import com.nextcloud.utils.view.FastScrollPopupBackground +import com.nmc.android.utils.DrawableThemeUtils import com.owncloud.android.R import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.shares.ShareType @@ -126,7 +128,11 @@ class FilesSpecificViewThemeUtils @Inject constructor( @JvmOverloads fun themeActionBar(context: Context, actionBar: ActionBar, title: String, isMenu: Boolean = false) { - androidXViewThemeUtils.themeActionBar(context, actionBar, title, getHomeAsUpDrawable(context, isMenu)) + //custom styling for action bar title required for NMC + ToolbarThemeUtils.setColoredTitle(context, actionBar, title) + + //custom color for back arrow for NMC + themeActionBar(context, actionBar, isMenu) } @JvmOverloads @@ -136,7 +142,13 @@ class FilesSpecificViewThemeUtils @Inject constructor( @JvmOverloads fun themeActionBar(context: Context, actionBar: ActionBar, isMenu: Boolean = false) { - androidXViewThemeUtils.themeActionBar(context, actionBar, getHomeAsUpDrawable(context, isMenu)) + // custom color for back arrow for NMC + actionBar.setHomeAsUpIndicator( + DrawableThemeUtils.tintDrawable( + getHomeAsUpDrawable(context, isMenu), + context.resources.getColor(R.color.fontAppbar, null) + ) + ) } fun themeTemplateCardView(view: MaterialCardView) { diff --git a/app/src/main/res/drawable/ic_magentacloud_product_logo.xml b/app/src/main/res/drawable/ic_magentacloud_product_logo.xml new file mode 100644 index 000000000000..287fc029a729 --- /dev/null +++ b/app/src/main/res/drawable/ic_magentacloud_product_logo.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/menu_background_color_state.xml b/app/src/main/res/drawable/menu_background_color_state.xml new file mode 100644 index 000000000000..1aee89b3ea28 --- /dev/null +++ b/app/src/main/res/drawable/menu_background_color_state.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/nav_notifications.xml b/app/src/main/res/drawable/nav_notifications.xml new file mode 100644 index 000000000000..6dfdde4bbdc3 --- /dev/null +++ b/app/src/main/res/drawable/nav_notifications.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/layout/action_mode_close_layout.xml b/app/src/main/res/layout/action_mode_close_layout.xml new file mode 100644 index 000000000000..36e355cb18c3 --- /dev/null +++ b/app/src/main/res/layout/action_mode_close_layout.xml @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/drawer.xml b/app/src/main/res/layout/drawer.xml index 733ffd26e694..6ecfa836e572 100644 --- a/app/src/main/res/layout/drawer.xml +++ b/app/src/main/res/layout/drawer.xml @@ -12,14 +12,13 @@ + + + + + android:drawablePadding="@dimen/alternate_half_padding" + android:visibility="gone" /> @@ -59,9 +80,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:drawablePadding="@dimen/alternate_half_padding" - android:fontFamily="sans-serif-medium" + android:paddingLeft="@dimen/standard_padding" + android:paddingRight="@dimen/standard_padding" android:text="@string/drawer_quota" - android:textColor="@color/drawer_text_color" /> + android:textColor="@color/drawer_quota_txt_color" + android:textSize="@dimen/txt_size_14sp" /> diff --git a/app/src/main/res/layout/files.xml b/app/src/main/res/layout/files.xml index 98af6d19fb14..68d247cc93bb 100644 --- a/app/src/main/res/layout/files.xml +++ b/app/src/main/res/layout/files.xml @@ -47,10 +47,10 @@ @@ -60,7 +60,7 @@ android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_marginEnd="@dimen/standard_margin" - android:layout_marginBottom="@dimen/floating_action_button_bottom_margin" + android:layout_marginBottom="@dimen/standard_margin" android:contentDescription="@string/fab_label" app:srcCompat="@drawable/ic_plus" app:layout_behavior="com.nextcloud.ui.behavior.OnScrollBehavior" diff --git a/app/src/main/res/layout/preview_image_activity.xml b/app/src/main/res/layout/preview_image_activity.xml index 35746487f5f1..f53792ba5b84 100644 --- a/app/src/main/res/layout/preview_image_activity.xml +++ b/app/src/main/res/layout/preview_image_activity.xml @@ -10,17 +10,28 @@ ~ SPDX-FileCopyrightText: 2013 David A. Velasco ~ SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only) --> - - + + + + + + diff --git a/app/src/main/res/layout/sorting_order_fragment.xml b/app/src/main/res/layout/sorting_order_fragment.xml index 3cb563d7c27a..49111cb471cc 100644 --- a/app/src/main/res/layout/sorting_order_fragment.xml +++ b/app/src/main/res/layout/sorting_order_fragment.xml @@ -88,6 +88,7 @@ @@ -61,11 +61,28 @@ android:layout_marginEnd="1dp" android:contentDescription="@string/action_switch_grid_view" app:cornerRadius="@dimen/button_corner_radius" + app:iconSize="24dp" app:icon="@drawable/ic_view_module" - app:iconTint="@color/fontAppbar" + app:iconTint="@color/icon_color" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + @@ -87,6 +104,7 @@ android:id="@+id/preview_image" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/bg_default" android:contentDescription="@string/preview_image_description" android:scaleType="centerCrop" /> @@ -95,7 +113,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:background="@color/appbar" + android:background="@color/bg_default" android:theme="@style/Theme.ToolbarTheme" tools:visibility="gone"> @@ -108,6 +126,14 @@ app:popupTheme="@style/Theme.AppCompat.DayNight.NoActionBar" /> + + + android:title="@string/drawer_item_personal_files" + android:visible="false" /> + + + + + + + + + + + android:visible="false"/> + android:title="@string/drawer_item_groupfolders" + android:visible="false" /> @@ -57,12 +97,8 @@ android:id="@+id/nav_activity" android:icon="@drawable/selector_activity" android:orderInCategory="1" - android:title="@string/drawer_item_activities" /> - + android:title="@string/drawer_item_activities" + android:visible="false" /> - + android:title="@string/drawer_item_uploads_list" + android:visible="false" /> - - - + + + + #FFFFFF + @color/grey_30 + @color/grey_30 + #CCCCCC + @color/grey_70 + @color/grey_80 + #2D2D2D + @color/grey_70 + @color/grey_70 + + + @color/grey_80 + @color/grey_0 + + + @color/grey_80 + @color/grey_0 + + + @color/grey_60 + @color/grey_0 + @color/grey_0 + @color/grey_30 + #FFFFFF + @color/grey_30 + @color/grey_80 + #FFFFFF + + + @color/grey_80 + @color/grey_30 + @color/grey_0 + + + @color/grey_80 + @color/grey_0 + @color/grey_80 + + + @color/grey_70 + @color/grey_60 + + + @color/grey_70 + @color/grey_70 + + + #FFFFFF + @color/grey_30 + @color/grey_0 + @color/grey_0 + @color/grey_0 + @color/grey_0 + @color/grey_60 + @color/grey_0 + #FFFFFF + #7d94f9 + + + #121212 + @color/grey_0 + @color/grey_80 + @color/grey_80 + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 19b3ce692520..ef13919a9f09 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -22,6 +22,11 @@ @style/Widget.App.TextInputLayout @style/Nextcloud.Widget.PopupMenu @style/ThemeOverlay.App.BottomSheetDialog + + @color/primary + + @drawable/ic_arrow_back + @drawable/ic_arrow_back @style/App.ActionMode diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 000000000000..43e80a31e3f2 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,33 @@ + + + 4dp + 16dp + 24dp + 24dp + 6dp + 18sp + 15sp + 15dp + 56dp + 86dp + 80dp + 11sp + 30dp + 55dp + 258dp + 17sp + 20dp + 160dp + 50dp + 150dp + 55dp + 48dp + 48dp + 24dp + 26dp + 20sp + 145dp + 1dp + 13sp + 44dp + \ No newline at end of file diff --git a/app/src/main/res/values/nmc_colors.xml b/app/src/main/res/values/nmc_colors.xml new file mode 100644 index 000000000000..3aa33ccdf362 --- /dev/null +++ b/app/src/main/res/values/nmc_colors.xml @@ -0,0 +1,98 @@ + + + + + #191919 + @color/primary + #191919 + #191919 + @color/grey_30 + @android:color/white + #FFFFFF + @color/grey_0 + #CCCCCC + #77c4ff + #B3FFFFFF + @color/grey_10 + + + #101010 + #F2F2F2 + #E5E5E5 + #B2B2B2 + #666666 + #4C4C4C + #333333 + + + @color/design_snackbar_background_color + @color/white + + + #FFFFFF + #191919 + + + @color/grey_0 + #191919 + @color/primary + #191919 + @color/primary + @color/grey_30 + @color/white + #191919 + + + #FFFFFF + #191919 + #191919 + + + #FFFFFF + #191919 + #FFFFFF + + + @color/primary + #F399C7 + #FFFFFF + @color/grey_30 + @color/grey_10 + @color/grey_0 + + + @color/primary + @color/grey_30 + @color/grey_30 + #CCCCCC + + + #191919 + @color/grey_30 + #191919 + #191919 + #191919 + #191919 + @color/grey_30 + #191919 + #000000 + #191919 + #F6E5EB + #C16F81 + #0D39DF + #0099ff + #2238df + + + @color/grey_0 + #191919 + @color/grey_0 + @color/grey_30 + #77b6bb + #5077b6bb + \ No newline at end of file diff --git a/app/src/main/res/values/nmc_navigation_styles.xml b/app/src/main/res/values/nmc_navigation_styles.xml new file mode 100644 index 000000000000..5e2acf8f859e --- /dev/null +++ b/app/src/main/res/values/nmc_navigation_styles.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/setup.xml b/app/src/main/res/values/setup.xml index a758c6884e77..3b0509f52aee 100644 --- a/app/src/main/res/values/setup.xml +++ b/app/src/main/res/values/setup.xml @@ -77,7 +77,7 @@ true - false + true true @@ -110,7 +110,7 @@ - true + false https://f-droid.org/repository/browse/?fdid=com.nextcloud.android.beta https://download.nextcloud.com/android/dev/latest.apk diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31901ff1e355..840675a0a322 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -157,6 +157,8 @@ Notifications %1$s of %2$s used %1$s used + %d %% Storage used + %1$s of %2$s Close sidebar Open sidebar General diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b01edd987c4e..2181b46d6067 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -31,6 +31,11 @@ @style/FallbackDatePickerDialogTheme @color/bg_default @style/Widget.App.TextInputLayout + + @color/primary + + @drawable/ic_arrow_back + @drawable/ic_arrow_back @dimen/dialogBorderRadius @@ -51,6 +56,11 @@ @style/FallbackDatePickerDialogTheme @color/bg_default @style/Widget.App.TextInputLayout + + @color/primary + + @drawable/ic_arrow_back + @drawable/ic_arrow_back @dimen/dialogBorderRadius @@ -288,7 +298,7 @@ end @color/transparent - @color/drawer_active_item_background + @color/text_color