Skip to content

Commit 398761c

Browse files
committed
Dynamic theme 4.5.0
Add support for system contrast.
1 parent 61c87c6 commit 398761c

File tree

13 files changed

+159
-26
lines changed

13 files changed

+159
-26
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ buildscript {
2929
'material' : '1.10.0-alpha04',
3030
'preferences' : '2.3.0',
3131
'swiperefresh': '1.1.0',
32-
'theme' : '4.4.1',
32+
'theme' : '4.5.0',
3333
'toasts' : '4.1.3',
3434
'work' : '2.8.1'
3535
]

dynamic-support/src/main/java/com/pranavpandey/android/dynamic/support/model/DynamicAppTheme.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,11 +1440,16 @@ public boolean isBackgroundAware() {
14401440

14411441
@Override
14421442
public int getContrast(boolean resolve) {
1443-
if (resolve && getContrast(false) == Theme.Contrast.AUTO) {
1444-
return getThemeFallback(false).getContrast();
1443+
if (resolve) {
1444+
if (getContrast(false) == Theme.Contrast.AUTO) {
1445+
return getThemeFallback(false).getContrast();
1446+
} else if (getContrast(false) == Theme.Contrast.SYSTEM) {
1447+
return DynamicTheme.getInstance().getSystemContrast(
1448+
getThemeFallback(false).getContrast());
1449+
}
14451450
}
14461451

1447-
return Math.min(Theme.Contrast.MAX, contrast);
1452+
return Math.min(contrast, Theme.Contrast.MAX);
14481453
}
14491454

14501455
@Override
@@ -1475,7 +1480,7 @@ public int getOpacity(boolean resolve) {
14751480
return getThemeFallback(false).getOpacity();
14761481
}
14771482

1478-
return Math.min(Theme.Opacity.MAX, opacity);
1483+
return Math.min(opacity, Theme.Opacity.MAX);
14791484
}
14801485

14811486
@Override

dynamic-support/src/main/java/com/pranavpandey/android/dynamic/support/theme/DynamicTheme.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import android.annotation.SuppressLint;
2020
import android.annotation.TargetApi;
2121
import android.app.Activity;
22+
import android.app.UiModeManager;
2223
import android.app.WallpaperColors;
2324
import android.app.WallpaperManager;
2425
import android.content.BroadcastReceiver;
@@ -269,6 +270,11 @@ public class DynamicTheme implements DynamicListener, DynamicResolver {
269270
*/
270271
private BroadcastReceiver mBroadcastReceiver;
271272

273+
/**
274+
* UI mode manager to perform system related operations.
275+
*/
276+
private UiModeManager mUiModeManager;
277+
272278
/**
273279
* Power manager to perform battery and screen related events.
274280
*/
@@ -369,6 +375,8 @@ public void initialize(@NonNull DynamicListener listener,
369375
DynamicPermissions.initializeInstance(listener.getContext());
370376

371377
this.mListener = listener;
378+
this.mUiModeManager = ContextCompat.getSystemService(
379+
mListener.getContext(), UiModeManager.class);
372380
this.mPowerManager = ContextCompat.getSystemService(
373381
mListener.getContext(), PowerManager.class);
374382
this.mDynamicResolver = dynamicResolver;
@@ -1204,6 +1212,15 @@ public void setLocalVersion(@Version int version) {
12041212
return getLocalContext() != null ? getLocalContext() : getContext();
12051213
}
12061214

1215+
/**
1216+
* Get the UI mode manager used by the application.
1217+
*
1218+
* @return The UI mode manager used by the application.
1219+
*/
1220+
public @NonNull UiModeManager getUiModeManager() {
1221+
return mUiModeManager;
1222+
}
1223+
12071224
/**
12081225
* Get the power manager used by the application.
12091226
*
@@ -1431,6 +1448,25 @@ public void onLocalDestroy(@Nullable DynamicListener listener) {
14311448
? R.color.ads_window_background : R.color.ads_window_background_light);
14321449
}
14331450

1451+
/**
1452+
* Try to get the contrast from the system.
1453+
*
1454+
* @param fallback The fallback contrast to be used in case of any issues.
1455+
*
1456+
* @return The contrast from the system.
1457+
*/
1458+
@TargetApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
1459+
public int getSystemContrast(int fallback) {
1460+
if (DynamicSdkUtils.is34()) {
1461+
int contrast = (int) (mUiModeManager.getContrast() * Theme.Contrast.MAX) / 2;
1462+
contrast = getDefault().getContrast() + contrast;
1463+
1464+
return Math.min(Math.abs(contrast), Theme.Contrast.MAX);
1465+
}
1466+
1467+
return fallback;
1468+
}
1469+
14341470
/**
14351471
* Try to get the corner radius for the widget background from the system.
14361472
*

dynamic-support/src/main/java/com/pranavpandey/android/dynamic/support/theme/fragment/DynamicRemoteThemeFragment.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.pranavpandey.android.dynamic.support.theme.view.ThemePreview;
4848
import com.pranavpandey.android.dynamic.theme.Theme;
4949
import com.pranavpandey.android.dynamic.theme.util.DynamicThemeUtils;
50+
import com.pranavpandey.android.dynamic.util.DynamicSdkUtils;
5051

5152
/**
5253
* Base theme fragment to provide theme editing functionality.
@@ -582,7 +583,12 @@ public void onLoadTheme(@NonNull DynamicRemoteTheme theme) {
582583
mCornerSizePreference.setPreferenceValue(Theme.Corner.ToString.CUSTOM);
583584
mCornerSizePreference.setValue(theme.getCornerSize());
584585
} else {
585-
mCornerSizePreference.setPreferenceValue(Theme.Corner.ToString.AUTO);
586+
if (DynamicSdkUtils.is31()
587+
&& theme.getCornerRadius(false) == Theme.Corner.SYSTEM) {
588+
mCornerSizePreference.setPreferenceValue(Theme.Corner.ToString.SYSTEM);
589+
} else {
590+
mCornerSizePreference.setPreferenceValue(Theme.Corner.ToString.AUTO);
591+
}
586592
mCornerSizePreference.setValue(mDynamicThemeDefault.getCornerSize());
587593
}
588594

@@ -591,11 +597,17 @@ public void onLoadTheme(@NonNull DynamicRemoteTheme theme) {
591597
mElevationPreference.setPreferenceValue(String.valueOf(theme.getElevation(false)));
592598
mStylePreference.setPreferenceValue(String.valueOf(theme.getStyle()));
593599

594-
if (theme.getContrast(false) != Theme.Contrast.AUTO) {
600+
if (theme.getContrast(false) != Theme.Contrast.AUTO
601+
&& theme.getContrast(false) != Theme.Contrast.SYSTEM) {
595602
mContrastPreference.setPreferenceValue(Theme.Contrast.ToString.CUSTOM);
596603
mContrastPreference.setValue(theme.getContrast());
597604
} else {
598-
mContrastPreference.setPreferenceValue(Theme.Contrast.ToString.AUTO);
605+
if (DynamicSdkUtils.is34()
606+
&& theme.getContrast(false) == Theme.Contrast.SYSTEM) {
607+
mContrastPreference.setPreferenceValue(Theme.Contrast.ToString.SYSTEM);
608+
} else {
609+
mContrastPreference.setPreferenceValue(Theme.Contrast.ToString.AUTO);
610+
}
599611
mContrastPreference.setValue(mDynamicThemeDefault.getContrast());
600612
}
601613

@@ -733,7 +745,9 @@ private void updatePreferences() {
733745
&& (mThemePreview.getDynamicTheme()
734746
.getCornerRadius(false) != Theme.Corner.SYSTEM));
735747
mContrastPreference.setSeekEnabled(mThemePreview.getDynamicTheme()
736-
.getContrast(false) != Theme.Contrast.AUTO);
748+
.getContrast(false) != Theme.Contrast.AUTO
749+
&& (mThemePreview.getDynamicTheme()
750+
.getContrast(false) != Theme.Contrast.SYSTEM));
737751
mOpacityPreference.setSeekEnabled(mThemePreview.getDynamicTheme()
738752
.getOpacity(false) != Theme.Opacity.AUTO);
739753
}

dynamic-support/src/main/java/com/pranavpandey/android/dynamic/support/theme/fragment/DynamicThemeFragment.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.pranavpandey.android.dynamic.support.theme.view.DynamicPresetsView;
4545
import com.pranavpandey.android.dynamic.support.theme.view.ThemePreview;
4646
import com.pranavpandey.android.dynamic.theme.Theme;
47+
import com.pranavpandey.android.dynamic.util.DynamicSdkUtils;
4748

4849
/**
4950
* Base theme fragment to provide theme editing functionality.
@@ -572,7 +573,12 @@ public void onLoadTheme(@NonNull DynamicAppTheme theme) {
572573
mCornerSizePreference.setPreferenceValue(Theme.Corner.ToString.CUSTOM);
573574
mCornerSizePreference.setValue(theme.getCornerSize());
574575
} else {
575-
mCornerSizePreference.setPreferenceValue(Theme.Corner.ToString.AUTO);
576+
if (DynamicSdkUtils.is31()
577+
&& theme.getCornerRadius(false) == Theme.Corner.SYSTEM) {
578+
mCornerSizePreference.setPreferenceValue(Theme.Corner.ToString.SYSTEM);
579+
} else {
580+
mCornerSizePreference.setPreferenceValue(Theme.Corner.ToString.AUTO);
581+
}
576582
mCornerSizePreference.setValue(mDynamicThemeDefault.getCornerSize());
577583
}
578584

@@ -581,11 +587,17 @@ public void onLoadTheme(@NonNull DynamicAppTheme theme) {
581587
mElevationPreference.setPreferenceValue(String.valueOf(theme.getElevation(false)));
582588
mStylePreference.setPreferenceValue(String.valueOf(theme.getStyle()));
583589

584-
if (theme.getContrast(false) != Theme.Contrast.AUTO) {
590+
if (theme.getContrast(false) != Theme.Contrast.AUTO
591+
&& theme.getContrast(false) != Theme.Contrast.SYSTEM) {
585592
mContrastPreference.setPreferenceValue(Theme.Contrast.ToString.CUSTOM);
586593
mContrastPreference.setValue(theme.getContrast());
587594
} else {
588-
mContrastPreference.setPreferenceValue(Theme.Contrast.ToString.AUTO);
595+
if (DynamicSdkUtils.is34()
596+
&& theme.getContrast(false) == Theme.Contrast.SYSTEM) {
597+
mContrastPreference.setPreferenceValue(Theme.Contrast.ToString.SYSTEM);
598+
} else {
599+
mContrastPreference.setPreferenceValue(Theme.Contrast.ToString.AUTO);
600+
}
589601
mContrastPreference.setValue(mDynamicThemeDefault.getContrast());
590602
}
591603

@@ -713,7 +725,9 @@ private void updatePreferences() {
713725
&& (mThemePreview.getDynamicTheme()
714726
.getCornerRadius(false) != Theme.Corner.SYSTEM));
715727
mContrastPreference.setSeekEnabled(mThemePreview.getDynamicTheme()
716-
.getContrast(false) != Theme.Contrast.AUTO);
728+
.getContrast(false) != Theme.Contrast.AUTO
729+
&& (mThemePreview.getDynamicTheme()
730+
.getContrast(false) != Theme.Contrast.SYSTEM));
717731
mOpacityPreference.setSeekEnabled(mThemePreview.getDynamicTheme()
718732
.getOpacity(false) != Theme.Opacity.AUTO);
719733
}

dynamic-support/src/main/res/layout/ads_fragment_theme.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,8 @@
299299
app:ads_title="@string/ads_theme_contrast"
300300
app:ads_summary="@string/ads_theme_contrast_summary"
301301
app:ads_description="@string/ads_theme_entry_auto_default_desc"
302-
app:ads_entries="@array/ads_theme_entries_auto"
303-
app:ads_values="@array/ads_theme_values_auto"
302+
app:ads_entries="@array/ads_contrast_entries"
303+
app:ads_values="@array/ads_contrast_values"
304304
app:ads_min="@integer/adt_contrast_min"
305305
app:ads_max="@integer/adt_contrast_max"
306306
app:ads_interval="@integer/adt_contrast_interval"

dynamic-support/src/main/res/layout/ads_fragment_theme_remote.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,8 @@
306306
app:ads_title="@string/ads_theme_contrast"
307307
app:ads_summary="@string/ads_theme_contrast_summary"
308308
app:ads_description="@string/ads_theme_entry_auto_default_desc"
309-
app:ads_entries="@array/ads_theme_entries_auto"
310-
app:ads_values="@array/ads_theme_values_auto"
309+
app:ads_entries="@array/ads_contrast_entries"
310+
app:ads_values="@array/ads_contrast_values"
311311
app:ads_min="@integer/adt_contrast_min"
312312
app:ads_max="@integer/adt_contrast_max"
313313
app:ads_interval="@integer/adt_contrast_interval"

dynamic-support/src/main/res/layout/ads_fragment_tutorial_simple.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
style="?attr/ads_textAppearanceTutorialTitle"
5454
android:id="@+id/ads_tutorial_simple_title"
5555
android:layout_width="match_parent"
56-
android:layout_height="wrap_content"/>
56+
android:layout_height="wrap_content" />
5757

5858
<com.pranavpandey.android.dynamic.support.widget.DynamicTextView
5959
style="?attr/ads_textAppearanceTutorialSubtitle"

dynamic-support/src/main/res/values-v21/arrays_theme.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
xmlns:tools="http://schemas.android.com/tools">
2020

2121
<!-- Night theme entries for auto and batter saver. -->
22-
<string-array name="ads_theme_entries_night" tools:ignore="InconsistentArrays">
22+
<string-array name="ads_theme_entries_night"
23+
tools:ignore="InconsistentArrays">
2324
<item>@string/ads_theme_entry_auto</item>
2425
<item>@string/ads_theme_entry_battery</item>
2526
</string-array>
2627

2728
<!-- Night theme values for auto and batter saver. -->
28-
<string-array name="ads_theme_values_night" tools:ignore="InconsistentArrays">
29+
<string-array name="ads_theme_values_night"
30+
tools:ignore="InconsistentArrays">
2931
<!-- Auto -->
3032
<item>-3</item>
3133
<!-- Battery -->

dynamic-support/src/main/res/values-v28/arrays_theme.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@
1919
xmlns:tools="http://schemas.android.com/tools">
2020

2121
<!-- Night theme entries for auto, batter saver and system. -->
22-
<string-array name="ads_theme_entries_night" tools:ignore="InconsistentArrays">
22+
<string-array name="ads_theme_entries_night"
23+
tools:ignore="InconsistentArrays">
2324
<item>@string/ads_theme_entry_auto</item>
2425
<item>@string/ads_theme_entry_battery</item>
2526
<item>@string/ads_locale_system</item>
2627
</string-array>
2728

2829
<!-- Night theme values for auto, batter saver and system. -->
29-
<string-array name="ads_theme_values_night" tools:ignore="InconsistentArrays">
30+
<string-array name="ads_theme_values_night"
31+
tools:ignore="InconsistentArrays">
3032
<!-- Auto -->
3133
<item>-3</item>
3234
<!-- Battery -->

0 commit comments

Comments
 (0)