diff --git a/app/src/main/java/net/gsantner/markor/activity/MainActivity.java b/app/src/main/java/net/gsantner/markor/activity/MainActivity.java index 7b4c154015..84ae4e51bd 100644 --- a/app/src/main/java/net/gsantner/markor/activity/MainActivity.java +++ b/app/src/main/java/net/gsantner/markor/activity/MainActivity.java @@ -12,6 +12,7 @@ import android.app.Activity; import android.app.ActivityManager; import android.content.Intent; +import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; @@ -23,7 +24,6 @@ import android.view.WindowManager; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.RecyclerView; @@ -32,6 +32,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.navigation.NavigationBarView; import net.gsantner.markor.BuildConfig; import net.gsantner.markor.R; @@ -99,6 +100,8 @@ public void onPageSelected(int position) { }); setSupportActionBar(findViewById(R.id.toolbar)); + applyActivityBarBackgroundColors(); + applyMainBottomTabBarAppearance(); optShowRate(); // Setup viewpager @@ -147,7 +150,7 @@ public void onActivityFirstTimeVisible() { @Override public Integer getNewNavigationBarColor() { - return ContextCompat.getColor(this, R.color.primary); + return _appSettings.getConfiguredBarBackgroundColor(); } @Override @@ -293,6 +296,7 @@ protected void onResume() { } _cu.setKeepScreenOn(this, _appSettings.isKeepScreenOn()); + applyMainBottomTabBarAppearance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && _appSettings.isMultiWindowEnabled()) { setTaskDescription(new ActivityManager.TaskDescription(getString(R.string.app_name))); } @@ -318,6 +322,31 @@ public void onPostResume() { super.onPostResume(); } + private void applyMainBottomTabBarAppearance() { + if (_bottomNav == null) { + return; + } + + final boolean showTabTitles = _appSettings.isMainBottomBarTabTitlesShown(); + final int barColor = _appSettings.getConfiguredBarBackgroundColor(); + + _bottomNav.setBackgroundColor(barColor); + _bottomNav.setItemBackground(new ColorDrawable(barColor)); + _bottomNav.setLabelVisibilityMode(showTabTitles + ? NavigationBarView.LABEL_VISIBILITY_LABELED + : NavigationBarView.LABEL_VISIBILITY_UNLABELED); + applyMainBottomTabBarMinHeight(showTabTitles); + } + + private void applyMainBottomTabBarMinHeight(final boolean showTabTitles) { + final int minHeight = getResources().getDimensionPixelSize(showTabTitles + ? R.dimen.main_bottom_bar_min_height_labeled + : R.dimen.main_bottom_bar_min_height_unlabeled); + if (_bottomNav.getMinimumHeight() != minHeight) { + _bottomNav.setMinimumHeight(minHeight); + } + } + // Cycle between recent, favourite, and current public boolean onLongClickFab(View view) { if (_notebook != null) { diff --git a/app/src/main/java/net/gsantner/markor/activity/MarkorBaseActivity.java b/app/src/main/java/net/gsantner/markor/activity/MarkorBaseActivity.java index 23f10744cb..b5acea0892 100644 --- a/app/src/main/java/net/gsantner/markor/activity/MarkorBaseActivity.java +++ b/app/src/main/java/net/gsantner/markor/activity/MarkorBaseActivity.java @@ -7,6 +7,7 @@ import android.view.WindowManager; import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import net.gsantner.markor.R; @@ -32,6 +33,12 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } } + @Override + protected void onResume() { + super.onResume(); + applyActivityBarBackgroundColors(); + } + protected boolean onReceiveKeyPress(GsFragmentBase fragment, int keyCode, KeyEvent event) { return fragment.onReceiveKeyPress(keyCode, event); } @@ -49,6 +56,17 @@ public Integer getNewActivityBackgroundColor() { return _appSettings.getAppThemeName().contains("black") ? Color.BLACK : null; } + public void applyActivityBarBackgroundColors() { + final int backgroundColor = _appSettings.getConfiguredBarBackgroundColor(); + + final Toolbar toolbar = findViewById(R.id.toolbar); + if (toolbar != null) { + toolbar.setBackgroundColor(backgroundColor); + } + + _cu.setStatusbarColor(this, backgroundColor); + } + @Override protected AppSettings createAppSettingsInstance() { return new AppSettings(this); diff --git a/app/src/main/java/net/gsantner/markor/activity/SettingsActivity.java b/app/src/main/java/net/gsantner/markor/activity/SettingsActivity.java index f5f53a51b7..2354de251b 100644 --- a/app/src/main/java/net/gsantner/markor/activity/SettingsActivity.java +++ b/app/src/main/java/net/gsantner/markor/activity/SettingsActivity.java @@ -12,7 +12,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; @@ -57,7 +56,6 @@ public static class RESULT { } public static int activityRetVal = RESULT.NOCHANGE; - private static int iconColor = Color.WHITE; protected Toolbar toolbar; @@ -72,7 +70,6 @@ public void onCreate(Bundle b) { // Custom code GsFontPreferenceCompat.additionalyCheckedFolder = new File(_appSettings.getNotebookDirectory(), ".app/fonts"); - iconColor = _cu.rcolor(this, R.color.primary_text); toolbar.setTitle(R.string.settings); setSupportActionBar(findViewById(R.id.toolbar)); toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp)); @@ -191,7 +188,6 @@ public void doUpdatePreferences() { R.string.pref_key__swipe_to_change_mode, R.string.pref_key__todotxt__hl_delay, R.string.pref_key__markdown__hl_delay_v2, - R.string.pref_key__theming_hide_system_statusbar, R.string.pref_key__tab_width_v2, R.string.pref_key__editor_line_spacing, }; @@ -223,6 +219,13 @@ protected void onPreferenceChanged(final SharedPreferences prefs, final String k } else if (eq(key, R.string.pref_key__theming_hide_system_statusbar)) { activityRetVal = RESULT.RESTART_REQ; _appSettings.setRecreateMainRequired(true); + } else if (eq(key, R.string.pref_key__ui_flat_top_bottom_bars)) { + final Activity activity = getActivity(); + if (activity instanceof MarkorBaseActivity) { + ((MarkorBaseActivity) activity).applyActivityBarBackgroundColors(); + } + } else if (eq(key, R.string.pref_key__file_browser_show_dividers)) { + _appSettings.setRecreateMainRequired(true); } else if (eq(key, R.string.pref_key__is_launcher_for_special_files_enabled)) { boolean extraLaunchersEnabled = prefs.getBoolean(key, false); new MarkorContextUtils(getActivity()).applySpecialLaunchersVisibility(getActivity(), extraLaunchersEnabled); diff --git a/app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java b/app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java index 1bfaf1b3b3..db3993f331 100644 --- a/app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java +++ b/app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java @@ -86,6 +86,8 @@ public static void updateFsViewerOpts(final GsFileBrowserOptions.Options opts, f opts.popularFiles = appSettings.getPopularFiles(); opts.descriptionFormat = appSettings.getString(R.string.pref_key__file_description_format, ""); + opts.primaryColor = appSettings.isFlatTopBottomBarColorEnabled() ? R.color.background : R.color.primary; + opts.showDividers = appSettings.isFileBrowserDividerEnabled(); final File downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); opts.addVirtualFile("Download", downloads, R.drawable.baseline_download_24); diff --git a/app/src/main/java/net/gsantner/markor/model/AppSettings.java b/app/src/main/java/net/gsantner/markor/model/AppSettings.java index 08c58131f7..9452e4b60d 100644 --- a/app/src/main/java/net/gsantner/markor/model/AppSettings.java +++ b/app/src/main/java/net/gsantner/markor/model/AppSettings.java @@ -714,6 +714,29 @@ public String getAppThemeName() { return getString(R.string.pref_key__app_theme, _context.getString(R.string.app_theme_system)); } + public boolean isFlatTopBottomBarColorEnabled() { + return getBool(R.string.pref_key__ui_flat_top_bottom_bars, false); + } + + public boolean isMainBottomBarTabTitlesShown() { + return getBool(R.string.pref_key__main_bottom_bar_show_tab_titles, true); + } + + public boolean isFileBrowserDividerEnabled() { + return getBool(R.string.pref_key__file_browser_show_dividers, true); + } + + public @ColorInt int getUiBackgroundColor() { + if (getAppThemeName().contains("black")) { + return Color.BLACK; + } + return rcolor(R.color.background); + } + + public @ColorInt int getConfiguredBarBackgroundColor() { + return isFlatTopBottomBarColorEnabled() ? getUiBackgroundColor() : rcolor(R.color.primary); + } + public void setEditorBasicColor(boolean forDarkMode, @ColorRes int fgColor, @ColorRes int bgColor) { int resIdFg = forDarkMode ? R.string.pref_key__basic_color_scheme__fg_dark : R.string.pref_key__basic_color_scheme__fg_light; int resIdBg = forDarkMode ? R.string.pref_key__basic_color_scheme__bg_dark : R.string.pref_key__basic_color_scheme__bg_light; @@ -802,10 +825,6 @@ public boolean isFileBrowserSortFolderFirst() { return getBool(R.string.pref_key__filesystem_folder_first, true); } - public String getNavigationBarColor() { - return getString(R.string.pref_key__navigationbar_color, "#000000"); - } - public String getAppStartupFolderMenuId() { return getString(R.string.pref_key__app_start_folder, "notebook"); } diff --git a/app/src/main/java/net/gsantner/opoc/frontend/base/GsPreferenceFragmentBase.java b/app/src/main/java/net/gsantner/opoc/frontend/base/GsPreferenceFragmentBase.java index 22f2db85fc..21ebc48250 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/base/GsPreferenceFragmentBase.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/base/GsPreferenceFragmentBase.java @@ -91,7 +91,6 @@ @SuppressWarnings({"WeakerAccess", "unused", "UnusedReturnValue"}) public abstract class GsPreferenceFragmentBase extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, PreferenceFragmentCompat.OnPreferenceStartScreenCallback { - private static final int DEFAULT_ICON_TINT_DELAY = 200; protected boolean _isDividerVisible = false; // @@ -167,23 +166,27 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { // on bottom afterOnCreate(savedInstanceState, activity); + tintPreferenceIcons(); } - public final GsCallback.a1 updatePreferenceIcons = (frag) -> { + private void tintPreferenceIcons() { try { - View view = frag.getView(); final Integer color = getIconTintColor(); - if (view != null && color != null) { - Runnable r = () -> tintAllPrefIcons(frag, color); - for (long delayFactor : new int[]{1, 10, 50, 100, 500}) { - view.postDelayed(r, delayFactor * DEFAULT_ICON_TINT_DELAY); - } + if (color == null) { + return; + } + + tintAllPrefIcons(color); + + final View view = getView(); + if (view != null) { + view.post(() -> tintAllPrefIcons(color)); } } catch (Exception ignored) { } - }; + } - public void tintAllPrefIcons(PreferenceFragmentCompat preferenceFragment, @ColorInt int iconColor) { + public void tintAllPrefIcons(@ColorInt int iconColor) { tintPrefIconsRecursive(getPreferenceScreen(), iconColor); } @@ -231,7 +234,6 @@ protected int keyToStringResId(String keyAsString) { @Override public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - updatePreferenceIcons.callback(this); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { view.postDelayed(() -> { @@ -343,7 +345,7 @@ public void onStop() { public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat, PreferenceScreen preferenceScreen) { _prefScreenBackstack.add(getPreferenceScreen()); preferenceFragmentCompat.setPreferenceScreen(preferenceScreen); - updatePreferenceIcons.callback(this); + tintPreferenceIcons(); onPreferenceScreenChangedPriv(preferenceFragmentCompat, preferenceScreen); return true; } diff --git a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java index 97a0ddef7e..6498c9a3cc 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java @@ -174,7 +174,7 @@ public void onViewCreated(final View root, final @Nullable Bundle savedInstanceS root.setBackgroundColor(rcolor(_dopt.backgroundColor)); - GsFileBrowserFragment.addDivider(activity, _recyclerList); + GsFileBrowserFragment.addDivider(activity, _recyclerList, _dopt.showDividers); _recyclerList.setItemViewCacheSize(20); diff --git a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java index 668e4477ba..d4a4d12207 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java @@ -118,7 +118,7 @@ public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceStat } setDialogOptions(((FilesystemFragmentOptionsListener) activity).getFilesystemFragmentOptions(_dopt)); - addDivider(activity, _recyclerList); + addDivider(activity, _recyclerList, _dopt.showDividers); _filesystemViewerAdapter = new GsFileBrowserListAdapter(_dopt, activity); _recyclerList.setAdapter(_filesystemViewerAdapter); @@ -636,11 +636,15 @@ public MarkorContextUtils createContextUtilsInstance(Context context) { return new MarkorContextUtils(context); } - public static void addDivider(final Activity activity, final RecyclerView recyclerView) { + public static void addDivider(final Activity activity, final RecyclerView recyclerView, final boolean showDividers) { if (recyclerView == null || activity == null) { return; } + if (!showDividers) { + return; + } + final LinearLayoutManager lam = (LinearLayoutManager) recyclerView.getLayoutManager(); if (lam == null) { diff --git a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserOptions.java b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserOptions.java index c74a85a9b4..f1eba3c2c6 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserOptions.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserOptions.java @@ -131,6 +131,8 @@ public static class Options { @ColorRes public int folderColor = 0; + public boolean showDividers = true; + public final Map storageMaps = new LinkedHashMap<>(); public final Map iconMaps = new HashMap<>(); public Collection favouriteFiles, recentFiles, popularFiles = null; diff --git a/app/src/main/res/drawable/bottomnav_color_selector.xml b/app/src/main/res/drawable/bottomnav_color_selector.xml index 2a75a2ecd2..8cf065436c 100644 --- a/app/src/main/res/drawable/bottomnav_color_selector.xml +++ b/app/src/main/res/drawable/bottomnav_color_selector.xml @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/main__activity.xml b/app/src/main/res/layout/main__activity.xml index c9e608f15b..4ff1dc9a07 100644 --- a/app/src/main/res/layout/main__activity.xml +++ b/app/src/main/res/layout/main__activity.xml @@ -8,7 +8,7 @@ * #########################################################*/ --> - + android:theme="@style/AppTheme.Light.AppBarOverlay" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:layout_width="0dp" + android:layout_height="0dp" + app:layout_constraintBottom_toTopOf="@id/bottom_navigation_bar" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/appbar" /> - + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 307809d0e1..05e2771d9e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -5,5 +5,8 @@ 32dp 8dp 46dp + 24dp + 56dp + 42dp 16dp diff --git a/app/src/main/res/values/opoc_res.xml b/app/src/main/res/values/opoc_res.xml index dd9a3d9426..2aff400bf4 100644 --- a/app/src/main/res/values/opoc_res.xml +++ b/app/src/main/res/values/opoc_res.xml @@ -39,17 +39,4 @@ 4 - - pref_key__navigationbar_color - - System - @string/black - @string/white - - - - - #000000 - #ffffff - diff --git a/app/src/main/res/values/string-not_translatable.xml b/app/src/main/res/values/string-not_translatable.xml index 932f1fe99b..b6924d22d3 100644 --- a/app/src/main/res/values/string-not_translatable.xml +++ b/app/src/main/res/values/string-not_translatable.xml @@ -146,6 +146,9 @@ work. If not, see . pref_key__font_family pref_key__editor_font_size pref_key__app_theme + pref_key__ui_flat_top_bottom_bars + pref_key__main_bottom_bar_show_tab_titles + pref_key__file_browser_show_dividers pref_key__theming_hide_system_statusbar pref_key__language pref_key__is_main_recreate_required diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3a3d885196..2142031879 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -148,6 +148,12 @@ work. If not, see . App-wide Main View The overall theme used in the app + Flat top and bottom bars + Use the app background color for top and bottom bars + Show tab titles + Show text labels in the main bottom bar + File browser divider lines + Show divider lines between file browser entries Remember last directory Syntax Highlighting Highlighting delay @@ -319,7 +325,6 @@ work. If not, see . Notebook is the folder that Markor loads in the file browser when the app is started. It is the home folder of your files. QuickNote is the fastest option to write down notes. It is a file in Markdown format with default location >Notebook/QuickNote.md<, you can set a custom filepath in the settings. Manage your tasks with ToDo. It is a file in todo.txt format with default location >Notebook/todo.txt<, you can set a custom filepath in the settings. - Navigation bar color Black White View diff --git a/app/src/main/res/xml/preferences_master.xml b/app/src/main/res/xml/preferences_master.xml index d543f8f0d0..6af0e10d3e 100644 --- a/app/src/main/res/xml/preferences_master.xml +++ b/app/src/main/res/xml/preferences_master.xml @@ -116,22 +116,29 @@ - + + android:icon="@drawable/ic_palette_black_24dp" + android:summary="@string/theme" + android:title="@string/appearance"> - + + android:title="@string/theme" /> + + + + + + + + + + + + + + + + - -