diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7d0bf6464568..e34d602da476 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -353,11 +353,10 @@ + android:theme="@style/Theme.ownCloud" /> + android:exported="false" /> target = createSVGLogoTarget(primaryColor, capability); - getClientRepository().getNextcloudClient(nextcloudClient -> { - GlideHelper.INSTANCE.loadIntoTarget(DrawerActivity.this, - nextcloudClient, - serverLogoURL, - target, - R.drawable.background); - return Unit.INSTANCE; - }); - } - } - - // hide ecosystem apps according to user preference or in branded client - ConstraintLayout banner = mNavigationViewHeader.findViewById(R.id.drawer_ecosystem_apps); - boolean shouldHideTopBanner = isClientBranded || !preferences.isShowEcosystemApps(); - - if (shouldHideTopBanner) { - hideTopBanner(banner); - } else { - showTopBanner(banner); - } - } - - private Target createSVGLogoTarget(int primaryColor, OCCapability capability) { - return new CustomTarget<>() { - @Override - public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { - Bitmap bitmap; - - if (resource instanceof PictureDrawable pictureDrawable) { - bitmap = Bitmap.createBitmap( - pictureDrawable.getIntrinsicWidth(), - pictureDrawable.getIntrinsicHeight(), - Bitmap.Config.ARGB_8888); - - Canvas canvas = new Canvas(bitmap); - canvas.drawPicture(pictureDrawable.getPicture()); - - } else if (resource instanceof BitmapDrawable bitmapDrawable) { - bitmap = bitmapDrawable.getBitmap(); - } else { - Log_OC.e(TAG, "Unsupported drawable type: " + resource.getClass().getName()); - return; - } - - // Scale down if necessary - Bitmap logo = bitmap; - int width = bitmap.getWidth(); - int height = bitmap.getHeight(); - int max = Math.max(width, height); - if (max > MAX_LOGO_SIZE_PX) { - logo = BitmapUtils.scaleBitmap(bitmap, MAX_LOGO_SIZE_PX, width, height, max); - } - - Drawable[] drawables = { - new ColorDrawable(primaryColor), - new BitmapDrawable(getResources(), logo) - }; - LayerDrawable layerDrawable = new LayerDrawable(drawables); - - String name = capability.getServerName(); - setDrawerHeaderLogo(layerDrawable, name); - } - - @Override - public void onLoadCleared(@Nullable Drawable placeholder) {} - }; - } - - private void hideTopBanner(ConstraintLayout banner) { - banner.setVisibility(View.GONE); - } - - private void showTopBanner(ConstraintLayout banner) { - LinearLayout notesView = banner.findViewById(R.id.drawer_ecosystem_notes); - LinearLayout talkView = banner.findViewById(R.id.drawer_ecosystem_talk); - LinearLayout moreView = banner.findViewById(R.id.drawer_ecosystem_more); - LinearLayout assistantView = banner.findViewById(R.id.drawer_ecosystem_assistant); - - notesView.setOnClickListener(v -> LinkHelper.INSTANCE.openAppOrStore(LinkHelper.APP_NEXTCLOUD_NOTES, getUser(), this)); - talkView.setOnClickListener(v -> LinkHelper.INSTANCE.openAppOrStore(LinkHelper.APP_NEXTCLOUD_TALK, getUser(), this)); - moreView.setOnClickListener(v -> LinkHelper.INSTANCE.openAppStore("Nextcloud", true, this)); - assistantView.setOnClickListener(v -> { - DrawerActivity.menuItemId = Menu.NONE; - startComposeActivity(ComposeDestination.AssistantScreen, R.string.assistant_screen_top_bar_title); - }); - if (getCapabilities() != null && getCapabilities().getAssistant().isTrue()) { - assistantView.setVisibility(View.VISIBLE); - } else { - assistantView.setVisibility(View.GONE); - } - - List views = Arrays.asList(notesView, talkView, moreView, assistantView); - - int iconColor; - final var account = getAccount(); - if (account != null) { - int primaryColor = themeColorUtils.unchangedPrimaryColor(account, this); - if (Hct.fromInt(primaryColor).getTone() < 80.0) { - iconColor = Color.WHITE; - } else { - iconColor = getColor(R.color.grey_800_transparent); - } - } else { - iconColor = getColor(R.color.grey_800_transparent); - } - - for (LinearLayout view : views) { - ImageView imageView = (ImageView) view.getChildAt(0); - imageView.setImageTintList(ColorStateList.valueOf(iconColor)); - GradientDrawable background = (GradientDrawable) imageView.getBackground(); - background.setStroke(DisplayUtils.convertDpToPixel(1, this), iconColor); - TextView textView = (TextView) view.getChildAt(1); - textView.setTextColor(iconColor); - } - - banner.setVisibility(View.VISIBLE); - } - - private void setDrawerHeaderLogo(Drawable drawable, String serverName) { - ImageView imageHeader = mNavigationViewHeader.findViewById(R.id.drawer_header_logo); - imageHeader.setImageDrawable(drawable); - imageHeader.setAdjustViewBounds(true); - - if (!TextUtils.isEmpty(serverName)) { - TextView serverNameView = mNavigationViewHeader.findViewById(R.id.drawer_header_server_name); - serverNameView.setVisibility(View.VISIBLE); - serverNameView.setText(serverName); - serverNameView.setTextColor(themeColorUtils.unchangedFontColor(this)); - } - + viewThemeUtils.material.colorProgressBar(mQuotaProgressBar, getResources().getColor(R.color.primary, null)); } /** @@ -533,7 +369,9 @@ private void filterDrawerMenu(final Menu menu, @NonNull final User user) { OCCapability capability = getCapabilities(); DrawerMenuUtil.filterSearchMenuItems(menu, user, getResources()); - DrawerMenuUtil.filterTrashbinMenuItem(menu, capability); + // 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, capability); DrawerMenuUtil.filterActivityMenuItem(menu, capability); DrawerMenuUtil.filterGroupfoldersMenuItem(menu, capability); DrawerMenuUtil.filterAssistantMenuItem(menu, capability, getResources()); @@ -550,7 +388,11 @@ public void onMessageEvent(DummyDrawerEvent event) { private void onNavigationItemClicked(final MenuItem menuItem) { int itemId = menuItem.getItemId(); - menuItemId = itemId; + // NMC Customization: skip changing checked state for logout and notifications menu + // doing this will persist previous menu item + if (itemId != R.id.nav_logout && itemId != R.id.nav_notifications) { + menuItemId = itemId; + } setNavigationViewItemChecked(); if (itemId == R.id.nav_all_files || itemId == R.id.nav_personal_files) { @@ -592,6 +434,10 @@ private void onNavigationItemClicked(final MenuItem menuItem) { } else if (itemId == R.id.nav_activity) { resetOnlyPersonalAndOnDevice(); startActivity(ActivitiesActivity.class, Intent.FLAG_ACTIVITY_CLEAR_TOP); + } else if (itemId == R.id.nav_notifications) { + startActivity(NotificationsActivity.class); + // NMC: track notification screen event + MoEngageSdkUtils.trackNotificationsScreenEvent(this); } else if (itemId == R.id.nav_settings) { resetOnlyPersonalAndOnDevice(); @@ -607,9 +453,6 @@ private void onNavigationItemClicked(final MenuItem menuItem) { startActivity(CommunityActivity.class); } else if (itemId == R.id.nav_logout) { resetOnlyPersonalAndOnDevice(); - menuItemId = Menu.NONE; - MenuItem isNewMenuItemChecked = menuItem.setChecked(false); - Log_OC.d(TAG,"onNavigationItemClicked nav_logout setChecked " + isNewMenuItemChecked); final Optional optionalUser = getUser(); if (optionalUser.isPresent()) { UserInfoActivity.openAccountRemovalDialog(optionalUser.get(), getSupportFragmentManager()); @@ -844,21 +687,20 @@ private void showQuota(boolean showQuota) { * @param quotaValue {@link GetUserInfoRemoteOperation#SPACE_UNLIMITED} or other to determinate state */ private void setQuotaInformation(long usedSpace, long totalSpace, int relative, long quotaValue) { - if (GetUserInfoRemoteOperation.SPACE_UNLIMITED == quotaValue) { - mQuotaTextPercentage.setText(String.format( - getString(R.string.drawer_quota_unlimited), - DisplayUtils.bytesToHumanReadable(usedSpace))); - } else { - mQuotaTextPercentage.setText(String.format( - getString(R.string.drawer_quota), - DisplayUtils.bytesToHumanReadable(usedSpace), - DisplayUtils.bytesToHumanReadable(totalSpace))); - } + String usageText = String.format( + getString(R.string.drawer_quota_usage), + DisplayUtils.bytesToHumanReadable(usedSpace), + DisplayUtils.bytesToHumanReadable(totalSpace)); + + mQuotaTextUsage.setText(StringUtils.makeTextBold(usageText, DisplayUtils.bytesToHumanReadable(usedSpace))); mQuotaProgressBar.setProgress(relative); + mQuotaTextPercentage.setText(String.format( + getString(R.string.drawer_quota_percentage), relative)); + if (relative < RELATIVE_THRESHOLD_WARNING) { - viewThemeUtils.material.colorProgressBar(mQuotaProgressBar); + viewThemeUtils.material.colorProgressBar(mQuotaProgressBar, getResources().getColor(R.color.primary)); } else { viewThemeUtils.material.colorProgressBar(mQuotaProgressBar, getResources().getColor(R.color.infolevel_warning, getTheme())); @@ -957,7 +799,8 @@ public void setNavigationViewItemChecked() { MenuItem menuItem = drawerNavigationView.getMenu().findItem(menuItemId); if (menuItem != null && !menuItem.isChecked()) { - viewThemeUtils.platform.colorNavigationView(drawerNavigationView); + // NMC Customization: theme navigation view + NavigationViewThemeUtils.colorNavigationView(this, drawerNavigationView); menuItem.setChecked(true); } } @@ -1202,7 +1045,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { * @return The view if found or null otherwise. */ private View findQuotaViewById(int id) { - View v = ((NavigationView) findViewById(R.id.nav_view)).getHeaderView(0).findViewById(id); + View v = ((NavigationView) findViewById(R.id.nav_view)).findViewById(id); if (v != null) { return v; 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 f041d0854666..8173a9dc8fea 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 @@ -267,7 +267,9 @@ public void networkAndServerConnectionListener(boolean isNetworkAndServerAvailab refreshList(); } } else { - if (this instanceof PreviewMediaActivity) { + if (this instanceof PreviewMediaActivity + // NMC-4150 fix + || this instanceof PreviewImageActivity) { 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 bcbed6b84d77..1ae99dd24377 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 @@ -22,6 +22,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.Build; import android.os.Bundle; @@ -923,15 +924,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.java b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java index 3c6b724e553f..8b0dcb3b417b 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java @@ -92,8 +92,6 @@ protected void onCreate(Bundle savedInstanceState) { // Name binding.shareFileName.setText(getResources().getString(R.string.share_file, file.getFileName())); - viewThemeUtils.platform.colorViewBackground(binding.shareHeaderDivider); - // Size binding.shareFileSize.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); 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 index ac8966d3cb1d..6a6de8a98a10 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java @@ -17,6 +17,7 @@ import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.view.View; import android.widget.FrameLayout; @@ -32,10 +33,12 @@ import com.google.android.material.textview.MaterialTextView; import com.nextcloud.android.common.ui.theme.utils.ColorRole; import com.nextcloud.client.di.Injectable; +import com.nmc.android.utils.ToolbarThemeUtils; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.utils.StringUtils; import com.owncloud.android.utils.theme.ThemeColorUtils; import com.owncloud.android.utils.theme.ThemeUtils; import com.owncloud.android.utils.theme.ViewThemeUtils; @@ -66,6 +69,7 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable private LinearLayout mInfoBox; private TextView mInfoBoxMessage; protected AppCompatSpinner mToolbarSpinner; + private View mDefaultToolbarDivider; private boolean isHomeSearchToolbarShow = false; private static final String TAG = "ToolbarActivity"; @@ -88,6 +92,7 @@ private void setupToolbar(boolean isHomeSearchToolbarShow, boolean showSortListB mSearchText = findViewById(R.id.search_text); mSwitchAccountButton = findViewById(R.id.switch_account_button); mNotificationButton = findViewById(R.id.notification_button); + mDefaultToolbarDivider = findViewById(R.id.default_toolbar_divider); if (showSortListButtonGroup) { findViewById(R.id.sort_list_button_group).setVisibility(View.VISIBLE); @@ -104,8 +109,10 @@ private void setupToolbar(boolean isHomeSearchToolbarShow, boolean showSortListB mToolbarSpinner = findViewById(R.id.toolbar_spinner); - viewThemeUtils.material.themeToolbar(mToolbar); - viewThemeUtils.material.colorToolbarOverflowIcon(mToolbar); + // custom color for overflow icon required for NMC + if (mToolbar.getOverflowIcon() != null) { + mToolbar.getOverflowIcon().setColorFilter(getResources().getColor(R.color.fontAppbar, null), PorterDuff.Mode.SRC_ATOP); + } viewThemeUtils.platform.themeStatusBar(this); viewThemeUtils.material.colorMaterialTextButton(mSwitchAccountButton); @@ -187,22 +194,11 @@ private void showHomeSearchToolbar(String title, boolean isRoot) { @SuppressLint("PrivateResource") private void showHomeSearchToolbar(boolean isShow) { - 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(mHomeSearchToolbar); - 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); - } + mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(), + R.animator.appbar_elevation_on)); + viewThemeUtils.platform.themeStatusBar(this); + mDefaultToolbar.setVisibility(View.VISIBLE); + mHomeSearchToolbar.setVisibility(View.GONE); } /** @@ -215,7 +211,8 @@ public void updateActionBarTitleAndHomeButtonByString(String title) { // set home button properties if (actionBar != null) { if (title != null) { - actionBar.setTitle(title); + //custom styling for action bar title required for NMC + ToolbarThemeUtils.setColoredTitle(this, actionBar, title); actionBar.setDisplayShowTitleEnabled(true); } else { actionBar.setDisplayShowTitleEnabled(false); @@ -326,8 +323,8 @@ public FrameLayout getPreviewImageContainer() { public void updateToolbarSubtitle(@NonNull String subtitle) { ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { - actionBar.setSubtitle(subtitle); - viewThemeUtils.androidx.themeActionBarSubtitle(this, actionBar); + //required for NMC + actionBar.setSubtitle(StringUtils.getColorSpan(subtitle, getResources().getColor(R.color.fontAppbar, null))); } } 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 246b7b906241..246bb458468a 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 @@ -10,6 +10,7 @@ package com.owncloud.android.ui.dialog import android.app.Dialog +import android.graphics.Typeface import android.os.Bundle import android.view.View import androidx.fragment.app.DialogFragment @@ -65,11 +66,19 @@ class SortingOrderDialogFragment : view.tag = sortOrder view.let { it.setOnClickListener(OnSortOrderClickListener()) - viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(it) + + // NMC Customization + if ((view.tag as FileSortOrder).name == currentSortOrderName) { + it.setTextColor(resources.getColor(R.color.primary, null)) + it.setIconTintResource(R.color.primary) + it.setTypeface(it.typeface, Typeface.BOLD) + } else { + 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 f30d627f942d..8a983165cad8 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 @@ -338,14 +338,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/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt index c71c86bd2930..2111c9b5a552 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt @@ -70,7 +70,6 @@ class PreviewImageActivity : private var previewImagePagerAdapter: PreviewImagePagerAdapter? = null private var savedPosition: Int? = null private var downloadFinishReceiver: DownloadFinishReceiver? = null - private var fullScreenAnchorView: View? = null private var isDownloadWorkStarted = false private var screenState = PreviewImageActivityState.Idle @@ -99,6 +98,7 @@ class PreviewImageActivity : } setContentView(R.layout.preview_image_activity) + setupToolbar() livePhotoFile = intent.getParcelableArgument(EXTRA_LIVE_PHOTO_FILE, OCFile::class.java) @@ -112,7 +112,6 @@ class PreviewImageActivity : actionBar?.setDisplayHomeAsUpEnabled(true) } - fullScreenAnchorView = window.decorView // to keep our UI controls visibility in line with system bars visibility setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) @@ -122,7 +121,9 @@ class PreviewImageActivity : } observeWorkerState() - 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() } private fun applyDisplayCutOutTopPadding() { @@ -256,7 +257,8 @@ class PreviewImageActivity : if (file != null) { // / Refresh the activity according to the Account and OCFile set setFile(file) // reset after getting it fresh from storageManager - updateActionBarTitle(getFile().fileName) + // NMC Customization + updateActionBarTitleAndHomeButton(getFile()) // if (!stateWasRecovered) { initViewPager(optionalUser.get()) @@ -446,15 +448,12 @@ class PreviewImageActivity : } 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. * @@ -517,14 +516,7 @@ class PreviewImageActivity : get() = supportActionBar == null || supportActionBar?.isShowing == true fun toggleFullScreen() { - fullScreenAnchorView?.let { - val visible = (it.systemUiVisibility and View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0 - if (visible) { - hideSystemUI(it) - } else { - showSystemUI(it) - } - } + // do nothing for NMC } fun startImageEditor(file: OCFile) { @@ -557,27 +549,6 @@ class PreviewImageActivity : // TODO Auto-generated method stub } - @Suppress("DEPRECATION") - private fun hideSystemUI(anchorView: View) { - anchorView.systemUiVisibility = ( - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - or View.SYSTEM_UI_FLAG_FULLSCREEN - or View.SYSTEM_UI_FLAG_IMMERSIVE - or View.SYSTEM_UI_FLAG_LAYOUT_STABLE - or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - ) - } - - @Suppress("DEPRECATION") - private fun showSystemUI(anchorView: View) { - anchorView.systemUiVisibility = ( - View.SYSTEM_UI_FLAG_LAYOUT_STABLE - or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - ) - } - companion object { val TAG: String = PreviewImageActivity::class.java.simpleName const val EXTRA_VIRTUAL_TYPE: String = "EXTRA_VIRTUAL_TYPE" diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt index c15405d3ed49..c4e3d1018f82 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt @@ -149,7 +149,8 @@ class PreviewMediaActivity : binding = ActivityPreviewMediaBinding.inflate(layoutInflater) setContentView(binding.root) - setSupportActionBar(binding.materialToolbar) + // NMC Customization: Customize toolbar + setupToolbar() WindowCompat.setDecorFitsSystemWindows(window, false) applyWindowInsets() initArguments(savedInstanceState) @@ -249,10 +250,6 @@ class PreviewMediaActivity : it.setBackgroundDrawable(Color.BLACK.toDrawable()) } } - - viewThemeUtils.platform.themeStatusBar( - this - ) } private fun showProgressLayout() { @@ -464,7 +461,7 @@ class PreviewMediaActivity : .displayCutout() ) - binding.materialToolbar.updateLayoutParams { + binding.mediaToolbar.appbar.updateLayoutParams { topMargin = insets.top } exoControls.updateLayoutParams { @@ -475,7 +472,7 @@ class PreviewMediaActivity : } exoControls.updatePadding(left = insets.left, right = insets.right) exoProgress.updatePadding(left = insets.left, right = insets.right) - binding.materialToolbar.updatePadding(left = insets.left, right = insets.right) + binding.mediaToolbar.appbar.updatePadding(left = insets.left, right = insets.right) WindowInsetsCompat.CONSUMED } } @@ -503,12 +500,18 @@ class PreviewMediaActivity : override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.custom_menu_placeholder, menu) - - if (isFileVideo()) { - val moreMenuItem = menu?.findItem(R.id.custom_menu_placeholder_item) - moreMenuItem?.icon?.setTint(ContextCompat.getColor(this, R.color.white)) + // NMC customization + menu?.findItem(R.id.custom_menu_placeholder_item)?.apply { + icon = icon?.let { + viewThemeUtils.platform.colorDrawable( + it, + ContextCompat.getColor( + this@PreviewMediaActivity, + if (isFileVideo()) R.color.white else R.color.fontAppbar + ) + ) + } } - return true } 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 b2acffbafbf8..99a680857ad9 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 @@ -28,7 +28,9 @@ import com.nextcloud.android.common.ui.theme.MaterialSchemes import com.nextcloud.android.common.ui.theme.ViewThemeUtilsBase import com.nextcloud.android.common.ui.theme.utils.AndroidViewThemeUtils import com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils +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 @@ -136,18 +138,11 @@ class FilesSpecificViewThemeUtils @Inject constructor( // TODO move back arrow resource to lib and use lib method directly? @JvmOverloads fun themeActionBar(context: Context, actionBar: ActionBar, title: String, isMenu: Boolean = false) { - val icon = getHomeAsUpIcon(isMenu) - val backArrow = ResourcesCompat.getDrawable( - context.resources, - icon, - null - )!! - androidXViewThemeUtils.themeActionBar( - context, - actionBar, - title, - backArrow - ) + //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) } /** @@ -174,7 +169,13 @@ class FilesSpecificViewThemeUtils @Inject constructor( getHomeAsUpIcon(isMenu), null )!! - androidXViewThemeUtils.themeActionBar(context, actionBar, backArrow) + //custom color for back arrow for NMC + actionBar.setHomeAsUpIndicator( + DrawableThemeUtils.tintDrawable( + backArrow, + context.resources.getColor(R.color.fontAppbar, null) + ) + ) } fun themeTemplateCardView(cardView: 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/activity_preview_media.xml b/app/src/main/res/layout/activity_preview_media.xml index 1ff0dd7c04ba..98623875d255 100644 --- a/app/src/main/res/layout/activity_preview_media.xml +++ b/app/src/main/res/layout/activity_preview_media.xml @@ -15,15 +15,6 @@ android:layout_height="match_parent" tools:context=".ui.preview.PreviewMediaActivity"> - - + + + + + + + + + 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..75fbd01cbefe 100644 --- a/app/src/main/res/layout/files.xml +++ b/app/src/main/res/layout/files.xml @@ -47,12 +47,13 @@ + android:visibility="gone" + app:labelVisibilityMode="labeled" + app:layout_behavior="com.nextcloud.ui.behavior.OnScrollBehavior" + app:menu="@menu/bottom_navigation_menu" /> ~ SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only) --> - - + + + + + + + android:layout_height="1dp" + android:background="@color/divider_color" /> @@ -61,11 +61,28 @@ android:layout_marginEnd="1dp" android:contentDescription="@string/action_switch_grid_view" app:cornerRadius="24dp" + 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" /> + + + + @@ -86,6 +103,7 @@ android:id="@+id/preview_image" android:layout_width="match_parent" android:layout_height="@dimen/nav_drawer_header_height" + android:background="@color/bg_default" android:contentDescription="@string/preview_image_description" android:scaleType="centerCrop" /> @@ -99,7 +117,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"> @@ -112,6 +130,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" /> @@ -56,22 +95,14 @@ 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 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/colors.xml b/app/src/main/res/values/colors.xml index 36d7459ecdaf..5e5aafeb02d4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -89,4 +89,94 @@ #A5A5A5 #F7F9FF + + + #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 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_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 afed2dafe23a..e148d5eb52f6 100644 --- a/app/src/main/res/values/setup.xml +++ b/app/src/main/res/values/setup.xml @@ -78,7 +78,7 @@ false true - false + true true @@ -111,7 +111,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 3341599e790d..9803800e6684 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -93,8 +93,11 @@ Notifications %1$s of %2$s used %1$s used + %d %% Storage used + %1$s of %2$s Close sidebar Open sidebar + Recent files General More Manage accounts diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 17cdbaabca4a..5908d8938fa9 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 @@ -297,7 +307,7 @@ end @color/transparent - @color/drawer_active_item_background + @color/text_color diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index cefa8e7856d8..ebc41ddb9a42 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -23,6 +23,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