From 16a20901e8d1b7bef82d2a3ef7e0c4c5948bc814 Mon Sep 17 00:00:00 2001 From: A117870935 Date: Wed, 10 May 2023 00:35:12 +0530 Subject: [PATCH] NMC-1920: Customized theming related changes for grid and list views. NMC-2121: Theming applied to passcode. NMC-2374: Image edit functionality customized. NMC-1941: Fixed error message coming after camera permission allowed. NMC-2052: Fix back arrow appearing as hamburger icon. NC PR: https://github.com/nextcloud/android/pull/11769 NMC-2465: Fix local db version to avoid crash during app upgrade. NMC-2576: Disabled switch account SnackBar. NMC-2123: Widget disabled. NMC-2127: System default night mode. NMC-1919: Backup Calendar-Contacts configured with test cases. NMC-2089: Reduce log levels Media View multi-selection customized --- app/src/main/AndroidManifest.xml | 3 + .../client/database/NextcloudDatabase.kt | 5 +- .../client/editimage/EditImageActivity.kt | 42 ++-- .../ui/fileactions/FileActionsBottomSheet.kt | 3 +- .../TrashbinFileActionsBottomSheet.kt | 3 +- .../java/com/nmc/android/ui/utils/Log_NMC.kt | 42 ++++ .../java/com/owncloud/android/MainApp.java | 7 +- .../android/datamodel/MediaProvider.java | 6 +- .../datamodel/ThumbnailsCacheManager.java | 21 +- .../ui/activity/FileDisplayActivity.java | 6 +- .../android/ui/activity/PassCodeActivity.kt | 13 -- .../android/ui/adapter/GalleryAdapter.kt | 3 +- .../android/ui/adapter/GalleryRowHolder.kt | 30 +-- .../ui/adapter/LocalFileListAdapter.java | 3 +- .../android/ui/adapter/OCFileListAdapter.java | 27 +-- .../android/ui/adapter/OCFileListDelegate.kt | 18 +- .../adapter/OCFileListGridItemViewHolder.kt | 4 +- .../ui/adapter/TrashbinListAdapter.java | 5 +- .../android/ui/adapter/UploadListAdapter.java | 3 +- .../ui/dialog/ConflictsResolveDialog.kt | 3 +- .../ui/fragment/OCFileListFragment.java | 14 +- .../OCFileListFragmentInterface.java | 2 + .../owncloud/android/utils/DisplayUtils.java | 90 +++++++-- app/src/main/res/drawable/cursor_drawable.xml | 5 + .../main/res/layout/activity_edit_image.xml | 15 +- app/src/main/res/layout/backup_fragment.xml | 20 +- app/src/main/res/layout/file_thumbnail.xml | 2 +- .../main/res/layout/files_folder_picker.xml | 13 +- app/src/main/res/layout/grid_image.xml | 5 +- app/src/main/res/layout/grid_item.xml | 179 +++++++++--------- app/src/main/res/layout/list_item.xml | 51 +++-- .../res/layout/receive_external_files.xml | 1 + .../layout/synced_folders_settings_layout.xml | 2 + app/src/main/res/layout/trashbin_item.xml | 7 +- .../main/res/layout/upload_files_layout.xml | 13 +- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-night/colors.xml | 70 ++++++- app/src/main/res/values-night/themes.xml | 3 + app/src/main/res/values-sw600dp/dims.xml | 2 + app/src/main/res/values/colors.xml | 105 +++++++++- app/src/main/res/values/dimens.xml | 32 ++++ app/src/main/res/values/dims.xml | 10 +- app/src/main/res/values/setup.xml | 2 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 13 ++ app/src/main/res/values/themes.xml | 3 + .../test/java/com/nmc/DatabaseVersionTest.kt | 14 ++ .../nmc/android/CalendarBackupSetupTest.kt | 33 ++++ 48 files changed, 659 insertions(+), 296 deletions(-) create mode 100644 app/src/main/java/com/nmc/android/ui/utils/Log_NMC.kt create mode 100644 app/src/main/res/drawable/cursor_drawable.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/test/java/com/nmc/DatabaseVersionTest.kt create mode 100644 app/src/test/java/com/nmc/android/CalendarBackupSetupTest.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 73493014a302..13ee4211d0c2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -259,6 +259,7 @@ android:exported="false" /> @@ -283,6 +284,7 @@ android:exported="false" /> @@ -394,6 +396,7 @@ androidInjector() { } public static void setAppTheme(DarkMode mode) { - switch (mode) { - case LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); - case DARK -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); - case SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); - } + // NMC Customization -> Always follow system theme + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } @Override diff --git a/app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java b/app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java index c3dd31c29290..03e3e025e57f 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java +++ b/app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java @@ -12,8 +12,8 @@ import android.net.Uri; import android.provider.MediaStore; +import com.nmc.android.ui.utils.Log_NMC; import com.owncloud.android.MainApp; -import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.utils.PermissionUtil; import com.owncloud.android.utils.theme.ViewThemeUtils; @@ -107,7 +107,7 @@ public static List getImageFolders(ContentResolver contentResolver, MediaStore.Images.Media.DATE_TAKEN, ContentResolverHelper.SORT_DIRECTION_DESCENDING, itemLimit); - Log_OC.d(TAG, "Reading images for " + mediaFolder.folderName); + Log_NMC.d(TAG, "Reading images for " + mediaFolder.folderName); if (cursorImages != null) { String filePath; @@ -217,7 +217,7 @@ public static List getVideoFolders(ContentResolver contentResolver, ContentResolverHelper.SORT_DIRECTION_DESCENDING, itemLimit); - Log_OC.d(TAG, "Reading videos for " + mediaFolder.folderName); + Log_NMC.d(TAG, "Reading videos for " + mediaFolder.folderName); if (cursorVideos != null) { String filePath; diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index c031d0c77b69..1fd7b6c0ea74 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -37,6 +37,7 @@ import com.nextcloud.client.account.User; import com.nextcloud.client.network.ConnectivityService; import com.nextcloud.utils.BitmapExtensionsKt; +import com.nmc.android.ui.utils.Log_NMC; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -130,7 +131,7 @@ public static void initDiskCacheAsync() { } String cachePath = cacheDir.getPath() + File.separator + CACHE_FOLDER; - Log_OC.d(TAG, "thumbnail cache dir: " + cachePath); + Log_NMC.d(TAG, "thumbnail cache dir: " + cachePath); File diskCacheDir = new File(cachePath); // migrate from external cache to internal cache @@ -147,7 +148,7 @@ public static void initDiskCacheAsync() { mThumbnailCache = new DiskLruImageCache(diskCacheDir, DISK_CACHE_SIZE, mCompressFormat, mCompressQuality); } catch (Exception e) { - Log_OC.d(TAG, "Disk cache init failed", e); + Log_NMC.d(TAG, "Disk cache init failed", e); mThumbnailCache = null; } } @@ -777,7 +778,7 @@ private Bitmap doThumbnailFromOCFileInBackground() { file.getLocalId() + "&x=" + pxW + "&y=" + pxH; } - Log_OC.d(TAG, "generate thumbnail: " + file.getFileName() + " URI: " + uri); + Log_NMC.d(TAG, "generate thumbnail: " + file.getFileName() + " URI: " + uri); getMethod = new GetMethod(uri); getMethod.setRequestHeader("Cookie", "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true"); @@ -810,7 +811,7 @@ private Bitmap doThumbnailFromOCFileInBackground() { // Add thumbnail to cache if (thumbnail != null) { - Log_OC.d(TAG, "add thumbnail to cache: " + file.getFileName()); + Log_NMC.d(TAG, "add thumbnail to cache: " + file.getFileName()); addBitmapToCache(imageKey, thumbnail); } } @@ -968,7 +969,7 @@ private Bitmap doFileInBackground(File file, Type type) { thumbnail = retriever.getFrameAtTime(-1); } catch (Exception ex) { // can't create a bitmap - Log_OC.w(TAG, "Failed to create bitmap from video " + file.getAbsolutePath()); + Log_NMC.w(TAG, "Failed to create bitmap from video " + file.getAbsolutePath()); } if (thumbnail != null) { @@ -1075,7 +1076,7 @@ Drawable doAvatarInBackground() { int px = mResources.getInteger(R.integer.file_avatar_px); String uri = mClient.getBaseUri() + "/index.php/avatar/" + Uri.encode(mUserId) + "/" + px; - Log_OC.d("Avatar", "URI: " + uri); + Log_NMC.d("Avatar", "URI: " + uri); get = new GetMethod(uri); // only use eTag if available and corresponding avatar is still there @@ -1349,7 +1350,7 @@ public static void generateThumbnailFromOCFile(OCFile file, User user, Context c String uri = client.getBaseUri() + "/index.php/apps/files/api/v1/thumbnail/" + pxW + "/" + pxH + Uri.encode(file.getRemotePath(), "/"); - Log_OC.d(TAG, "generate thumbnail: " + file.getFileName() + " URI: " + uri); + Log_NMC.d(TAG, "generate thumbnail: " + file.getFileName() + " URI: " + uri); getMethod = new GetMethod(uri); getMethod.setRequestHeader("Cookie", "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true"); @@ -1372,7 +1373,7 @@ public static void generateThumbnailFromOCFile(OCFile file, User user, Context c thumbnail = handlePNG(thumbnail, pxW, pxH); } - Log_OC.d(TAG, "add thumbnail to cache: " + file.getFileName()); + Log_NMC.d(TAG, "add thumbnail to cache: " + file.getFileName()); addBitmapToCache(imageKey, thumbnail); } } catch (Exception e) { @@ -1426,7 +1427,7 @@ private static Bitmap doResizedImageInBackground(OCFile file, FileDataStorageMan String uri = mClient.getBaseUri() + "/index.php/core/preview?fileId=" + file.getLocalId() + "&x=" + (pxW / 2) + "&y=" + (pxH / 2) + "&a=1&mode=cover&forceIcon=0"; - Log_OC.d(TAG, "generate resized image: " + file.getFileName() + " URI: " + uri); + Log_NMC.d(TAG, "generate resized image: " + file.getFileName() + " URI: " + uri); getMethod = new GetMethod(uri); int status = mClient.executeMethod(getMethod); @@ -1444,7 +1445,7 @@ private static Bitmap doResizedImageInBackground(OCFile file, FileDataStorageMan // Add thumbnail to cache if (thumbnail != null) { - Log_OC.d(TAG, "add resized image to cache: " + file.getFileName()); + Log_NMC.d(TAG, "add resized image to cache: " + file.getFileName()); addBitmapToCache(imageKey, thumbnail); } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 9a5b71d5535d..b2c6eb2e9288 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -402,7 +402,8 @@ protected void onPostCreate(Bundle savedInstanceState) { onOpenFileIntent(getIntent()); } else if (RESTART.equals(getIntent().getAction())) { // most likely switched to different account - DisplayUtils.showSnackMessage(this, String.format(getString(R.string.logged_in_as), accountManager.getUser().getAccountName())); + // NMC-2576 --> Disabling switch account snackbar for NMC + /*DisplayUtils.showSnackMessage(this, String.format(getString(R.string.logged_in_as), accountManager.getUser().getAccountName()));*/ } upgradeNotificationForInstantUpload(); @@ -479,6 +480,9 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted getOCFileListFragmentFromFile().directCameraUpload(); + } else if (!shouldShowRequestPermissionRationale(permissions[0])) { + // user CHECKED "never ask again" + DisplayUtils.showSnackMessage(this, R.string.camera_permission_rationale); } break; default: diff --git a/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.kt index 824263bca461..6fd668cb3857 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.kt @@ -21,7 +21,6 @@ import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.google.android.material.snackbar.Snackbar -import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.client.di.Injectable import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.utils.extensions.setVisibleIf @@ -83,30 +82,18 @@ class PassCodeActivity : AppCompatActivity(), Injectable { setContentView(binding.root) PassCodeManager.setSecureFlag(this, true) - applyTint() setupPasscodeEditTexts() setSoftInputMode() setupUI(savedInstanceState) setTextListeners() } - private fun applyTint() { - viewThemeUtils.platform.colorViewBackground(binding.cardViewContent, ColorRole.SURFACE_VARIANT) - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(binding.cancel) - } - private fun setupPasscodeEditTexts() { passCodeEditTexts[0] = binding.txt0 passCodeEditTexts[1] = binding.txt1 passCodeEditTexts[2] = binding.txt2 passCodeEditTexts[3] = binding.txt3 - passCodeEditTexts.forEach { - it?.let { editText -> - viewThemeUtils.platform.colorEditText(editText) - } - } - passCodeEditTexts[0]?.requestFocus() binding.cardViewContent.setOnClickListener { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt index 10fbaaa8053b..596d5e329068 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt @@ -72,7 +72,8 @@ class GalleryAdapter( transferServiceGetter, showMetadata = false, showShareAvatar = false, - viewThemeUtils + viewThemeUtils, + true ) } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/GalleryRowHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/GalleryRowHolder.kt index 95cf39a94c7d..1e0070148e70 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/GalleryRowHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/GalleryRowHolder.kt @@ -75,8 +75,9 @@ class GalleryRowHolder( FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT ).apply { - gravity = Gravity.TOP or Gravity.START - marginStart = checkBoxMargin.toInt() + // NMC Customization: align checkbox on top right + gravity = Gravity.TOP or Gravity.END + marginEnd = checkBoxMargin.toInt() topMargin = checkBoxMargin.toInt() } } @@ -99,10 +100,12 @@ class GalleryRowHolder( setImageDrawable(drawable) } + // NMC Customization: place the checkbox at the end in frame layout + // to make it visible properly when multiselect is on return FrameLayout(context).apply { - addView(checkbox) addView(shimmer) addView(rowCellImageView) + addView(checkbox) } } @@ -173,13 +176,15 @@ class GalleryRowHolder( val width = ((fileWidth ?: defaultThumbnailSize) * shrinkRatio).toInt() val height = ((fileHeight ?: defaultThumbnailSize) * shrinkRatio).toInt() + // NMC Customization: change the index of the views in frame layout + // so that the checkbox should be added as last view val frameLayout = binding.rowLayout[index] as FrameLayout - val checkBoxImageView = frameLayout[0] as ImageView - val shimmer = frameLayout[1] as LoaderImageView - val thumbnail = (frameLayout[2] as ImageView).apply { + val shimmer = frameLayout[0] as LoaderImageView + val thumbnail = (frameLayout[1] as ImageView).apply { adjustViewBounds = true scaleType = ImageView.ScaleType.FIT_CENTER } + val checkBoxImageView = frameLayout[2] as ImageView val isChecked = ocFileListDelegate.isCheckedFile(file) adjustRowCell(thumbnail, isChecked) @@ -216,10 +221,12 @@ class GalleryRowHolder( @Suppress("MagicNumber") private fun adjustRowCell(imageView: ImageView, isChecked: Boolean) { + // NMC Customization: no need to scaling and rounding + // we want a normal view without any corners imageView.apply { - scaleX = if (isChecked) 0.8f else 1.0f + scaleX = 1.0f scaleY = scaleX - makeRounded(context, if (isChecked) iconRadius else 0f) + makeRounded(context, 0f) } } @@ -227,11 +234,8 @@ class GalleryRowHolder( if (ocFileListDelegate.isMultiSelect) { val checkboxDrawable = ( if (isChecked) { - val drawable = ContextCompat.getDrawable(context, R.drawable.ic_checkbox_marked) - drawable?.let { - viewThemeUtils.platform.tintDrawable(context, drawable, ColorRole.PRIMARY) - } - drawable + // NMC Customization: no need to tint the color + ContextCompat.getDrawable(context, R.drawable.ic_checkbox_marked) } else { ContextCompat.getDrawable(context, R.drawable.ic_checkbox_blank_outline) } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java index b24a46b1d4a8..1d6d2862dba1 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java @@ -179,8 +179,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi if (isCheckedFile(file)) { gridViewHolder.itemLayout.setBackgroundColor(ContextCompat.getColor(mContext, R.color.selected_item_background)); - gridViewHolder.checkbox.setImageDrawable( - viewThemeUtils.platform.tintDrawable(mContext, R.drawable.ic_checkbox_marked, ColorRole.PRIMARY)); + gridViewHolder.checkbox.setImageResource(R.drawable.ic_checkbox_marked); } else { gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources().getColor(R.color.bg_default)); gridViewHolder.checkbox.setImageResource(R.drawable.ic_checkbox_blank_outline); diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index 41f92f77fe75..957fe8cded7b 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -191,6 +191,7 @@ public OCFileListAdapter( true, true, viewThemeUtils, + false, syncedFolderProvider); setHasStableIds(true); @@ -388,17 +389,6 @@ public boolean isEmpty() { @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { switch (viewType) { - case VIEW_TYPE_IMAGE -> { - if (gridView) { - return new OCFileListViewHolder( - GridImageBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } else { - return new OCFileListItemViewHolder( - ListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } - } case VIEW_TYPE_FOOTER -> { return new OCFileListFooterViewHolder( ListFooterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) @@ -412,6 +402,8 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int return new OCFileListHeaderViewHolder(binding); } + // change required for NMC + // default case will be used for VIEW_TYPE_IMAGE & VIEWTYPE_ITEM also default -> { if (gridView) { return new OCFileListGridItemViewHolder( @@ -431,7 +423,6 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof OCFileListFooterViewHolder footerViewHolder) { footerViewHolder.getFooterText().setText(getFooterText()); - viewThemeUtils.platform.colorCircularProgressBar(footerViewHolder.getLoadingProgressBar(), ColorRole.ON_SURFACE_VARIANT); footerViewHolder.getLoadingProgressBar().setVisibility( ocFileListFragmentInterface.isLoading() ? View.VISIBLE : View.GONE); } else if (holder instanceof OCFileListHeaderViewHolder headerViewHolder) { @@ -574,15 +565,10 @@ private void updateLivePhotoIndicators(ListViewHolder holder, OCFile file) { private void bindListGridItemViewHolder(ListGridItemViewHolder holder, OCFile file) { holder.getFileName().setText(mStorageManager.getFilenameConsideringOfflineOperation(file)); - boolean gridImage = MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file); - if (gridView && gridImage) { + if (gridView && ocFileListFragmentInterface.getColumnsCount() > showFilenameColumnThreshold) { holder.getFileName().setVisibility(View.GONE); } else { - if (gridView && ocFileListFragmentInterface.getColumnsCount() > showFilenameColumnThreshold) { - holder.getFileName().setVisibility(View.GONE); - } else { - holder.getFileName().setVisibility(View.VISIBLE); - } + holder.getFileName().setVisibility(View.VISIBLE); } } @@ -807,7 +793,7 @@ public boolean shouldShowHeader() { return false; } - if (MainApp.isOnlyOnDevice()) { + if (MainApp.isOnlyOnDevice() || ocFileListFragmentInterface.isSearchFragment()) { return false; } @@ -1173,6 +1159,7 @@ public void cancelAllPendingTasks() { public void setGridView(boolean bool) { gridView = bool; + ocFileListDelegate.setGridView(bool); } public void setShowMetadata(boolean bool) { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt index e292006ec5f0..519cab22dafd 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt @@ -51,11 +51,12 @@ class OCFileListDelegate( private val storageManager: FileDataStorageManager, private val hideItemOptions: Boolean, private val preferences: AppPreferences, - private val gridView: Boolean, + private var gridView: Boolean, private val transferServiceGetter: ComponentsGetter, private val showMetadata: Boolean, private var showShareAvatar: Boolean, private var viewThemeUtils: ViewThemeUtils, + private val isMediaGallery: Boolean, private val syncFolderProvider: SyncedFolderProvider? = null ) { private val tag = "OCFileListDelegate" @@ -220,7 +221,8 @@ class OCFileListDelegate( shimmerThumbnail, preferences, viewThemeUtils, - syncFolderProvider + syncFolderProvider, + isMediaGallery ) } @@ -254,7 +256,8 @@ class OCFileListDelegate( // shares val shouldHideShare = ( - hideItemOptions || + gridView || // NMC: don't show share icon in grid mode + hideItemOptions || !file.isFolder && file.isEncrypted || file.isEncrypted && @@ -334,9 +337,8 @@ class OCFileListDelegate( private fun setCheckBoxImage(file: OCFile, gridViewHolder: ListViewHolder) { if (isCheckedFile(file)) { - gridViewHolder.checkbox.setImageDrawable( - viewThemeUtils.platform.tintDrawable(context, R.drawable.ic_checkbox_marked, ColorRole.PRIMARY) - ) + // NMC Customization + gridViewHolder.checkbox.setImageResource(R.drawable.ic_checkbox_marked) } else { gridViewHolder.checkbox.setImageResource(R.drawable.ic_checkbox_blank_outline) } @@ -436,6 +438,10 @@ class OCFileListDelegate( showShareAvatar = bool } + fun setGridView(bool: Boolean){ + gridView = bool + } + companion object { private val TAG = OCFileListDelegate::class.java.simpleName } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListGridItemViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListGridItemViewHolder.kt index 05ee4731e994..013d92ca28ef 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListGridItemViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListGridItemViewHolder.kt @@ -53,8 +53,8 @@ internal class OCFileListGridItemViewHolder(var binding: GridItemBinding) : get() = null override val livePhotoIndicatorSeparator: TextView? get() = null - override val fileFeaturesLayout: LinearLayout - get() = binding.fileFeaturesLayout + override val fileFeaturesLayout: LinearLayout? + get() = null override val more: ImageButton get() = binding.more diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java index 0393b5a6c3b7..b7122b58fd16 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java @@ -17,7 +17,6 @@ import android.view.ViewGroup; import android.widget.ImageView; -import com.nextcloud.android.common.ui.theme.utils.ColorRole; import com.nextcloud.client.account.User; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.utils.extensions.ViewExtensionsKt; @@ -152,8 +151,8 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi // checkbox if (isCheckedFile(file)) { - trashbinFileViewHolder.binding.customCheckbox.setImageDrawable( - viewThemeUtils.platform.tintDrawable(context, R.drawable.ic_checkbox_marked, ColorRole.PRIMARY)); + // NMC Customization + trashbinFileViewHolder.binding.customCheckbox.setImageResource(R.drawable.ic_checkbox_marked); } else { trashbinFileViewHolder.binding.customCheckbox.setImageResource(R.drawable.ic_checkbox_blank_outline); } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java index b2688551e50e..dd23dd961624 100755 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java @@ -101,7 +101,8 @@ public void onBindHeaderViewHolder(SectionedViewHolder holder, int section, bool headerViewHolder.binding.uploadListTitle.setText( String.format(parentActivity.getString(R.string.uploads_view_group_header), group.getGroupName(), group.getGroupItemCount())); - viewThemeUtils.platform.colorPrimaryTextViewElement(headerViewHolder.binding.uploadListTitle); + //NMC Customization + headerViewHolder.binding.uploadListTitle.setTextColor(parentActivity.getResources().getColor(R.color.primary, null)); headerViewHolder.binding.uploadListTitle.setOnClickListener(v -> { toggleSectionExpanded(section); diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.kt b/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.kt index 75a75042b949..922883f9925e 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.kt @@ -229,7 +229,8 @@ class ConflictsResolveDialog : DialogFragment(), Injectable { null, syncedFolderProvider.preferences, viewThemeUtils, - syncedFolderProvider + syncedFolderProvider, + false ) } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 5f94428bc426..ee60277fc245 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1742,13 +1742,23 @@ protected void setTitle() { setTitle(R.string.drawer_item_shared); break; default: - setTitle(themeUtils.getDefaultDisplayNameForRootFolder(getContext()), false); + setTitle(themeUtils.getDefaultDisplayNameForRootFolder(getContext()), isRoot()); break; } } } + //NMC Customization + //for NMC we are using defaultToolbar instead searchToolbar for which we needed customization + private boolean isRoot() { + Activity activity; + if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity) { + return ((FileDisplayActivity) activity).isRoot(((FileDisplayActivity) activity).getFile()); + } + return false; + } + protected void prepareActionBarItems(SearchEvent event) { if (event != null) { switch (event.getSearchType()) { @@ -1809,7 +1819,7 @@ public void onMessageEvent(ChangeMenuEvent changeMenuEvent) { ((FileDisplayActivity) activity).initSyncBroadcastReceiver(); } - setTitle(themeUtils.getDefaultDisplayNameForRootFolder(getContext()), false); + setTitle(themeUtils.getDefaultDisplayNameForRootFolder(getContext()), isRoot()); activity.getIntent().removeExtra(OCFileListFragment.SEARCH_EVENT); } diff --git a/app/src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java b/app/src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java index 2d47d841299e..0b6c577e65cc 100644 --- a/app/src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java +++ b/app/src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java @@ -35,4 +35,6 @@ public interface OCFileListFragmentInterface { boolean isLoading(); void onHeaderClicked(); + + boolean isSearchFragment(); } diff --git a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java index ebc9e12a9d3a..76d180835457 100644 --- a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -885,7 +885,8 @@ public static void setThumbnail(OCFile file, LoaderImageView shimmerThumbnail, AppPreferences preferences, ViewThemeUtils viewThemeUtils, - SyncedFolderProvider syncedFolderProvider) { + SyncedFolderProvider syncedFolderProvider, + boolean isMediaGallery) { if (file == null || thumbnailView == null || context == null) { return; } @@ -896,25 +897,32 @@ public static void setThumbnail(OCFile file, } if (file.isFolder()) { - setThumbnailForFolder(file, thumbnailView, shimmerThumbnail, user, syncedFolderProvider, preferences, context, viewThemeUtils); + setThumbnailForFolder(file, thumbnailView, shimmerThumbnail, user, syncedFolderProvider, preferences, context, viewThemeUtils, gridView, isMediaGallery); return; } + // NMC Customization + updateThumbnailViewSize(thumbnailView, gridView, context, isMediaGallery, R.dimen.standard_files_grid_item_size); + if (file.getRemoteId() == null || !file.isPreviewAvailable()) { - setThumbnailFirstTimeForFile(file, thumbnailView, storageManager, asyncTasks, gridView, shimmerThumbnail, user, preferences, context, viewThemeUtils); + setThumbnailFirstTimeForFile(file, thumbnailView, storageManager, asyncTasks, gridView, shimmerThumbnail, user, preferences, context, viewThemeUtils, isMediaGallery); return; } - setThumbnailFromCache(file, thumbnailView, storageManager, asyncTasks, gridView, shimmerThumbnail, user, preferences, context, viewThemeUtils); + setThumbnailFromCache(file, thumbnailView, storageManager, asyncTasks, gridView, shimmerThumbnail, user, preferences, context, viewThemeUtils, isMediaGallery); } - private static void setThumbnailFirstTimeForFile(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils) { + private static void setThumbnailFirstTimeForFile(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils, boolean isMediaGallery) { if (file.getRemoteId() != null) { - generateNewThumbnail(file, thumbnailView, user, storageManager, asyncTasks, gridView, context, shimmerThumbnail, preferences, viewThemeUtils); + generateNewThumbnail(file, thumbnailView, user, storageManager, asyncTasks, gridView, context, shimmerThumbnail, preferences, viewThemeUtils, isMediaGallery); return; } stopShimmer(shimmerThumbnail, thumbnailView); + + // NMC Customization + setThumbnailViewPadding(thumbnailView, gridView, context, isMediaGallery, R.dimen.standard_quarter_padding); + final var icon = MimeTypeUtil.getFileTypeIcon(file.getMimeType(), file.getFileName(), context, viewThemeUtils); thumbnailView.setImageDrawable(icon); } @@ -941,9 +949,14 @@ private static void setThumbnailForOfflineOperation(OCFile file, ImageView thumb } } - private static void setThumbnailForFolder(OCFile file, ImageView thumbnailView, LoaderImageView shimmerThumbnail, User user, SyncedFolderProvider syncedFolderProvider, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils) { + private static void setThumbnailForFolder(OCFile file, ImageView thumbnailView, LoaderImageView shimmerThumbnail, User user, SyncedFolderProvider syncedFolderProvider, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils, boolean gridView, boolean isMediaGallery) { stopShimmer(shimmerThumbnail, thumbnailView); + // NMC Customization + updateThumbnailViewSize(thumbnailView, gridView, context, isMediaGallery, R.dimen.standard_folders_grid_item_size); + //reset the padding as this will change for files and we don't this for folders + thumbnailView.setPadding(0, 0, 0, 0); + boolean isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, user); boolean isDarkModeActive = preferences.isDarkModeEnabled(); @@ -952,22 +965,24 @@ private static void setThumbnailForFolder(OCFile file, ImageView thumbnailView, thumbnailView.setImageDrawable(fileIcon); } - private static void setThumbnailFromCache(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils) { - final var thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId()); + private static void setThumbnailFromCache(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils, boolean isMediaGallery) { + var thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId()); if (thumbnail == null || file.isUpdateThumbnailNeeded()) { - generateNewThumbnail(file, thumbnailView, user, storageManager, asyncTasks, gridView, context, shimmerThumbnail, preferences, viewThemeUtils); + generateNewThumbnail(file, thumbnailView, user, storageManager, asyncTasks, gridView, context, shimmerThumbnail, preferences, viewThemeUtils, isMediaGallery); setThumbnailBackgroundForPNGFileIfNeeded(file, context, thumbnailView); return; } + // NMC Customization + setThumbnailViewPadding(thumbnailView, gridView, context, isMediaGallery, R.dimen.alternate_padding); + stopShimmer(shimmerThumbnail, thumbnailView); if (MimeTypeUtil.isVideo(file)) { - final var withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail, context); - thumbnailView.setImageBitmap(withOverlay); - } else { - BitmapUtils.setRoundedBitmapAccordingToListType(gridView, thumbnail, thumbnailView); + thumbnail = ThumbnailsCacheManager.addVideoOverlay(thumbnail, context); } + // NMC: set the corner for both video and image thumbnail + BitmapUtils.setRoundedBitmapAccordingToListType(gridView, thumbnail, thumbnailView); setThumbnailBackgroundForPNGFileIfNeeded(file, context, thumbnailView); } @@ -988,7 +1003,8 @@ private static void generateNewThumbnail(OCFile file, Context context, LoaderImageView shimmerThumbnail, AppPreferences preferences, - ViewThemeUtils viewThemeUtils) { + ViewThemeUtils viewThemeUtils, + boolean isMediaGallery) { if (!ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, thumbnailView)) { return; } @@ -1033,6 +1049,10 @@ private static void generateNewThumbnail(OCFile file, int px = ThumbnailsCacheManager.getThumbnailDimension(); thumbnail = BitmapUtils.drawableToBitmap(drawable, px, px); + + //NMC: set thumbnailView padding for no thumbnail + setThumbnailViewPadding(thumbnailView, gridView, context, isMediaGallery, R.dimen.standard_quarter_padding); + final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable = new ThumbnailsCacheManager.AsyncThumbnailDrawable(context.getResources(), thumbnail, task); @@ -1040,9 +1060,6 @@ private static void generateNewThumbnail(OCFile file, if (shimmerThumbnail != null) { shimmerThumbnail.postDelayed(() -> { if (thumbnailView.getDrawable() == null) { - if (gridView) { - configShimmerGridImageSize(shimmerThumbnail, preferences.getGridColumns()); - } startShimmer(shimmerThumbnail, thumbnailView); } }, 100); @@ -1114,4 +1131,41 @@ private static Point getScreenSize(Context context) throws Exception { throw new Exception("WindowManager not found"); } } + + /** + * method to set the padding to thumbnail view this is required for files so that there will be space between file + * and file name + * + * @param thumbnailView + * @param gridView + * @param context + * @param isMediaGallery + * @param dimensPadding + */ + private static void setThumbnailViewPadding(ImageView thumbnailView, boolean gridView, Context context, + boolean isMediaGallery, int dimensPadding) { + if (gridView && !isMediaGallery) { + int padding = context.getResources().getDimensionPixelSize(dimensPadding); + thumbnailView.setPadding(0, 0, 0, padding); + } + } + + /** + * method to set manual thumbnail view height and width for folders and files because we are using different size + * for both files and folders + * + * @param thumbnailView + * @param gridView + * @param context + * @param isMediaGallery + * @param size + */ + private static void updateThumbnailViewSize(ImageView thumbnailView, boolean gridView, Context context, + boolean isMediaGallery, int size) { + if (gridView && !isMediaGallery) { + thumbnailView.getLayoutParams().width = + context.getResources().getDimensionPixelSize(size); + thumbnailView.getLayoutParams().height = context.getResources().getDimensionPixelSize(size); + } + } } diff --git a/app/src/main/res/drawable/cursor_drawable.xml b/app/src/main/res/drawable/cursor_drawable.xml new file mode 100644 index 000000000000..dd35b659e8ae --- /dev/null +++ b/app/src/main/res/drawable/cursor_drawable.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_edit_image.xml b/app/src/main/res/layout/activity_edit_image.xml index 4b11869ee501..257ba56fa732 100644 --- a/app/src/main/res/layout/activity_edit_image.xml +++ b/app/src/main/res/layout/activity_edit_image.xml @@ -12,15 +12,10 @@ android:layout_height="match_parent" android:background="@color/black"> - + + + app:layout_constraintTop_toBottomOf="@+id/appbar" /> @@ -82,7 +81,7 @@ android:layout_height="wrap_content" android:text="@string/daily_backup" android:textColor="@color/text_color" - android:textSize="@dimen/two_line_primary_text_size" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/file_thumbnail.xml b/app/src/main/res/layout/file_thumbnail.xml index 6f318d47e9b3..b7a842e4d78d 100644 --- a/app/src/main/res/layout/file_thumbnail.xml +++ b/app/src/main/res/layout/file_thumbnail.xml @@ -24,7 +24,7 @@ android:layout_width="@dimen/file_icon_size" android:layout_height="@dimen/file_icon_size" android:contentDescription="@null" - android:src="@drawable/folder" /> + tools:src="@drawable/folder" /> - - - - - + android:layout_height="0.5dp" + android:background="@color/divider_color" /> - + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:gravity="center" + android:orientation="vertical"> - - + android:layout_width="match_parent" + android:layout_height="wrap_content"> - + - + android:layout_gravity="center_horizontal" + app:layout_constraintBottom_toTopOf="@+id/Filename" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent"> + + + android:id="@+id/thumbnail" + android:layout_width="@dimen/standard_folders_grid_item_size" + android:layout_height="@dimen/standard_folders_grid_item_size" + android:layout_gravity="center" + android:contentDescription="@null" + android:src="@drawable/folder" + tools:visibility="visible" /> + app:tint="@color/list_icon_color" /> + android:visibility="gone" /> + android:src="@drawable/ic_synced" /> + + - + + app:layout_constraintBottom_toTopOf="@+id/gridItemGuideline" + app:layout_constraintStart_toStartOf="@+id/frameLayout" /> + app:srcCompat="@drawable/ic_dots_vertical" + app:tint="@color/list_icon_color" + tools:ignore="TouchTargetSizeCheck" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml index d275c2b82932..676973df89ce 100644 --- a/app/src/main/res/layout/list_item.xml +++ b/app/src/main/res/layout/list_item.xml @@ -15,19 +15,17 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ListItemLayout" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="@dimen/standard_list_item_size" android:baselineAligned="false" android:descendantFocusability="blocksDescendants" - android:minHeight="@dimen/standard_list_item_size" - android:orientation="horizontal" - android:paddingTop="@dimen/standard_half_padding" - android:paddingBottom="@dimen/standard_half_padding"> + android:orientation="horizontal"> + android:layout_marginEnd="@dimen/standard_quarter_padding" + android:layout_marginBottom="@dimen/standard_padding"> + android:paddingTop="@dimen/standard_padding"> + tools:visibility="visible" + app:tint="@color/list_icon_color" /> @@ -274,15 +269,15 @@ + android:src="@drawable/ic_dots_vertical" + app:tint="@color/list_icon_color" /> diff --git a/app/src/main/res/layout/receive_external_files.xml b/app/src/main/res/layout/receive_external_files.xml index 1f85eae78a32..d25f4afcafb3 100644 --- a/app/src/main/res/layout/receive_external_files.xml +++ b/app/src/main/res/layout/receive_external_files.xml @@ -11,6 +11,7 @@ android:id="@+id/upload_files_layout" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/bg_default" android:orientation="vertical"> @@ -219,6 +220,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="marquee" + android:maxLines="2" android:text="@string/instant_upload_existing" android:textAppearance="?attr/textAppearanceListItem" /> diff --git a/app/src/main/res/layout/trashbin_item.xml b/app/src/main/res/layout/trashbin_item.xml index 4d248ffd8fb5..e3c2ede36211 100644 --- a/app/src/main/res/layout/trashbin_item.xml +++ b/app/src/main/res/layout/trashbin_item.xml @@ -6,6 +6,7 @@ ~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only --> + android:src="@drawable/ic_history" + app:tint="@color/list_icon_color"/> + android:src="@drawable/ic_dots_vertical" + app:tint="@color/list_icon_color"/> diff --git a/app/src/main/res/layout/upload_files_layout.xml b/app/src/main/res/layout/upload_files_layout.xml index 4012193eb6a9..b5d4e9e90fec 100644 --- a/app/src/main/res/layout/upload_files_layout.xml +++ b/app/src/main/res/layout/upload_files_layout.xml @@ -26,17 +26,10 @@ android:layout_height="0dp" android:layout_weight="1" /> - - - - - + android:layout_height="0.5dp" + android:background="@color/divider_color" /> Herunterladen Video Überlagerungsicon Bitte warten… + Bitte geben Sie unter Apps & Benachrichtigungen in den Einstellungen manuell die Erlaubnis. Überprüfe gespeicherte Anmeldeinformationen Kopiere Datei von privatem Speicher Das Ändern der Erweiterung kann dazu führen, dass diese Datei in einer anderen Anwendung geöffnet wird diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index db1e1d218038..e5a35a1a4f44 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -7,6 +7,7 @@ --> + @color/grey_30 #E3E3E3 #000000 #ff6F6F6F @@ -25,7 +26,7 @@ @color/appbar - #373535 + @color/grey_70 #222222 #DADADA @@ -35,8 +36,73 @@ @color/white - #1E1E1E + #121212 @android:color/white #101418 + + + #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..167139478049 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -23,5 +23,8 @@ @style/Nextcloud.Widget.PopupMenu @style/ThemeOverlay.App.BottomSheetDialog @style/App.ActionMode + + @style/AutoCompleteCursorColorStyle + @style/AutoCompleteCursorColorStyle diff --git a/app/src/main/res/values-sw600dp/dims.xml b/app/src/main/res/values-sw600dp/dims.xml index 7436d593a3c5..a32fc3e858d1 100644 --- a/app/src/main/res/values-sw600dp/dims.xml +++ b/app/src/main/res/values-sw600dp/dims.xml @@ -8,5 +8,7 @@ --> 6 + 32dp + 16dp 512dp diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 4095ec7508a1..0460a542f3c4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,11 +10,12 @@ ~ SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only) --> - @color/secondary_text_color + @color/grey_600 #000000 #ffffff #B3FFFFFF - #333333 + #191919 + #F5F5F5 #303034 #E9E8EB @color/secondary_text_color @@ -25,7 +26,7 @@ #DDDDDD #EEEEEE #00000000 - #666666 + @color/grey_30 #e53935 @@ -65,17 +66,107 @@ #40162233 - @color/fontAppbar - #ECECEC + @color/white + @color/grey_0 #757575 #616161 - #80000000 + #919191 @android:color/white - #666666 + #191919 #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..cc023ec9c6e1 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,32 @@ + + + 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 + \ No newline at end of file diff --git a/app/src/main/res/values/dims.xml b/app/src/main/res/values/dims.xml index 316c12ef4906..f2c463287bbf 100644 --- a/app/src/main/res/values/dims.xml +++ b/app/src/main/res/values/dims.xml @@ -22,7 +22,7 @@ 100dp 128dp 8dp - 3dp + 4dp 512 28dp 16dp @@ -78,7 +78,7 @@ 15dp 40dp 240dp - 16sp + 14sp 200dp 20dp 12sp @@ -119,11 +119,13 @@ 40dp 72dp 72dp + 24dp + 24dp 22sp 14dp 14dp - 12dp - 12dp + 24dp + 24dp 72dp 72dp 26sp diff --git a/app/src/main/res/values/setup.xml b/app/src/main/res/values/setup.xml index afed2dafe23a..52a9d6fc7ec0 100644 --- a/app/src/main/res/values/setup.xml +++ b/app/src/main/res/values/setup.xml @@ -58,7 +58,7 @@ -1 /.Calendar-Backup - true + false true diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cf1866a5a7d4..42330aa6d8a4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1182,6 +1182,7 @@ Link Name Delete Link Settings + Please navigate to App info in settings and give permission manually. Confirm Destination filename Suggest diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 08ebf4b5f8c7..06ba6651f811 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -32,6 +32,9 @@ @color/bg_default @style/Widget.App.TextInputLayout @dimen/dialogBorderRadius + + @style/AutoCompleteCursorColorStyle + @style/AutoCompleteCursorColorStyle + +