From 568d42c0f3bbc2613b585cf382973b5b0207ed14 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 NMC-4633: disable permission check in search screen Media View multi-selection customized NMC-4799: uploads screen icon color fix NMC-4862: deactivate github report snackbar Added androidTest to verify colors, strings, dimens customized in this branch PR for NMC. --- .../java/com/nmc/android/AppColorTest.kt | 363 ++++++++++++++++++ .../nmc/android/GeneralThemingResourceTest.kt | 275 +++++++++++++ app/src/main/AndroidManifest.xml | 3 + .../client/database/NextcloudDatabase.kt | 5 +- .../client/editimage/EditImageActivity.kt | 42 +- .../client/errorhandling/ShowErrorActivity.kt | 6 +- .../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 | 41 +- .../ui/activity/FileDisplayActivity.kt | 3 + .../android/ui/activity/PassCodeActivity.kt | 13 - .../android/ui/adapter/GalleryAdapter.kt | 3 +- .../android/ui/adapter/GalleryRowHolder.kt | 16 +- .../ui/adapter/LocalFileListAdapter.java | 5 +- .../android/ui/adapter/OCFileListAdapter.java | 5 +- .../android/ui/adapter/OCFileListDelegate.kt | 19 +- .../adapter/OCFileListGridItemViewHolder.kt | 4 +- .../ui/adapter/OCFileListViewHolder.kt | 4 +- .../ui/adapter/TrashbinListAdapter.java | 5 +- .../UnifiedSearchCurrentDirItemViewHolder.kt | 3 +- .../android/ui/adapter/UploadListAdapter.java | 3 +- .../ui/dialog/ConflictsResolveDialog.kt | 3 +- .../ui/fragment/OCFileListFragment.java | 14 +- .../ui/fragment/UnifiedSearchFragment.kt | 5 +- .../owncloud/android/utils/DisplayUtils.java | 93 ++++- 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 | 4 +- app/src/main/res/layout/grid_item.xml | 116 +++--- app/src/main/res/layout/list_item.xml | 47 ++- .../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 +- .../main/res/layout/upload_list_header.xml | 7 +- app/src/main/res/layout/upload_list_item.xml | 4 +- 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 + 53 files changed, 1257 insertions(+), 236 deletions(-) create mode 100644 app/src/androidTest/java/com/nmc/android/AppColorTest.kt create mode 100644 app/src/androidTest/java/com/nmc/android/GeneralThemingResourceTest.kt 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 diff --git a/app/src/androidTest/java/com/nmc/android/AppColorTest.kt b/app/src/androidTest/java/com/nmc/android/AppColorTest.kt new file mode 100644 index 000000000000..cffd91becec9 --- /dev/null +++ b/app/src/androidTest/java/com/nmc/android/AppColorTest.kt @@ -0,0 +1,363 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2025 TSI-mc + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nmc.android + +import android.content.Context +import android.content.res.Configuration +import android.graphics.Color +import androidx.core.content.ContextCompat +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.owncloud.android.R +import junit.framework.TestCase.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Test class to verify the colors customized in this branch PR for NMC + */ +@RunWith(AndroidJUnit4::class) +class AppColorTest { + private val expectedColorMap = mapOf( + R.color.list_item_lastmod_and_filesize_text to ExpectedColor( + light = "#666666", + dark = "#B2B2B2" + ), + R.color.text_color to ExpectedColor( + light = "#191919", + dark = "#E3E3E3" + ), + R.color.light_grey to ExpectedColor( + light = "#F5F5F5", + dark = "#F5F5F5" // same for light and dark + ), + R.color.secondary_text_color to ExpectedColor( + light = "#B2B2B2", + dark = "#A5A5A5" + ), + R.color.action_mode_background to ExpectedColor( + light = "#FFFFFF", + dark = "#121212" + ), + R.color.selected_item_background to ExpectedColor( + light = "#F2F2F2", + dark = "#4C4C4C" + ), + R.color.drawer_active_item_background to ExpectedColor( + light = "#919191", + dark = "#FFFFFF" + ), + R.color.fontAppbar to ExpectedColor( + light = "#191919", + dark = "#FFFFFF" + ), + R.color.icon_color to ExpectedColor( + light = "#191919", + dark = "#FFFFFF" + ), + R.color.sort_text_color to ExpectedColor( + light = "#E20074", // primary magenta color + dark = "#B2B2B2" + ), + R.color.list_icon_color to ExpectedColor( + light = "#191919", + dark = "#B2B2B2" + ), + R.color.warning_icon_color to ExpectedColor( + light = "#191919", + dark = "#CCCCCC" + ), + R.color.divider_color to ExpectedColor( + light = "#B2B2B2", + dark = "#4C4C4C" + ), + R.color.spinner_bg_color to ExpectedColor( + light = "#FFFFFF", + dark = "#333333" + ), + R.color.refresh_layout_bg_color to ExpectedColor( + light = "#FFFFFF", + dark = "#2D2D2D" + ), + R.color.primary_button_disabled_color to ExpectedColor( + light = "#F2F2F2", + dark = "#4C4C4C" + ), + R.color.toolbar_divider_color to ExpectedColor( + light = "#CCCCCC", + dark = "#4C4C4C" + ), + R.color.et_highlight_color to ExpectedColor( + light = "#77c4ff", + dark = "#77c4ff" // same for light and dark + ), + R.color.white_trans_70 to ExpectedColor( + light = "#B3FFFFFF", + dark = "#B3FFFFFF" // same for light and dark + ), + R.color.progress_bar_background to ExpectedColor( + light = "#E5E5E5", + dark = "#E5E5E5" // same for light and dark + ), + R.color.dark_grey to ExpectedColor( + light = "#101010", + dark = "#101010" // same for light and dark + ), + R.color.grey_0 to ExpectedColor( + light = "#F2F2F2", + dark = "#F2F2F2" // same for light and dark + ), + R.color.grey_10 to ExpectedColor( + light = "#E5E5E5", + dark = "#E5E5E5" // same for light and dark + ), + R.color.grey_30 to ExpectedColor( + light = "#B2B2B2", + dark = "#B2B2B2" // same for light and dark + ), + R.color.grey_60 to ExpectedColor( + light = "#666666", + dark = "#666666" // same for light and dark + ), + R.color.grey_70 to ExpectedColor( + light = "#4C4C4C", + dark = "#4C4C4C" // same for light and dark + ), + R.color.grey_80 to ExpectedColor( + light = "#333333", + dark = "#333333" // same for light and dark + ), + R.color.snackbar_bg_color to ExpectedColor( + light = "#323232", + dark = "#333333" + ), + R.color.snackbar_txt_color to ExpectedColor( + light = "#FFFFFF", + dark = "#F2F2F2" + ), + R.color.alert_bg_color to ExpectedColor( + light = "#FFFFFF", + dark = "#333333" + ), + R.color.alert_txt_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.nav_selected_bg_color to ExpectedColor( + light = "#F2F2F2", + dark = "#666666" + ), + R.color.nav_txt_unselected_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.nav_txt_selected_color to ExpectedColor( + light = "#E20074", // primary magenta color + dark = "#F2F2F2" + ), + R.color.nav_icon_unselected_color to ExpectedColor( + light = "#191919", + dark = "#B2B2B2" + ), + R.color.nav_icon_selected_color to ExpectedColor( + light = "#E20074", // primary magenta color + dark = "#FFFFFF" + ), + R.color.nav_divider_color to ExpectedColor( + light = "#B2B2B2", + dark = "#B2B2B2" // same for light and dark + ), + R.color.nav_bg_color to ExpectedColor( + light = "#FFFFFF", + dark = "#333333" + ), + R.color.drawer_quota_txt_color to ExpectedColor( + light = "#191919", + dark = "#FFFFFF" + ), + R.color.bottom_sheet_bg_color to ExpectedColor( + light = "#FFFFFF", + dark = "#333333" + ), + R.color.bottom_sheet_icon_color to ExpectedColor( + light = "#191919", + dark = "#B2B2B2" + ), + R.color.bottom_sheet_txt_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.popup_menu_bg to ExpectedColor( + light = "#FFFFFF", + dark = "#333333" + ), + R.color.popup_menu_txt_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.overflow_bg_color to ExpectedColor( + light = "#FFFFFF", + dark = "#333333" + ), + R.color.switch_thumb_checked_enabled to ExpectedColor( + light = "#E20074", // primary magenta color + dark = "#E20074", // same for light and dark + ), + R.color.switch_track_checked_enabled to ExpectedColor( + light = "#F399C7", + dark = "#F399C7" // same for light and dark + ), + R.color.switch_thumb_unchecked_enabled to ExpectedColor( + light = "#FFFFFF", + dark = "#FFFFFF" // same for light and dark + ), + R.color.switch_track_unchecked_enabled to ExpectedColor( + light = "#B2B2B2", + dark = "#B2B2B2" // same for light and dark + ), + R.color.switch_thumb_disabled to ExpectedColor( + light = "#E5E5E5", + dark = "#4C4C4C" + ), + R.color.switch_track_disabled to ExpectedColor( + light = "#F2F2F2", + dark = "#666666" + ), + R.color.checkbox_checked_enabled to ExpectedColor( + light = "#E20074", // primary magenta color + dark = "#E20074", // same for light and dark + ), + R.color.checkbox_unchecked_enabled to ExpectedColor( + light = "#B2B2B2", + dark = "#B2B2B2" // same for light and dark + ), + R.color.checkbox_checked_disabled to ExpectedColor( + light = "#B2B2B2", + dark = "#4C4C4C" + ), + R.color.checkbox_unchecked_disabled to ExpectedColor( + light = "#CCCCCC", + dark = "#4C4C4C" + ), + R.color.share_title_txt_color to ExpectedColor( + light = "#191919", + dark = "#FFFFFF" + ), + R.color.share_subtitle_txt_color to ExpectedColor( + light = "#B2B2B2", + dark = "#B2B2B2" + ), + R.color.share_info_txt_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.share_search_border_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.share_btn_txt_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.share_list_item_txt_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.share_disabled_txt_color to ExpectedColor( + light = "#B2B2B2", + dark = "#666666" + ), + R.color.share_txt_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.share_et_divider to ExpectedColor( + light = "#000000", + dark = "#FFFFFF" + ), + R.color.share_warning_txt_color to ExpectedColor( + light = "#191919", + dark = "#191919" // same for light and dark + ), + R.color.sharing_warning_bg_color to ExpectedColor( + light = "#F6E5EB", + dark = "#F6E5EB" // same for light and dark + ), + R.color.sharing_warning_border_color to ExpectedColor( + light = "#C16F81", + dark = "#C16F81" // same for light and dark + ), + R.color.share_color to ExpectedColor( + light = "#0D39DF", + dark = "#0D39DF" // same for light and dark + ), + R.color.shared_with_me_color to ExpectedColor( + light = "#0099ff", + dark = "#0099ff" // same for light and dark + ), + R.color.share_blue_color to ExpectedColor( + light = "#2238df", + dark = "#7d94f9" + ), + R.color.scan_doc_bg_color to ExpectedColor( + light = "#F2F2F2", + dark = "#121212" + ), + R.color.scan_text_color to ExpectedColor( + light = "#191919", + dark = "#F2F2F2" + ), + R.color.scan_edit_bottom_color to ExpectedColor( + light = "#F2F2F2", + dark = "#333333" + ), + R.color.scan_count_bg_color to ExpectedColor( + light = "#B2B2B2", + dark = "#333333" + ), + R.color.neptune to ExpectedColor( + light = "#77b6bb", + dark = "#77b6bb" // same for light and dark + ), + R.color.neptune_50 to ExpectedColor( + light = "#5077b6bb", + dark = "#5077b6bb" // same for light and dark + ), + ) + + @Test + fun validateLightModeColors() { + validateColors(Configuration.UI_MODE_NIGHT_NO) { Color.parseColor(it.light) } + } + + @Test + fun validateDarkModeColors() { + validateColors(Configuration.UI_MODE_NIGHT_YES) { Color.parseColor(it.dark) } + } + + private fun validateColors( + nightMode: Int, + expectedSelector: (ExpectedColor) -> Int + ) { + val appContext = ApplicationProvider.getApplicationContext() + val conf = Configuration(appContext.resources.configuration) + conf.uiMode = (conf.uiMode and Configuration.UI_MODE_NIGHT_MASK.inv()) or nightMode + val ctx = appContext.createConfigurationContext(conf) + + expectedColorMap.forEach { (colorRes, expectedColor) -> + val expected = expectedSelector(expectedColor) + val actual = ContextCompat.getColor(ctx, colorRes) + assertEquals( + "Color mismatch: ${ctx.resources.getResourceName(colorRes)}", + expected, actual + ) + } + } + + data class ExpectedColor(val light: String, val dark: String) +} diff --git a/app/src/androidTest/java/com/nmc/android/GeneralThemingResourceTest.kt b/app/src/androidTest/java/com/nmc/android/GeneralThemingResourceTest.kt new file mode 100644 index 000000000000..61440cb5f62c --- /dev/null +++ b/app/src/androidTest/java/com/nmc/android/GeneralThemingResourceTest.kt @@ -0,0 +1,275 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2025 TSI-mc + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nmc.android + +import android.content.Context +import android.content.res.Configuration +import android.util.DisplayMetrics +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.owncloud.android.R +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import java.util.Locale + +/** + * Test class to verify the strings, dimens and bool customized in this branch PR for NMC + */ +@RunWith(AndroidJUnit4::class) +class GeneralThemingResourceTest { + + private val baseContext = ApplicationProvider.getApplicationContext() + + private val localizedStringMap = mapOf( + R.string.camera_permission_rationale to ExpectedLocalizedString( + translations = mapOf( + Locale.ENGLISH to "Please navigate to App info in settings and give permission manually.", + Locale.GERMAN to "Bitte geben Sie unter Apps & Benachrichtigungen in den Einstellungen manuell die Erlaubnis." + ) + ), + ) + + @Test + fun verifyLocalizedStrings() { + localizedStringMap.forEach { (stringRes, expected) -> + expected.translations.forEach { (locale, expectedText) -> + + val config = Configuration(baseContext.resources.configuration) + config.setLocale(locale) + + val localizedContext = baseContext.createConfigurationContext(config) + val actualText = localizedContext.getString(stringRes) + + assertEquals( + "Mismatch for ${baseContext.resources.getResourceEntryName(stringRes)} in $locale", + expectedText, + actualText + ) + } + } + } + + data class ExpectedLocalizedString(val translations: Map) + + private val expectedDimenMap = mapOf( + R.dimen.grid_recyclerview_padding to ExpectedDimen( + default = 4f, + unit = DimenUnit.DP + ), + R.dimen.list_item_icons_size to ExpectedDimen( + default = 16f, + unit = DimenUnit.DP + ), + R.dimen.grid_item_icons_size to ExpectedDimen( + default = 24f, + unit = DimenUnit.DP + ), + R.dimen.grid_item_shared_icon_layout_top_margin to ExpectedDimen( + default = 24f, + unit = DimenUnit.DP + ), + R.dimen.media_grid_item_rv_spacing to ExpectedDimen( + default = 6f, + unit = DimenUnit.DP + ), + R.dimen.txt_size_18sp to ExpectedDimen( + default = 18f, + unit = DimenUnit.SP + ), + R.dimen.txt_size_15sp to ExpectedDimen( + default = 15f, + unit = DimenUnit.SP + ), + R.dimen.crop_corner_size to ExpectedDimen( + default = 15f, + unit = DimenUnit.DP + ), + R.dimen.edit_scan_bottom_bar_height to ExpectedDimen( + default = 56f, + unit = DimenUnit.DP + ), + R.dimen.standard_folders_grid_item_size to ExpectedDimen( + default = 86f, + unit = DimenUnit.DP + ), + R.dimen.standard_files_grid_item_size to ExpectedDimen( + default = 80f, + unit = DimenUnit.DP + ), + R.dimen.txt_size_11sp to ExpectedDimen( + default = 11f, + unit = DimenUnit.SP + ), + R.dimen.share_row_icon_size to ExpectedDimen( + default = 30f, + unit = DimenUnit.DP + ), + R.dimen.create_link_button_height to ExpectedDimen( + default = 55f, + unit = DimenUnit.DP + ), + R.dimen.note_et_height to ExpectedDimen( + default = 258f, + unit = DimenUnit.DP + ), + R.dimen.txt_size_17sp to ExpectedDimen( + default = 17f, + unit = DimenUnit.SP + ), + R.dimen.share_exp_date_divider_margin to ExpectedDimen( + default = 20f, + unit = DimenUnit.DP + ), + R.dimen.privacy_btn_width to ExpectedDimen( + default = 160f, + unit = DimenUnit.DP + ), + R.dimen.privacy_icon_size to ExpectedDimen( + default = 50f, + unit = DimenUnit.DP + ), + R.dimen.login_btn_width to ExpectedDimen( + default = 150f, + unit = DimenUnit.DP + ), + R.dimen.login_btn_height to ExpectedDimen( + default = 55f, + unit = DimenUnit.DP + ), + R.dimen.login_btn_bottom_margin to ExpectedDimen( + default = 48f, + unit = DimenUnit.DP + ), + R.dimen.login_btn_bottom_margin_land to ExpectedDimen( + default = 48f, + unit = DimenUnit.DP + ), + R.dimen.login_btn_bottom_margin_small_screen to ExpectedDimen( + default = 24f, + unit = DimenUnit.DP + ), + R.dimen.shared_with_me_icon_size to ExpectedDimen( + default = 26f, + unit = DimenUnit.DP + ), + R.dimen.txt_size_20sp to ExpectedDimen( + default = 20f, + unit = DimenUnit.SP + ), + R.dimen.notification_row_item_height to ExpectedDimen( + default = 145f, + unit = DimenUnit.DP + ), + R.dimen.button_stroke_width to ExpectedDimen( + default = 1f, + unit = DimenUnit.DP + ), + R.dimen.txt_size_13sp to ExpectedDimen( + default = 13f, + unit = DimenUnit.SP + ), + R.dimen.file_icon_rounded_corner_radius_for_grid_mode to ExpectedDimen( + default = 4f, + unit = DimenUnit.DP, + alt = 16f + ), + R.dimen.file_icon_rounded_corner_radius to ExpectedDimen( + default = 8f, + unit = DimenUnit.DP, + alt = 32f + ), + R.dimen.grid_item_text_size to ExpectedDimen( + default = 14f, + unit = DimenUnit.SP + ), + R.dimen.grid_item_local_file_indicator_layout_width to ExpectedDimen( + default = 24f, + unit = DimenUnit.DP + ), + R.dimen.grid_item_local_file_indicator_layout_height to ExpectedDimen( + default = 24f, + unit = DimenUnit.DP + ), + R.dimen.list_item_local_file_indicator_layout_width to ExpectedDimen( + default = 24f, + unit = DimenUnit.DP + ), + R.dimen.list_item_local_file_indicator_layout_height to ExpectedDimen( + default = 24f, + unit = DimenUnit.DP + ), + ) + + @Test + fun validateDefaultDimens() { + validateDimens( + configModifier = { it }, // no change → default values + ) { it.default to it.unit } + } + + @Test + fun validate_sw600dp_Dimens() { + validateDimens(configModifier = { config -> + config.smallestScreenWidthDp = 600 + config + }) { it.alt to it.unit } + } + + private fun validateDimens( + configModifier: (Configuration) -> Configuration, + selector: (ExpectedDimen) -> Pair + ) { + val baseConfig = Configuration(baseContext.resources.configuration) + val testConfig = configModifier(baseConfig) + val testContext = baseContext.createConfigurationContext(testConfig) + val dm = testContext.resources.displayMetrics + val config = testContext.resources.configuration + expectedDimenMap.forEach { (resId, entry) -> + val (value, unit) = selector(entry) + val actualPx = testContext.resources.getDimension(resId) + value?.let { + val expectedPx = convertToPx(value, unit, dm, config) + assertEquals( + "Mismatch for ${testContext.resources.getResourceEntryName(resId)} ($unit)", + expectedPx, + actualPx, + 0.01f + ) + } + } + } + + private fun convertToPx( + value: Float, + unit: DimenUnit, + dm: DisplayMetrics, + config: Configuration + ): Float { + return when (unit) { + DimenUnit.DP -> value * dm.density + DimenUnit.SP -> value * dm.density * config.fontScale + DimenUnit.PX -> value + } + } + + data class ExpectedDimen( + val default: Float, + val alt: Float? = null, + val unit: DimenUnit, + ) + + enum class DimenUnit { DP, SP, PX } + + @Test + fun assertShowCalendarBackupBooleanFalse() { + val actualValue = baseContext.resources.getBoolean(R.bool.show_calendar_backup) + assertTrue(!actualValue) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 940739adb944..159885d4c57c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -278,6 +278,7 @@ android:exported="false" /> @@ -305,6 +306,7 @@ android:exported="false" /> @@ -417,6 +419,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 b4833d456d24..13eab045f573 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; @@ -106,7 +106,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; @@ -214,7 +214,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 08250553fd6c..6d61a48a6af7 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -40,6 +40,7 @@ import com.nextcloud.utils.BitmapExtensionsKt; import com.nextcloud.utils.extensions.OCFileExtensionsKt; import com.nextcloud.utils.extensions.OwnCloudClientExtensionsKt; +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; @@ -135,7 +136,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 @@ -152,7 +153,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; } } @@ -582,13 +583,13 @@ private Bitmap doThumbnailFromOCFileInBackground() { if (!updateEnforced) { thumbnail = getBitmapFromDiskCache(imageKey); if (thumbnail != null) { - Log_OC.d(TAG, "Thumbnail found in disk cache for file: " + file.getFileName()); + Log_NMC.d(TAG, "Thumbnail found in disk cache for file: " + file.getFileName()); return thumbnail; } else { - Log_OC.d(TAG, "Thumbnail not found in cache for file: " + file.getFileName()); + Log_NMC.d(TAG, "Thumbnail not found in cache for file: " + file.getFileName()); } } else { - Log_OC.d(TAG, "Thumbnail update enforced for file: " + file.getFileName()); + Log_NMC.d(TAG, "Thumbnail update enforced for file: " + file.getFileName()); thumbnail = null; } @@ -598,7 +599,7 @@ private Bitmap doThumbnailFromOCFileInBackground() { // Generate thumbnail from local file if available if (file instanceof OCFile ocFile && ocFile.isDown()) { - Log_OC.d(TAG, "Generating thumbnail from local file: " + ocFile.getFileName()); + Log_NMC.d(TAG, "Generating thumbnail from local file: " + ocFile.getFileName()); Bitmap bitmap; if (MimeTypeUtil.isVideo(ocFile)) { @@ -630,15 +631,15 @@ private Bitmap doThumbnailFromOCFileInBackground() { if (resizedImage != null) { thumbnail = ThumbnailUtils.extractThumbnail(resizedImage, pxW, pxH); - Log_OC.d(TAG, "Thumbnail generated from resized image cache for file: " + file.getFileName()); + Log_NMC.d(TAG, "Thumbnail generated from resized image cache for file: " + file.getFileName()); } else { - Log_OC.d(TAG, "No resized image cache available for file: " + file.getFileName()); + Log_NMC.d(TAG, "No resized image cache available for file: " + file.getFileName()); } } // Download thumbnail from server if still null if (thumbnail == null && mClient != null) { - Log_OC.d(TAG, "Attempting to download thumbnail from server for file: " + file.getFileName()); + Log_NMC.d(TAG, "Attempting to download thumbnail from server for file: " + file.getFileName()); GetMethod getMethod = null; try { @@ -652,7 +653,7 @@ private Bitmap doThumbnailFromOCFileInBackground() { + file.getLocalId() + "&x=" + pxW + "&y=" + pxH; } - Log_OC.d(TAG, "Downloading thumbnail URI: " + uri); + Log_NMC.d(TAG, "Downloading thumbnail URI: " + uri); getMethod = new GetMethod(uri); getMethod.setRequestHeader("Cookie", "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true"); @@ -665,9 +666,9 @@ private Bitmap doThumbnailFromOCFileInBackground() { Bitmap bitmap = BitmapFactory.decodeStream(inputStream); if (bitmap != null) { thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH); - Log_OC.d(TAG, "Thumbnail downloaded and extracted for file: " + file.getFileName()); + Log_NMC.d(TAG, "Thumbnail downloaded and extracted for file: " + file.getFileName()); } else { - Log_OC.w(TAG, "Downloaded thumbnail bitmap is null for file: " + file.getFileName()); + Log_NMC.w(TAG, "Downloaded thumbnail bitmap is null for file: " + file.getFileName()); } } } else { @@ -677,7 +678,7 @@ private Bitmap doThumbnailFromOCFileInBackground() { if (thumbnail != null && PNG_MIMETYPE.equalsIgnoreCase(file.getMimeType())) { thumbnail = handlePNG(thumbnail, pxW, pxH); - Log_OC.d(TAG, "Handled PNG thumbnail for downloaded file: " + file.getFileName()); + Log_NMC.d(TAG, "Handled PNG thumbnail for downloaded file: " + file.getFileName()); } } catch (Exception e) { Log_OC.e(TAG, "Exception downloading thumbnail for file: " + file.getFileName(), e); @@ -690,10 +691,10 @@ private Bitmap doThumbnailFromOCFileInBackground() { // Add to disk cache if obtained if (thumbnail != null) { - Log_OC.d(TAG, "Adding final thumbnail to cache for file: " + file.getFileName()); + Log_NMC.d(TAG, "Adding final thumbnail to cache for file: " + file.getFileName()); addBitmapToCache(imageKey, thumbnail); } else { - Log_OC.w(TAG, "Failed to obtain thumbnail for file: " + file.getFileName()); + Log_NMC.w(TAG, "Failed to obtain thumbnail for file: " + file.getFileName()); } return thumbnail; @@ -848,7 +849,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) { @@ -955,7 +956,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 @@ -1206,7 +1207,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"); @@ -1229,7 +1230,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) { @@ -1280,7 +1281,7 @@ public static Bitmap doResizedImageInBackground(OCFile file, FileDataStorageMana try { String uri = OwnCloudClientExtensionsKt.getPreviewEndpoint(mClient, file.getLocalId(), pxW, pxH); - Log_OC.d(TAG, "generating resized image: " + file.getFileName() + " URI: " + uri); + Log_NMC.d(TAG, "generating resized image: " + file.getFileName() + " URI: " + uri); getMethod = new GetMethod(uri); getMethod.getParams().setSoTimeout(READ_TIMEOUT); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 30b20ac632da..722041e12dea 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -481,6 +481,9 @@ class FileDisplayActivity : fragment.directCameraUpload() } }) + } else if (!shouldShowRequestPermissionRationale(permissions[0])) { + // user CHECKED "never ask again" + DisplayUtils.showSnackMessage(this, R.string.camera_permission_rationale) } else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults) 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 805ce701f358..2c3dd2a68b89 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 @@ -85,30 +84,18 @@ class PassCodeActivity : 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 0c84fe6c84e3..398893ec876c 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 @@ -94,7 +94,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 877ed965f7e0..6d5016dfc4f3 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 @@ -52,9 +52,8 @@ class GalleryRowHolder( private val checkBoxMargin by lazy { context.resources.getDimension(R.dimen.standard_quarter_padding) } private val checkedDrawable by lazy { - ContextCompat.getDrawable(context, R.drawable.ic_checkbox_marked)?.also { - viewThemeUtils.platform.tintDrawable(context, it, ColorRole.PRIMARY) - } + // NMC Customization: no need to tint the color + ContextCompat.getDrawable(context, R.drawable.ic_checkbox_marked) } private val uncheckedDrawable by lazy { @@ -96,8 +95,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() } } @@ -212,8 +212,10 @@ class GalleryRowHolder( @Suppress("MagicNumber") private fun adjustRowCell(imageView: ImageView, isChecked: Boolean) { - val scale = if (isChecked) 0.8f else 1.0f - val radius = if (isChecked) iconRadius else 0f + // NMC Customization: no need to scaling and rounding + // we want a normal view without any corners + val scale = 1.0f + val radius = 0f // Only update if values changed if (imageView.scaleX != scale) { 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 b8c8423226b4..ee0ea2f02f76 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 @@ -229,9 +229,8 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi grid.itemLayout.setBackgroundColor( ContextCompat.getColor(mContext, R.color.selected_item_background) ); - grid.checkbox.setImageDrawable( - viewThemeUtils.platform.tintDrawable(mContext, R.drawable.ic_checkbox_marked, ColorRole.PRIMARY) - ); + // NMC Customization + grid.checkbox.setImageResource(R.drawable.ic_checkbox_marked); } else { grid.itemLayout.setBackgroundColor( mContext.getResources().getColor(R.color.bg_default) 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 d8471ec1e2c2..10fb1f0d677c 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 @@ -182,6 +182,7 @@ public OCFileListAdapter( true, true, viewThemeUtils, + false, syncedFolderProvider); setHasStableIds(true); @@ -404,6 +405,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( @@ -422,7 +425,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) { @@ -998,6 +1000,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 7cc6c4b59e6f..a7efad4ed0f3 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 @@ -55,11 +55,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" @@ -188,7 +189,8 @@ class OCFileListDelegate( shimmerThumbnail, preferences, viewThemeUtils, - syncFolderProvider + syncFolderProvider, + isMediaGallery ) } @@ -217,8 +219,8 @@ class OCFileListDelegate( // shares val shouldHideShare = ( - hideItemOptions || - context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT || + gridView || // NMC: don't show share icon in grid mode + hideItemOptions || !file.isFolder && file.isEncrypted || file.isEncrypted && @@ -299,9 +301,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) } @@ -415,6 +416,10 @@ class OCFileListDelegate( ioScope.cancel() } + 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 484bf8f62622..d7604d0f74ed 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 @@ -65,8 +65,8 @@ class OCFileListGridItemViewHolder(var binding: GridItemBinding) : override val hasVisibleFeatureIndicators: Boolean get() = localFileIndicator.isVisible || gridLivePhotoIndicator?.isVisible == true || unreadComments.isVisible || shared.isVisible || binding.videoOverlay.isVisible || favorite.isVisible - override val fileFeaturesLayout: LinearLayout - get() = binding.fileFeaturesLayout + override val fileFeaturesLayout: LinearLayout? + get() = null override val more: ImageButton get() = if (binding.bidiFilenameContainer.isVisible) { binding.bidiMore diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListViewHolder.kt index 1de965ae1083..e67809652cd2 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListViewHolder.kt @@ -57,8 +57,8 @@ internal class OCFileListViewHolder(var binding: GridItemBinding) : } else { binding.more } - override val fileFeaturesLayout: LinearLayout - get() = binding.fileFeaturesLayout + override val fileFeaturesLayout: LinearLayout? + get() = null override val gridLivePhotoIndicator: ImageView get() = binding.gridLivePhotoIndicator override val livePhotoIndicator: TextView? 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 f38266855931..334630bd07c5 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; @@ -153,8 +152,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/UnifiedSearchCurrentDirItemViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchCurrentDirItemViewHolder.kt index a99b0174fdbe..a4f9ae8460ae 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchCurrentDirItemViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchCurrentDirItemViewHolder.kt @@ -54,7 +54,8 @@ class UnifiedSearchCurrentDirItemViewHolder( binding.thumbnailShimmer, appPreferences, viewThemeUtils, - syncedFolderProvider + syncedFolderProvider, + false ) binding.more.setOnClickListener { 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 fac48e303d2d..28b9e92ae091 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 @@ -194,7 +194,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 522626227391..ffb363c37e83 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 @@ -232,7 +232,8 @@ class ConflictsResolveDialog : 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 25a1d1a0b192..5946767b4998 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 @@ -1782,13 +1782,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()) { @@ -1849,7 +1859,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/fragment/UnifiedSearchFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt index 833db9694dc1..f542a0febd02 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt @@ -163,9 +163,10 @@ class UnifiedSearchFragment : super.onViewCreated(view, savedInstanceState) setupAdapter() - if (supportsOpeningCalendarContactsLocally()) { + // NMC-4633 disable permission check + /*if (supportsOpeningCalendarContactsLocally()) { checkPermissions() - } + }*/ } override fun onResume() { 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 f6f43e933140..574ce9025e7a 100644 --- a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -812,7 +812,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; } @@ -823,25 +824,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, new ArrayList<>(asyncTasks), gridView, context, shimmerThumbnail, preferences, viewThemeUtils); + generateNewThumbnail(file, thumbnailView, user, storageManager, new ArrayList<>(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); } @@ -868,9 +876,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(); @@ -879,22 +892,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, new ArrayList<>(asyncTasks), gridView, context, shimmerThumbnail, preferences, viewThemeUtils); + generateNewThumbnail(file, thumbnailView, user, storageManager, new ArrayList<>(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); } @@ -915,7 +930,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; } @@ -925,7 +941,8 @@ private static void generateNewThumbnail(OCFile file, if (thumbnail != null) { // If thumbnail is already in cache, display it immediately - thumbnailView.setImageBitmap(thumbnail); + // NMC: set the corner for both video and image thumbnail + BitmapUtils.setRoundedBitmapAccordingToListType(gridView, thumbnail, thumbnailView); stopShimmer(shimmerThumbnail, thumbnailView); return; } @@ -962,6 +979,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); @@ -969,9 +990,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); @@ -1044,4 +1062,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 097431adc99d..0d486f6e6178 100644 --- a/app/src/main/res/layout/activity_edit_image.xml +++ b/app/src/main/res/layout/activity_edit_image.xml @@ -14,15 +14,10 @@ android:background="@color/black" tools:ignore="Overdraw"> - + + + 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" /> diff --git a/app/src/main/res/layout/grid_item.xml b/app/src/main/res/layout/grid_item.xml index ddbbc8c627c3..cc6d9b6ec5f0 100644 --- a/app/src/main/res/layout/grid_item.xml +++ b/app/src/main/res/layout/grid_item.xml @@ -16,23 +16,32 @@ android:layout_height="@dimen/grid_container_height" android:layout_margin="@dimen/grid_container_margin"> - + + + + + - - - - + app:layout_constraintVertical_bias="0.85" + tools:visibility="visible"> @@ -117,22 +122,34 @@ tools:ignore="TouchTargetSizeCheck" tools:visibility="visible" /> - - + + + + + app:layout_constraintTop_toBottomOf="@+id/thumbnail" + tools:visibility="visible"> + android:layout_marginStart="@dimen/iconized_single_line_item_icon_size" + android:layout_weight="1" + android:gravity="center"> @@ -193,6 +212,7 @@ android:contentDescription="@string/overflow_menu" android:translationZ="2dp" app:srcCompat="@drawable/ic_dots_vertical" + app:tint="@color/list_icon_color" tools:ignore="TouchTargetSizeCheck" /> @@ -206,6 +226,7 @@ android:gravity="center" android:singleLine="true" android:text="@string/placeholder_filename" + android:textColor="@color/text_color" android:textSize="@dimen/grid_item_text_size" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -228,6 +249,7 @@ app:layout_constraintStart_toEndOf="@id/Filename" app:layout_constraintTop_toBottomOf="@id/thumbnail" app:srcCompat="@drawable/ic_dots_vertical" + app:tint="@color/list_icon_color" tools:ignore="TouchTargetSizeCheck" tools:visibility="visible" /> diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml index 8717f2ffc7aa..e3351f019843 100644 --- a/app/src/main/res/layout/list_item.xml +++ b/app/src/main/res/layout/list_item.xml @@ -15,17 +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/min_list_item_size" 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" /> @@ -287,15 +284,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" /> + android:src="@drawable/ic_expand_less" + app:tint="@color/list_icon_color"/> + android:src="@drawable/nav_trashbin" + app:tint="@color/list_icon_color"/> + android:paddingEnd="@dimen/zero" + app:tint="@color/list_icon_color"/> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 63e97d1a9c78..64197b533aeb 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1143,6 +1143,7 @@ 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 36d7459ecdaf..43352f0bc6ab 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 @@ -76,17 +77,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 b4f8d33b8ebb..482524d05efc 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 @@ -90,7 +90,7 @@ 15dp 40dp 240dp - 16sp + 14sp 12sp 20dp 60dp @@ -118,11 +118,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 a48e76517e0a..da353fe131df 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1273,6 +1273,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 17cdbaabca4a..54673c9434cd 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 + +