Skip to content

Commit c9f50bf

Browse files
feat(theming): Use nextcloud-common library for theming UI elements
Signed-off-by: Stefan Niedermann <info@niedermann.it>
1 parent c30dd58 commit c9f50bf

26 files changed

Lines changed: 227 additions & 247 deletions

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ dependencies {
7676
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2'
7777

7878
// Nextcloud SSO
79+
implementation 'com.github.nextcloud:android-common:0.4.0'
7980
implementation 'com.github.nextcloud:Android-SingleSignOn:0.6.1'
8081
implementation 'com.github.stefan-niedermann:android-commons:0.2.9'
8182
implementation 'com.github.stefan-niedermann.nextcloud-commons:sso-glide:1.6.4'

app/src/main/java/it/niedermann/owncloud/notes/FormattingHelpActivity.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import it.niedermann.owncloud.notes.R;
1414
import it.niedermann.owncloud.notes.branding.BrandedActivity;
15+
import it.niedermann.owncloud.notes.branding.BrandingUtil;
1516
import it.niedermann.owncloud.notes.databinding.ActivityFormattingHelpBinding;
1617

1718
import static it.niedermann.owncloud.notes.shared.util.NoteUtil.getFontSizeFromPreferences;
@@ -223,6 +224,7 @@ private String buildFormattingHelp() {
223224

224225
@Override
225226
public void applyBrand(int mainColor, int textColor) {
226-
applyBrandToPrimaryToolbar(binding.appBar, binding.toolbar);
227+
final var util = BrandingUtil.of(mainColor, this);
228+
util.notes.applyBrandToPrimaryToolbar(binding.appBar, binding.toolbar, colorAccent);
227229
}
228230
}

app/src/main/java/it/niedermann/owncloud/notes/NotesApplication.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
import static androidx.preference.PreferenceManager.getDefaultSharedPreferences;
1515

16+
import com.nextcloud.android.common.ui.util.PlatformThemeUtil;
17+
1618
public class NotesApplication extends Application {
1719
private static final String TAG = NotesApplication.class.getSimpleName();
1820

@@ -66,8 +68,7 @@ public static boolean isDarkThemeActive(Context context, DarkModeSetting setting
6668
}
6769

6870
public static boolean isDarkThemeActive(Context context) {
69-
final int uiMode = context.getResources().getConfiguration().uiMode;
70-
return (uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
71+
return PlatformThemeUtil.isDarkMode(context);
7172
}
7273

7374
public static void setLockedPreference(boolean lockedPreference) {

app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ protected void onCreate(Bundle savedInstanceState) {
5151

5252
@Override
5353
public void applyBrand(int mainColor, int textColor) {
54-
applyBrandToPrimaryToolbar(binding.appBar, binding.toolbar);
55-
@ColorInt int finalMainColor = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(this, mainColor);
56-
binding.tabs.setSelectedTabIndicatorColor(finalMainColor);
54+
final var util = BrandingUtil.of(mainColor, this);
55+
util.material.themeTabLayout(binding.tabs);
56+
util.notes.applyBrandToPrimaryToolbar(binding.appBar, binding.toolbar, colorAccent);
5757
}
5858

5959
private static class TabsStateAdapter extends FragmentStateAdapter {

app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
3535

3636
@Override
3737
public void applyBrand(int mainColor, int textColor) {
38-
@ColorInt final int finalMainColor = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(requireContext(), mainColor);
39-
DrawableCompat.setTintList(binding.aboutAppLicenseButton.getBackground(), ColorStateList.valueOf(finalMainColor));
40-
binding.aboutAppLicenseButton.setTextColor(ColorUtil.INSTANCE.getForegroundColorForBackgroundColor(finalMainColor));
38+
final var util = BrandingUtil.of(mainColor, requireContext());
39+
util.material.colorMaterialButtonPrimaryFilled(binding.aboutAppLicenseButton);
4140
}
4241
}

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package it.niedermann.owncloud.notes.accountswitcher;
22

3-
import static it.niedermann.owncloud.notes.branding.BrandingUtil.applyBrandToLayerDrawable;
4-
53
import android.app.Dialog;
64
import android.content.Context;
75
import android.content.Intent;
@@ -18,6 +16,7 @@
1816

1917
import it.niedermann.owncloud.notes.R;
2018
import it.niedermann.owncloud.notes.branding.BrandedDialogFragment;
19+
import it.niedermann.owncloud.notes.branding.BrandingUtil;
2120
import it.niedermann.owncloud.notes.databinding.DialogAccountSwitcherBinding;
2221
import it.niedermann.owncloud.notes.manageaccounts.ManageAccountsActivity;
2322
import it.niedermann.owncloud.notes.persistence.NotesRepository;
@@ -118,6 +117,7 @@ public static DialogFragment newInstance(long currentAccountId) {
118117

119118
@Override
120119
public void applyBrand(int mainColor, int textColor) {
121-
applyBrandToLayerDrawable((LayerDrawable) binding.check.getDrawable(), R.id.area, mainColor);
120+
final var util = BrandingUtil.of(mainColor, requireContext());
121+
util.notes.colorLayerDrawable((LayerDrawable) binding.check.getDrawable(), R.id.area, mainColor);
122122
}
123123
}
Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,20 @@
11
package it.niedermann.owncloud.notes.branding;
22

3-
import android.content.res.ColorStateList;
4-
import android.graphics.PorterDuff;
5-
import android.graphics.drawable.Drawable;
3+
import static it.niedermann.owncloud.notes.branding.BrandingUtil.readBrandColors;
4+
65
import android.util.TypedValue;
76
import android.view.Menu;
87

98
import androidx.annotation.ColorInt;
10-
import androidx.annotation.NonNull;
119
import androidx.appcompat.app.AppCompatActivity;
12-
import androidx.appcompat.widget.Toolbar;
13-
import androidx.core.content.ContextCompat;
14-
15-
import com.google.android.material.appbar.AppBarLayout;
16-
import com.google.android.material.floatingactionbutton.FloatingActionButton;
1710

1811
import it.niedermann.owncloud.notes.R;
1912

20-
import static it.niedermann.owncloud.notes.branding.BrandingUtil.readBrandColors;
21-
import static it.niedermann.owncloud.notes.branding.BrandingUtil.tintMenuIcon;
22-
2313
public abstract class BrandedActivity extends AppCompatActivity implements Branded {
2414

2515
@ColorInt
2616
protected int colorAccent;
2717

28-
public static void applyBrandToFAB(@ColorInt int mainColor, @ColorInt int textColor, @NonNull FloatingActionButton fab) {
29-
fab.setSupportBackgroundTintList(ColorStateList.valueOf(mainColor));
30-
fab.setColorFilter(textColor);
31-
}
32-
3318
@Override
3419
protected void onStart() {
3520
super.onStart();
@@ -43,26 +28,12 @@ protected void onStart() {
4328

4429
@Override
4530
public boolean onCreateOptionsMenu(Menu menu) {
46-
for (int i = 0; i < menu.size(); i++) {
47-
tintMenuIcon(menu.getItem(i), colorAccent);
48-
}
49-
return super.onCreateOptionsMenu(menu);
50-
}
51-
52-
public void applyBrandToPrimaryToolbar(@NonNull AppBarLayout appBarLayout, @NonNull Toolbar toolbar) {
53-
// FIXME Workaround for https://github.com/nextcloud/notes-android/issues/889
54-
appBarLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.primary));
31+
final var utils = BrandingUtil.of(colorAccent, this);
5532

56-
final var overflowDrawable = toolbar.getOverflowIcon();
57-
if (overflowDrawable != null) {
58-
overflowDrawable.setColorFilter(colorAccent, PorterDuff.Mode.SRC_ATOP);
59-
toolbar.setOverflowIcon(overflowDrawable);
33+
for (int i = 0; i < menu.size(); i++) {
34+
utils.platform.colorToolbarMenuIcon(this, menu.getItem(i));
6035
}
6136

62-
final var navigationDrawable = toolbar.getNavigationIcon();
63-
if (navigationDrawable != null) {
64-
navigationDrawable.setColorFilter(colorAccent, PorterDuff.Mode.SRC_ATOP);
65-
toolbar.setNavigationIcon(navigationDrawable);
66-
}
37+
return super.onCreateOptionsMenu(menu);
6738
}
6839
}

app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedFragment.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package it.niedermann.owncloud.notes.branding;
22

3-
import android.content.Context;
43
import android.util.TypedValue;
54
import android.view.Menu;
65
import android.view.MenuInflater;
76

87
import androidx.annotation.ColorInt;
98
import androidx.annotation.NonNull;
10-
import androidx.annotation.Nullable;
119
import androidx.fragment.app.Fragment;
1210

1311
import it.niedermann.owncloud.notes.R;
1412

15-
import static it.niedermann.owncloud.notes.branding.BrandingUtil.tintMenuIcon;
16-
1713
public abstract class BrandedFragment extends Fragment implements Branded {
1814

1915
@ColorInt
@@ -40,8 +36,12 @@ public void onStart() {
4036
@Override
4137
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
4238
super.onCreateOptionsMenu(menu, inflater);
39+
final var utils = BrandingUtil.of(colorAccent, requireContext());
40+
4341
for (int i = 0; i < menu.size(); i++) {
44-
tintMenuIcon(menu.getItem(i), colorAccent);
42+
if (menu.getItem(i).getIcon() != null) {
43+
utils.platform.colorToolbarMenuIcon(requireContext(), menu.getItem(i));
44+
}
4545
}
4646
}
4747
}

app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedPreferenceCategory.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,12 @@
22

33
import android.content.Context;
44
import android.util.AttributeSet;
5-
import android.view.View;
65
import android.widget.TextView;
76

8-
import androidx.annotation.ColorInt;
97
import androidx.annotation.Nullable;
108
import androidx.preference.PreferenceCategory;
119
import androidx.preference.PreferenceViewHolder;
1210

13-
import static it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme;
14-
1511
public class BrandedPreferenceCategory extends PreferenceCategory {
1612

1713
public BrandedPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
@@ -36,9 +32,9 @@ public void onBindViewHolder(PreferenceViewHolder holder) {
3632

3733
final var view = holder.itemView.findViewById(android.R.id.title);
3834
@Nullable final var context = getContext();
39-
if (context != null && view instanceof TextView) {
40-
@ColorInt final int mainColor = getSecondaryForegroundColorDependingOnTheme(context, BrandingUtil.readBrandMainColor(context));
41-
((TextView) view).setTextColor(mainColor);
35+
if (view instanceof TextView) {
36+
final var util = BrandingUtil.of(BrandingUtil.readBrandMainColor(context), context);;
37+
((TextView) view).setTextColor(util.notes.getOnPrimaryContainer(context));
4238
}
4339
}
4440
}

app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSnackbar.java

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
package it.niedermann.owncloud.notes.branding;
22

3-
import static it.niedermann.owncloud.notes.NotesApplication.isDarkThemeActive;
4-
import static it.niedermann.owncloud.notes.branding.BrandingUtil.getAttribute;
53
import static it.niedermann.owncloud.notes.branding.BrandingUtil.readBrandMainColor;
6-
import static it.niedermann.owncloud.notes.shared.util.NotesColorUtil.contrastRatioIsSufficient;
74

8-
import android.graphics.Color;
95
import android.view.View;
106

117
import androidx.annotation.ColorInt;
@@ -15,26 +11,15 @@
1511
import com.google.android.material.snackbar.BaseTransientBottomBar;
1612
import com.google.android.material.snackbar.Snackbar;
1713

18-
import it.niedermann.owncloud.notes.R;
19-
2014
public class BrandedSnackbar {
2115

2216
@NonNull
2317
public static Snackbar make(@NonNull View view, @NonNull CharSequence text, @BaseTransientBottomBar.Duration int duration) {
24-
final var snackbar = Snackbar.make(view, text, duration);
25-
26-
@ColorInt final int backgroundColor = getAttribute(view.getContext(), R.attr.colorSurfaceInverse);
2718
@ColorInt final int color = readBrandMainColor(view.getContext());
19+
final var snackbar = Snackbar.make(view, text, duration);
20+
final var utils = BrandingUtil.of(color, view.getContext());
2821

29-
if (contrastRatioIsSufficient(backgroundColor, color)) {
30-
snackbar.setActionTextColor(color);
31-
} else {
32-
if (isDarkThemeActive(view.getContext())) {
33-
snackbar.setActionTextColor(Color.BLACK);
34-
} else {
35-
snackbar.setActionTextColor(Color.WHITE);
36-
}
37-
}
22+
utils.material.themeSnackbar(snackbar);
3823

3924
return snackbar;
4025
}

0 commit comments

Comments
 (0)