Covert to kotlin
This commit is contained in:
parent
4531393db6
commit
79e0db37ef
53 changed files with 22 additions and 3196 deletions
|
@ -1,124 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.ActivityManager;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.appcompat.widget.Toolbar;
|
|
||||||
import code.name.monkey.appthemehelper.util.ColorUtil;
|
|
||||||
import code.name.monkey.appthemehelper.util.TintHelper;
|
|
||||||
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
|
|
||||||
|
|
||||||
import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public final class ATH {
|
|
||||||
|
|
||||||
private ATH() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("CommitPrefEdits")
|
|
||||||
public static boolean didThemeValuesChange(@NonNull Context context, long since) {
|
|
||||||
return ThemeStore.isConfigured(context)
|
|
||||||
&& ThemeStore.prefs(context).getLong(ThemeStore.VALUES_CHANGED, -1) > since;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setStatusbarColorAuto(Activity activity) {
|
|
||||||
setStatusbarColor(activity, ThemeStore.statusBarColor(activity));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setStatusbarColor(Activity activity, int color) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
activity.getWindow().setStatusBarColor(color);
|
|
||||||
setLightStatusbarAuto(activity, color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setLightStatusbarAuto(Activity activity, int bgColor) {
|
|
||||||
setLightStatusbar(activity, ColorUtil.isColorLight(bgColor));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setLightStatusbar(Activity activity, boolean enabled) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
||||||
final View decorView = activity.getWindow().getDecorView();
|
|
||||||
final int systemUiVisibility = decorView.getSystemUiVisibility();
|
|
||||||
if (enabled) {
|
|
||||||
decorView.setSystemUiVisibility(systemUiVisibility | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
} else {
|
|
||||||
decorView.setSystemUiVisibility(systemUiVisibility & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setLightNavigationbar(Activity activity, boolean enabled) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
final View decorView = activity.getWindow().getDecorView();
|
|
||||||
int systemUiVisibility = decorView.getSystemUiVisibility();
|
|
||||||
if (enabled) {
|
|
||||||
systemUiVisibility |= SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
|
||||||
} else {
|
|
||||||
systemUiVisibility &= ~SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
|
||||||
}
|
|
||||||
decorView.setSystemUiVisibility(systemUiVisibility);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setLightNavigationbarAuto(Activity activity, int bgColor) {
|
|
||||||
setLightNavigationbar(activity, ColorUtil.isColorLight(bgColor));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setNavigationbarColorAuto(Activity activity) {
|
|
||||||
setNavigationbarColor(activity, ThemeStore.navigationBarColor(activity));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setNavigationbarColor(Activity activity, int color) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
activity.getWindow().setNavigationBarColor(color);
|
|
||||||
} else {
|
|
||||||
activity.getWindow().setNavigationBarColor(ColorUtil.darkenColor(color));
|
|
||||||
}
|
|
||||||
setLightNavigationbarAuto(activity, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setActivityToolbarColorAuto(Activity activity, @Nullable Toolbar toolbar) {
|
|
||||||
setActivityToolbarColor(activity, toolbar, ThemeStore.primaryColor(activity));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setActivityToolbarColor(Activity activity, @Nullable Toolbar toolbar,
|
|
||||||
int color) {
|
|
||||||
if (toolbar == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
toolbar.setBackgroundColor(color);
|
|
||||||
ToolbarContentTintHelper.setToolbarContentColorBasedOnToolbarColor(activity, toolbar, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setTaskDescriptionColorAuto(@NonNull Activity activity) {
|
|
||||||
setTaskDescriptionColor(activity, ThemeStore.primaryColor(activity));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setTaskDescriptionColor(@NonNull Activity activity, @ColorInt int color) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
// Task description requires fully opaque color
|
|
||||||
color = ColorUtil.stripAlpha(color);
|
|
||||||
// Sets color of entry in the system recents page
|
|
||||||
activity.setTaskDescription(new ActivityManager.TaskDescription((String) activity.getTitle(), null, color));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setTint(@NonNull View view, @ColorInt int color) {
|
|
||||||
TintHelper.setTintAuto(view, color, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setBackgroundTint(@NonNull View view, @ColorInt int color) {
|
|
||||||
TintHelper.setTintAuto(view, color, true);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
|
|
||||||
import androidx.annotation.StyleRes;
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public class ATHActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
private long updateTime = -1;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
setTheme(getThemeRes());
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
updateTime = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
if (ATH.didThemeValuesChange(this, updateTime)) {
|
|
||||||
onThemeChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onThemeChanged() {
|
|
||||||
postRecreate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void postRecreate() {
|
|
||||||
// hack to prevent java.lang.RuntimeException: Performing pause of activity that is not resumed
|
|
||||||
// makes sure recreate() is called right after and not in onResume()
|
|
||||||
new Handler().post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
recreate();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@StyleRes
|
|
||||||
protected int getThemeRes() {
|
|
||||||
return ThemeStore.activityTheme(this);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,325 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import androidx.annotation.AttrRes;
|
|
||||||
import androidx.annotation.CheckResult;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.ColorRes;
|
|
||||||
import androidx.annotation.IntRange;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.StyleRes;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.util.ATHUtil;
|
|
||||||
import code.name.monkey.appthemehelper.util.ColorUtil;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public final class ThemeStore implements ThemeStorePrefKeys, ThemeStoreInterface {
|
|
||||||
|
|
||||||
private final Context mContext;
|
|
||||||
private final SharedPreferences.Editor mEditor;
|
|
||||||
|
|
||||||
@SuppressLint("CommitPrefEdits")
|
|
||||||
private ThemeStore(@NonNull Context context) {
|
|
||||||
mContext = context;
|
|
||||||
mEditor = prefs(context).edit();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ThemeStore editTheme(@NonNull Context context) {
|
|
||||||
return new ThemeStore(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@NonNull
|
|
||||||
protected static SharedPreferences prefs(@NonNull Context context) {
|
|
||||||
return context.getSharedPreferences(CONFIG_PREFS_KEY_DEFAULT, Context.MODE_PRIVATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void markChanged(@NonNull Context context) {
|
|
||||||
new ThemeStore(context).commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@StyleRes
|
|
||||||
public static int activityTheme(@NonNull Context context) {
|
|
||||||
return prefs(context).getInt(KEY_ACTIVITY_THEME, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int primaryColor(@NonNull Context context) {
|
|
||||||
return prefs(context).getInt(KEY_PRIMARY_COLOR, ATHUtil.resolveColor(context, R.attr.colorPrimary, Color.parseColor("#455A64")));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int primaryColorDark(@NonNull Context context) {
|
|
||||||
return prefs(context).getInt(KEY_PRIMARY_COLOR_DARK, ATHUtil.resolveColor(context, R.attr.colorPrimaryDark, Color.parseColor("#37474F")));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int accentColor(@NonNull Context context) {
|
|
||||||
return prefs(context).getInt(KEY_ACCENT_COLOR, ATHUtil.resolveColor(context, R.attr.colorAccent, Color.parseColor("#263238")));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int statusBarColor(@NonNull Context context) {
|
|
||||||
if (!coloredStatusBar(context)) {
|
|
||||||
return Color.BLACK;
|
|
||||||
}
|
|
||||||
return prefs(context).getInt(KEY_STATUS_BAR_COLOR, primaryColorDark(context));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int navigationBarColor(@NonNull Context context) {
|
|
||||||
if (!coloredNavigationBar(context)) {
|
|
||||||
return Color.BLACK;
|
|
||||||
}
|
|
||||||
return prefs(context).getInt(KEY_NAVIGATION_BAR_COLOR, primaryColor(context));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int textColorPrimary(@NonNull Context context) {
|
|
||||||
return prefs(context).getInt(KEY_TEXT_COLOR_PRIMARY, ATHUtil.resolveColor(context, android.R.attr.textColorPrimary));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int textColorPrimaryInverse(@NonNull Context context) {
|
|
||||||
return prefs(context).getInt(KEY_TEXT_COLOR_PRIMARY_INVERSE, ATHUtil.resolveColor(context, android.R.attr.textColorPrimaryInverse));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int textColorSecondary(@NonNull Context context) {
|
|
||||||
return prefs(context).getInt(KEY_TEXT_COLOR_SECONDARY, ATHUtil.resolveColor(context, android.R.attr.textColorSecondary));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
@ColorInt
|
|
||||||
public static int textColorSecondaryInverse(@NonNull Context context) {
|
|
||||||
return prefs(context).getInt(KEY_TEXT_COLOR_SECONDARY_INVERSE, ATHUtil.resolveColor(context, android.R.attr.textColorSecondaryInverse));
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
public static boolean coloredStatusBar(@NonNull Context context) {
|
|
||||||
return prefs(context).getBoolean(KEY_APPLY_PRIMARYDARK_STATUSBAR, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
public static boolean coloredNavigationBar(@NonNull Context context) {
|
|
||||||
return prefs(context).getBoolean(KEY_APPLY_PRIMARY_NAVBAR, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
public static boolean autoGeneratePrimaryDark(@NonNull Context context) {
|
|
||||||
return prefs(context).getBoolean(KEY_AUTO_GENERATE_PRIMARYDARK, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@CheckResult
|
|
||||||
public static boolean isConfigured(Context context) {
|
|
||||||
return prefs(context).getBoolean(IS_CONFIGURED_KEY, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("CommitPrefEdits")
|
|
||||||
public static boolean isConfigured(Context context, @IntRange(from = 0, to = Integer.MAX_VALUE) int version) {
|
|
||||||
final SharedPreferences prefs = prefs(context);
|
|
||||||
final int lastVersion = prefs.getInt(IS_CONFIGURED_VERSION_KEY, -1);
|
|
||||||
if (version > lastVersion) {
|
|
||||||
prefs.edit().putInt(IS_CONFIGURED_VERSION_KEY, version).commit();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore activityTheme(@StyleRes int theme) {
|
|
||||||
mEditor.putInt(KEY_ACTIVITY_THEME, theme);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore primaryColor(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_PRIMARY_COLOR, color);
|
|
||||||
if (autoGeneratePrimaryDark(mContext))
|
|
||||||
primaryColorDark(ColorUtil.darkenColor(color));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore primaryColorRes(@ColorRes int colorRes) {
|
|
||||||
return primaryColor(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore primaryColorAttr(@AttrRes int colorAttr) {
|
|
||||||
return primaryColor(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore primaryColorDark(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_PRIMARY_COLOR_DARK, color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore primaryColorDarkRes(@ColorRes int colorRes) {
|
|
||||||
return primaryColorDark(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore primaryColorDarkAttr(@AttrRes int colorAttr) {
|
|
||||||
return primaryColorDark(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore accentColor(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_ACCENT_COLOR, color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore accentColorRes(@ColorRes int colorRes) {
|
|
||||||
return accentColor(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore accentColorAttr(@AttrRes int colorAttr) {
|
|
||||||
return accentColor(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore statusBarColor(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_STATUS_BAR_COLOR, color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore statusBarColorRes(@ColorRes int colorRes) {
|
|
||||||
return statusBarColor(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore statusBarColorAttr(@AttrRes int colorAttr) {
|
|
||||||
return statusBarColor(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore navigationBarColor(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_NAVIGATION_BAR_COLOR, color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Commit method
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore navigationBarColorRes(@ColorRes int colorRes) {
|
|
||||||
return navigationBarColor(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Static getters
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore navigationBarColorAttr(@AttrRes int colorAttr) {
|
|
||||||
return navigationBarColor(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorPrimary(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_TEXT_COLOR_PRIMARY, color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorPrimaryRes(@ColorRes int colorRes) {
|
|
||||||
return textColorPrimary(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorPrimaryAttr(@AttrRes int colorAttr) {
|
|
||||||
return textColorPrimary(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorPrimaryInverse(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_TEXT_COLOR_PRIMARY_INVERSE, color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorPrimaryInverseRes(@ColorRes int colorRes) {
|
|
||||||
return textColorPrimaryInverse(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorPrimaryInverseAttr(@AttrRes int colorAttr) {
|
|
||||||
return textColorPrimaryInverse(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorSecondary(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_TEXT_COLOR_SECONDARY, color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorSecondaryRes(@ColorRes int colorRes) {
|
|
||||||
return textColorSecondary(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorSecondaryAttr(@AttrRes int colorAttr) {
|
|
||||||
return textColorSecondary(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorSecondaryInverse(@ColorInt int color) {
|
|
||||||
mEditor.putInt(KEY_TEXT_COLOR_SECONDARY_INVERSE, color);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorSecondaryInverseRes(@ColorRes int colorRes) {
|
|
||||||
return textColorSecondaryInverse(ContextCompat.getColor(mContext, colorRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore textColorSecondaryInverseAttr(@AttrRes int colorAttr) {
|
|
||||||
return textColorSecondaryInverse(ATHUtil.resolveColor(mContext, colorAttr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore coloredStatusBar(boolean colored) {
|
|
||||||
mEditor.putBoolean(KEY_APPLY_PRIMARYDARK_STATUSBAR, colored);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore coloredNavigationBar(boolean applyToNavBar) {
|
|
||||||
mEditor.putBoolean(KEY_APPLY_PRIMARY_NAVBAR, applyToNavBar);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThemeStore autoGeneratePrimaryDark(boolean autoGenerate) {
|
|
||||||
mEditor.putBoolean(KEY_AUTO_GENERATE_PRIMARYDARK, autoGenerate);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Override
|
|
||||||
public void commit() {
|
|
||||||
mEditor.putLong(VALUES_CHANGED, System.currentTimeMillis())
|
|
||||||
.putBoolean(IS_CONFIGURED_KEY, true)
|
|
||||||
.commit();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,94 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper;
|
|
||||||
|
|
||||||
import androidx.annotation.AttrRes;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.ColorRes;
|
|
||||||
import androidx.annotation.StyleRes;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
interface ThemeStoreInterface {
|
|
||||||
|
|
||||||
// Activity theme
|
|
||||||
|
|
||||||
ThemeStore activityTheme(@StyleRes int theme);
|
|
||||||
|
|
||||||
// Primary colors
|
|
||||||
|
|
||||||
ThemeStore primaryColor(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore primaryColorRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore primaryColorAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
ThemeStore autoGeneratePrimaryDark(boolean autoGenerate);
|
|
||||||
|
|
||||||
ThemeStore primaryColorDark(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore primaryColorDarkRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore primaryColorDarkAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
// Accent colors
|
|
||||||
|
|
||||||
ThemeStore accentColor(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore accentColorRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore accentColorAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
// Status bar color
|
|
||||||
|
|
||||||
ThemeStore statusBarColor(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore statusBarColorRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore statusBarColorAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
// Navigation bar color
|
|
||||||
|
|
||||||
ThemeStore navigationBarColor(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore navigationBarColorRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore navigationBarColorAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
// Primary text color
|
|
||||||
|
|
||||||
ThemeStore textColorPrimary(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore textColorPrimaryRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore textColorPrimaryAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
ThemeStore textColorPrimaryInverse(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore textColorPrimaryInverseRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore textColorPrimaryInverseAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
// Secondary text color
|
|
||||||
|
|
||||||
ThemeStore textColorSecondary(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore textColorSecondaryRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore textColorSecondaryAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
ThemeStore textColorSecondaryInverse(@ColorInt int color);
|
|
||||||
|
|
||||||
ThemeStore textColorSecondaryInverseRes(@ColorRes int colorRes);
|
|
||||||
|
|
||||||
ThemeStore textColorSecondaryInverseAttr(@AttrRes int colorAttr);
|
|
||||||
|
|
||||||
// Toggle configurations
|
|
||||||
|
|
||||||
ThemeStore coloredStatusBar(boolean colored);
|
|
||||||
|
|
||||||
ThemeStore coloredNavigationBar(boolean applyToNavBar);
|
|
||||||
|
|
||||||
// Commit/apply
|
|
||||||
|
|
||||||
void commit();
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
interface ThemeStorePrefKeys {
|
|
||||||
|
|
||||||
String CONFIG_PREFS_KEY_DEFAULT = "[[kabouzeid_app-theme-helper]]";
|
|
||||||
String IS_CONFIGURED_KEY = "is_configured";
|
|
||||||
String IS_CONFIGURED_VERSION_KEY = "is_configured_version";
|
|
||||||
String VALUES_CHANGED = "values_changed";
|
|
||||||
|
|
||||||
String KEY_ACTIVITY_THEME = "activity_theme";
|
|
||||||
|
|
||||||
String KEY_PRIMARY_COLOR = "primary_color";
|
|
||||||
String KEY_PRIMARY_COLOR_DARK = "primary_color_dark";
|
|
||||||
String KEY_ACCENT_COLOR = "accent_color";
|
|
||||||
String KEY_STATUS_BAR_COLOR = "status_bar_color";
|
|
||||||
String KEY_NAVIGATION_BAR_COLOR = "navigation_bar_color";
|
|
||||||
|
|
||||||
String KEY_TEXT_COLOR_PRIMARY = "text_color_primary";
|
|
||||||
String KEY_TEXT_COLOR_PRIMARY_INVERSE = "text_color_primary_inverse";
|
|
||||||
String KEY_TEXT_COLOR_SECONDARY = "text_color_secondary";
|
|
||||||
String KEY_TEXT_COLOR_SECONDARY_INVERSE = "text_color_secondary_inverse";
|
|
||||||
|
|
||||||
String KEY_APPLY_PRIMARYDARK_STATUSBAR = "apply_primarydark_statusbar";
|
|
||||||
String KEY_APPLY_PRIMARY_NAVBAR = "apply_primary_navbar";
|
|
||||||
String KEY_AUTO_GENERATE_PRIMARYDARK = "auto_generate_primarydark";
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common;
|
|
||||||
|
|
||||||
import androidx.appcompat.widget.Toolbar;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
|
|
||||||
|
|
||||||
public class ATHActionBarActivity extends ATHToolbarActivity {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Toolbar getATHToolbar() {
|
|
||||||
return ToolbarContentTintHelper.getSupportActionBarView(getSupportActionBar());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,91 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.preference.CheckBoxPreference;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.CheckBox;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATECheckBoxPreference extends CheckBoxPreference {
|
|
||||||
|
|
||||||
public ATECheckBoxPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATECheckBoxPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATECheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATECheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom);
|
|
||||||
|
|
||||||
try {
|
|
||||||
Field canRecycleLayoutField = Preference.class.getDeclaredField("mCanRecycleLayout");
|
|
||||||
canRecycleLayoutField.setAccessible(true);
|
|
||||||
canRecycleLayoutField.setBoolean(this, true);
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Field hasSpecifiedLayout = Preference.class.getDeclaredField("mHasSpecifiedLayout");
|
|
||||||
hasSpecifiedLayout.setAccessible(true);
|
|
||||||
hasSpecifiedLayout.setBoolean(this, true);
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onBindView(View view) {
|
|
||||||
super.onBindView(view);
|
|
||||||
|
|
||||||
View parentCheckbox = findCheckboxView(view);
|
|
||||||
if (parentCheckbox != null) {
|
|
||||||
ATH.setTint(parentCheckbox, ThemeStore.accentColor(view.getContext()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private View findCheckboxView(View view) {
|
|
||||||
if (view instanceof ViewGroup) {
|
|
||||||
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
|
|
||||||
View child = ((ViewGroup) view).getChildAt(i);
|
|
||||||
if (child instanceof CheckBox) {
|
|
||||||
return child;
|
|
||||||
} else if (child instanceof ViewGroup) {
|
|
||||||
View potentialCheckbox = findCheckboxView(child);
|
|
||||||
if (potentialCheckbox != null) return potentialCheckbox;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (view instanceof CheckBox) {
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,66 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEColorPreference extends Preference {
|
|
||||||
|
|
||||||
private View mView;
|
|
||||||
private int color;
|
|
||||||
private int border;
|
|
||||||
|
|
||||||
public ATEColorPreference(Context context) {
|
|
||||||
this(context, null, 0);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEColorPreference(Context context, AttributeSet attrs) {
|
|
||||||
this(context, attrs, 0);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEColorPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom);
|
|
||||||
setWidgetLayoutResource(R.layout.ate_preference_color);
|
|
||||||
setPersistent(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onBindView(View view) {
|
|
||||||
super.onBindView(view);
|
|
||||||
mView = view;
|
|
||||||
invalidateColor();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setColor(int color, int border) {
|
|
||||||
this.color = color;
|
|
||||||
this.border = border;
|
|
||||||
invalidateColor();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void invalidateColor() {
|
|
||||||
if (mView != null) {
|
|
||||||
BorderCircleView circle = (BorderCircleView) mView.findViewById(R.id.circle);
|
|
||||||
if (this.color != 0) {
|
|
||||||
circle.setVisibility(View.VISIBLE);
|
|
||||||
circle.setBackgroundColor(color);
|
|
||||||
circle.setBorderColor(border);
|
|
||||||
} else {
|
|
||||||
circle.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.prefs.MaterialDialogPreference;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEDialogPreference extends MaterialDialogPreference {
|
|
||||||
|
|
||||||
public ATEDialogPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEDialogPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEDialogPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.prefs.MaterialEditTextPreference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEEditTextPreference extends MaterialEditTextPreference {
|
|
||||||
|
|
||||||
public ATEEditTextPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEEditTextPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(code.name.monkey.appthemehelper.R.layout.ate_preference_custom);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.prefs.MaterialListPreference;
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEListPreference extends MaterialListPreference {
|
|
||||||
|
|
||||||
public ATEListPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEListPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom);
|
|
||||||
if (getSummary() == null || getSummary().toString().trim().isEmpty())
|
|
||||||
setSummary("%s");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.prefs.MaterialListPreference;
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEMultiSelectPreference extends MaterialListPreference {
|
|
||||||
|
|
||||||
public ATEMultiSelectPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEMultiSelectPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEMultiSelectPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEMultiSelectPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEPreference extends Preference {
|
|
||||||
|
|
||||||
public ATEPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATEPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.preference.PreferenceCategory;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
public class ATEPreferenceCategory extends PreferenceCategory {
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATEPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreferenceCategory(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreferenceCategory(Context context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onBindView(View view) {
|
|
||||||
super.onBindView(view);
|
|
||||||
TextView mTitle = (TextView) view.findViewById(android.R.id.title);
|
|
||||||
mTitle.setTextColor(ThemeStore.accentColor(view.getContext()));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,114 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import android.preference.SwitchPreference;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.appcompat.widget.SwitchCompat;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Switch;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
import code.name.monkey.appthemehelper.common.views.ATESwitch;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATESwitchPreference extends SwitchPreference {
|
|
||||||
|
|
||||||
static final boolean COMPAT_MODE = Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP;
|
|
||||||
|
|
||||||
private ATESwitch mSwitch;
|
|
||||||
|
|
||||||
public ATESwitchPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESwitchPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATESwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom);
|
|
||||||
if (COMPAT_MODE) {
|
|
||||||
setWidgetLayoutResource(R.layout.ate_preference_switch);
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
Field canRecycleLayoutField = Preference.class.getDeclaredField("mCanRecycleLayout");
|
|
||||||
canRecycleLayoutField.setAccessible(true);
|
|
||||||
canRecycleLayoutField.setBoolean(this, true);
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Field hasSpecifiedLayout = Preference.class.getDeclaredField("mHasSpecifiedLayout");
|
|
||||||
hasSpecifiedLayout.setAccessible(true);
|
|
||||||
hasSpecifiedLayout.setBoolean(this, true);
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onBindView(View view) {
|
|
||||||
super.onBindView(view);
|
|
||||||
if (COMPAT_MODE) {
|
|
||||||
mSwitch = (ATESwitch) view.findViewById(R.id.switchWidget);
|
|
||||||
mSwitch.setChecked(isChecked());
|
|
||||||
} else {
|
|
||||||
View parentSwitch = findSwitchView(view);
|
|
||||||
if (parentSwitch != null) {
|
|
||||||
ATH.setTint(parentSwitch, ThemeStore.accentColor(view.getContext()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private View findSwitchView(View view) {
|
|
||||||
if (view instanceof ViewGroup) {
|
|
||||||
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
|
|
||||||
View child = ((ViewGroup) view).getChildAt(i);
|
|
||||||
if (child instanceof Switch || child instanceof SwitchCompat) {
|
|
||||||
return child;
|
|
||||||
} else if (child instanceof ViewGroup) {
|
|
||||||
View potentialSwitch = findSwitchView(child);
|
|
||||||
if (potentialSwitch != null) return potentialSwitch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (view instanceof Switch || view instanceof SwitchCompat) {
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setChecked(boolean checked) {
|
|
||||||
super.setChecked(checked);
|
|
||||||
if (COMPAT_MODE) {
|
|
||||||
if (mSwitch != null) {
|
|
||||||
mSwitch.setChecked(checked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,112 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Canvas;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.graphics.PorterDuffColorFilter;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.widget.FrameLayout;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
public class BorderCircleView extends FrameLayout {
|
|
||||||
|
|
||||||
private final Drawable mCheck;
|
|
||||||
private final Paint paint;
|
|
||||||
private final Paint paintBorder;
|
|
||||||
private final int borderWidth;
|
|
||||||
|
|
||||||
private Paint paintCheck;
|
|
||||||
private PorterDuffColorFilter blackFilter;
|
|
||||||
private PorterDuffColorFilter whiteFilter;
|
|
||||||
|
|
||||||
public BorderCircleView(Context context) {
|
|
||||||
this(context, null, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BorderCircleView(Context context, AttributeSet attrs) {
|
|
||||||
this(context, attrs, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BorderCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
mCheck = ContextCompat.getDrawable(context, R.drawable.ate_check);
|
|
||||||
borderWidth = (int) getResources().getDimension(R.dimen.ate_circleview_border);
|
|
||||||
|
|
||||||
paint = new Paint();
|
|
||||||
paint.setAntiAlias(true);
|
|
||||||
|
|
||||||
paintBorder = new Paint();
|
|
||||||
paintBorder.setAntiAlias(true);
|
|
||||||
paintBorder.setColor(Color.BLACK);
|
|
||||||
|
|
||||||
setWillNotDraw(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setBackgroundColor(int color) {
|
|
||||||
paint.setColor(color);
|
|
||||||
requestLayout();
|
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBorderColor(int color) {
|
|
||||||
paintBorder.setColor(color);
|
|
||||||
requestLayout();
|
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
||||||
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
|
|
||||||
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
|
|
||||||
if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) {
|
|
||||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
|
||||||
//noinspection SuspiciousNameCombination
|
|
||||||
int height = width;
|
|
||||||
if (heightMode == MeasureSpec.AT_MOST) {
|
|
||||||
height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec));
|
|
||||||
}
|
|
||||||
setMeasuredDimension(width, height);
|
|
||||||
} else {
|
|
||||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDraw(Canvas canvas) {
|
|
||||||
super.onDraw(canvas);
|
|
||||||
|
|
||||||
int canvasSize = canvas.getWidth();
|
|
||||||
if (canvas.getHeight() < canvasSize) {
|
|
||||||
canvasSize = canvas.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
int circleCenter = (canvasSize - (borderWidth * 2)) / 2;
|
|
||||||
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) + borderWidth - 4.0f, paintBorder);
|
|
||||||
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) - 4.0f, paint);
|
|
||||||
|
|
||||||
if (isActivated()) {
|
|
||||||
final int offset = (canvasSize / 2) - (mCheck.getIntrinsicWidth() / 2);
|
|
||||||
if (paintCheck == null) {
|
|
||||||
paintCheck = new Paint();
|
|
||||||
paintCheck.setAntiAlias(true);
|
|
||||||
}
|
|
||||||
if (whiteFilter == null || blackFilter == null) {
|
|
||||||
blackFilter = new PorterDuffColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
|
|
||||||
whiteFilter = new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
|
|
||||||
}
|
|
||||||
if (paint.getColor() == Color.WHITE) {
|
|
||||||
paintCheck.setColorFilter(blackFilter);
|
|
||||||
} else {
|
|
||||||
paintCheck.setColorFilter(whiteFilter);
|
|
||||||
}
|
|
||||||
mCheck.setBounds(offset, offset, mCheck.getIntrinsicWidth() - offset, mCheck.getIntrinsicHeight() - offset);
|
|
||||||
mCheck.draw(canvas);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import androidx.preference.CheckBoxPreference;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATECheckBoxPreference extends CheckBoxPreference {
|
|
||||||
|
|
||||||
public ATECheckBoxPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATECheckBoxPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATECheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATECheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom_support);
|
|
||||||
setWidgetLayoutResource(R.layout.ate_preference_checkbox);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceViewHolder;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
import code.name.monkey.appthemehelper.common.prefs.BorderCircleView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEColorPreference extends Preference {
|
|
||||||
|
|
||||||
private View mView;
|
|
||||||
private int color;
|
|
||||||
private int border;
|
|
||||||
|
|
||||||
public ATEColorPreference(Context context) {
|
|
||||||
this(context, null, 0);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEColorPreference(Context context, AttributeSet attrs) {
|
|
||||||
this(context, attrs, 0);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEColorPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom_support);
|
|
||||||
setWidgetLayoutResource(R.layout.ate_preference_color);
|
|
||||||
setPersistent(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
|
||||||
super.onBindViewHolder(holder);
|
|
||||||
mView = holder.itemView;
|
|
||||||
invalidateColor();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setColor(int color, int border) {
|
|
||||||
this.color = color;
|
|
||||||
this.border = border;
|
|
||||||
invalidateColor();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void invalidateColor() {
|
|
||||||
if (mView != null) {
|
|
||||||
BorderCircleView circle = (BorderCircleView) mView.findViewById(R.id.circle);
|
|
||||||
if (this.color != 0) {
|
|
||||||
circle.setVisibility(View.VISIBLE);
|
|
||||||
circle.setBackgroundColor(color);
|
|
||||||
circle.setBorderColor(border);
|
|
||||||
} else {
|
|
||||||
circle.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.preference.DialogPreference;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEDialogPreference extends DialogPreference {
|
|
||||||
|
|
||||||
public ATEDialogPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEDialogPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEDialogPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom_support);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.preference.EditTextPreference;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEEditTextPreference extends EditTextPreference {
|
|
||||||
|
|
||||||
public ATEEditTextPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEEditTextPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom_support);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.preference.ListPreference;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEListPreference extends ListPreference {
|
|
||||||
|
|
||||||
public ATEListPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEListPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom_support);
|
|
||||||
if (getSummary() == null || getSummary().toString().trim().isEmpty())
|
|
||||||
setSummary("%s");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEPreference extends Preference {
|
|
||||||
|
|
||||||
public ATEPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATEPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom_support);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import androidx.preference.PreferenceCategory;
|
|
||||||
import androidx.preference.PreferenceViewHolder;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
public class ATEPreferenceCategory extends PreferenceCategory {
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATEPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreferenceCategory(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPreferenceCategory(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
|
||||||
super.onBindViewHolder(holder);
|
|
||||||
TextView mTitle = (TextView) holder.itemView;
|
|
||||||
mTitle.setTextColor(ThemeStore.accentColor(getContext()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_category);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs.ATEEditTextPreferenceDialogFragmentCompat;
|
|
||||||
import code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs.ATEListPreferenceDialogFragmentCompat;
|
|
||||||
import code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs.ATEPreferenceDialogFragment;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public abstract class ATEPreferenceFragmentCompat extends PreferenceFragmentCompat {
|
|
||||||
@Override
|
|
||||||
public void onDisplayPreferenceDialog(Preference preference) {
|
|
||||||
if (this.getCallbackFragment() instanceof OnPreferenceDisplayDialogCallback) {
|
|
||||||
((OnPreferenceDisplayDialogCallback) this.getCallbackFragment()).onPreferenceDisplayDialog(this, preference);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.getActivity() instanceof OnPreferenceDisplayDialogCallback) {
|
|
||||||
((OnPreferenceDisplayDialogCallback) this.getActivity()).onPreferenceDisplayDialog(this, preference);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.getFragmentManager().findFragmentByTag("android.support.v7.preference.PreferenceFragment.DIALOG") == null) {
|
|
||||||
DialogFragment dialogFragment = onCreatePreferenceDialog(preference);
|
|
||||||
|
|
||||||
if (dialogFragment != null) {
|
|
||||||
dialogFragment.setTargetFragment(this, 0);
|
|
||||||
dialogFragment.show(this.getFragmentManager(), "android.support.v7.preference.PreferenceFragment.DIALOG");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
super.onDisplayPreferenceDialog(preference);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public DialogFragment onCreatePreferenceDialog(Preference preference) {
|
|
||||||
if (preference instanceof ATEEditTextPreference) {
|
|
||||||
return ATEEditTextPreferenceDialogFragmentCompat.newInstance(preference.getKey());
|
|
||||||
} else if (preference instanceof ATEListPreference) {
|
|
||||||
return ATEListPreferenceDialogFragmentCompat.newInstance(preference.getKey());
|
|
||||||
} else if (preference instanceof ATEDialogPreference) {
|
|
||||||
return ATEPreferenceDialogFragment.newInstance(preference.getKey());
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import androidx.preference.SeekBarPreference;
|
|
||||||
|
|
||||||
public class ATESeekBarPreference extends SeekBarPreference {
|
|
||||||
public ATESeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESeekBarPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESeekBarPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import androidx.preference.CheckBoxPreference;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATESwitchPreference extends CheckBoxPreference {
|
|
||||||
|
|
||||||
public ATESwitchPreference(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESwitchPreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATESwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setLayoutResource(R.layout.ate_preference_custom_support);
|
|
||||||
setWidgetLayoutResource(R.layout.ate_preference_switch_support);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEEditTextPreference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public class ATEEditTextPreferenceDialogFragmentCompat extends ATEPreferenceDialogFragment implements MaterialDialog.InputCallback {
|
|
||||||
|
|
||||||
private CharSequence input;
|
|
||||||
|
|
||||||
public static ATEEditTextPreferenceDialogFragmentCompat newInstance(String key) {
|
|
||||||
ATEEditTextPreferenceDialogFragmentCompat fragment = new ATEEditTextPreferenceDialogFragmentCompat();
|
|
||||||
Bundle b = new Bundle(1);
|
|
||||||
b.putString(ARG_KEY, key);
|
|
||||||
fragment.setArguments(b);
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ATEEditTextPreference getEditTextPreference() {
|
|
||||||
return (ATEEditTextPreference) getPreference();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPrepareDialogBuilder(MaterialDialog.Builder builder) {
|
|
||||||
super.onPrepareDialogBuilder(builder);
|
|
||||||
builder.input("", getEditTextPreference().getText(), this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean needInputMethod() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onDialogClosed(boolean positiveResult) {
|
|
||||||
if (positiveResult) {
|
|
||||||
String value = input.toString();
|
|
||||||
if (this.getEditTextPreference().callChangeListener(value)) {
|
|
||||||
this.getEditTextPreference().setText(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
|
|
||||||
this.input = input;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import androidx.preference.ListPreference;
|
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.DialogAction;
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
|
||||||
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public class ATEListPreferenceDialogFragmentCompat extends ATEPreferenceDialogFragment implements MaterialDialog.ListCallbackSingleChoice {
|
|
||||||
private int mClickedDialogEntryIndex;
|
|
||||||
|
|
||||||
public static ATEListPreferenceDialogFragmentCompat newInstance(String key) {
|
|
||||||
final ATEListPreferenceDialogFragmentCompat fragment = new ATEListPreferenceDialogFragmentCompat();
|
|
||||||
final Bundle b = new Bundle(1);
|
|
||||||
b.putString(ARG_KEY, key);
|
|
||||||
fragment.setArguments(b);
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ATEListPreference getListPreference() {
|
|
||||||
return (ATEListPreference) getPreference();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPrepareDialogBuilder(MaterialDialog.Builder builder) {
|
|
||||||
super.onPrepareDialogBuilder(builder);
|
|
||||||
|
|
||||||
final ListPreference preference = getListPreference();
|
|
||||||
|
|
||||||
if (preference.getEntries() == null || preference.getEntryValues() == null) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"ListPreference requires an entries array and an entryValues array.");
|
|
||||||
}
|
|
||||||
|
|
||||||
mClickedDialogEntryIndex = preference.findIndexOfValue(preference.getValue());
|
|
||||||
builder.items(preference.getEntries())
|
|
||||||
.alwaysCallSingleChoiceCallback()
|
|
||||||
.itemsCallbackSingleChoice(mClickedDialogEntryIndex, this);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The typical interaction for list-based dialogs is to have
|
|
||||||
* click-on-an-item dismiss the dialog instead of the user having to
|
|
||||||
* press 'Ok'.
|
|
||||||
*/
|
|
||||||
builder.positiveText("");
|
|
||||||
builder.negativeText("");
|
|
||||||
builder.neutralText("");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDialogClosed(boolean positiveResult) {
|
|
||||||
final ListPreference preference = getListPreference();
|
|
||||||
if (positiveResult && mClickedDialogEntryIndex >= 0 &&
|
|
||||||
preference.getEntryValues() != null) {
|
|
||||||
String value = preference.getEntryValues()[mClickedDialogEntryIndex].toString();
|
|
||||||
if (preference.callChangeListener(value)) {
|
|
||||||
preference.setValue(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) {
|
|
||||||
mClickedDialogEntryIndex = which;
|
|
||||||
onClick(dialog, DialogAction.POSITIVE);
|
|
||||||
dismiss();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,95 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs;
|
|
||||||
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
|
||||||
import androidx.preference.DialogPreference;
|
|
||||||
import android.view.Window;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.DialogAction;
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public class ATEPreferenceDialogFragment extends DialogFragment implements MaterialDialog.SingleButtonCallback {
|
|
||||||
private DialogAction mWhichButtonClicked;
|
|
||||||
|
|
||||||
protected static final String ARG_KEY = "key";
|
|
||||||
private DialogPreference mPreference;
|
|
||||||
|
|
||||||
public static ATEPreferenceDialogFragment newInstance(String key) {
|
|
||||||
ATEPreferenceDialogFragment fragment = new ATEPreferenceDialogFragment();
|
|
||||||
Bundle b = new Bundle(1);
|
|
||||||
b.putString(ARG_KEY, key);
|
|
||||||
fragment.setArguments(b);
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
Fragment rawFragment = this.getTargetFragment();
|
|
||||||
if (!(rawFragment instanceof DialogPreference.TargetFragment)) {
|
|
||||||
throw new IllegalStateException("Target fragment must implement TargetFragment interface");
|
|
||||||
} else {
|
|
||||||
DialogPreference.TargetFragment fragment = (DialogPreference.TargetFragment) rawFragment;
|
|
||||||
String key = this.getArguments().getString(ARG_KEY);
|
|
||||||
this.mPreference = (DialogPreference) fragment.findPreference(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
|
||||||
FragmentActivity context = this.getActivity();
|
|
||||||
MaterialDialog.Builder builder = new MaterialDialog.Builder(context)
|
|
||||||
.title(this.mPreference.getDialogTitle())
|
|
||||||
.icon(this.mPreference.getDialogIcon())
|
|
||||||
.onAny(this)
|
|
||||||
.positiveText(this.mPreference.getPositiveButtonText())
|
|
||||||
.negativeText(this.mPreference.getNegativeButtonText());
|
|
||||||
|
|
||||||
builder.content(this.mPreference.getDialogMessage());
|
|
||||||
this.onPrepareDialogBuilder(builder);
|
|
||||||
MaterialDialog dialog = builder.build();
|
|
||||||
if (this.needInputMethod()) {
|
|
||||||
this.requestInputMethod(dialog);
|
|
||||||
}
|
|
||||||
|
|
||||||
return dialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DialogPreference getPreference() {
|
|
||||||
return this.mPreference;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onPrepareDialogBuilder(MaterialDialog.Builder builder) {
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean needInputMethod() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void requestInputMethod(Dialog dialog) {
|
|
||||||
Window window = dialog.getWindow();
|
|
||||||
window.setSoftInputMode(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
|
|
||||||
mWhichButtonClicked = which;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDismiss(DialogInterface dialog) {
|
|
||||||
super.onDismiss(dialog);
|
|
||||||
onDialogClosed(mWhichButtonClicked == DialogAction.POSITIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onDialogClosed(boolean positiveResult) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.appcompat.widget.AppCompatCheckBox;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATECheckBox extends AppCompatCheckBox {
|
|
||||||
|
|
||||||
public ATECheckBox(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATECheckBox(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATECheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
ATH.setTint(this, ThemeStore.accentColor(context));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.appcompat.widget.AppCompatEditText;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEEditText extends AppCompatEditText {
|
|
||||||
|
|
||||||
public ATEEditText(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEEditText(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEEditText(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
ATH.setTint(this, ThemeStore.accentColor(context));
|
|
||||||
setTextColor(ThemeStore.textColorPrimary(context));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.appcompat.widget.AppCompatTextView;
|
|
||||||
|
|
||||||
import android.text.Layout;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEPrimaryTextView extends AppCompatTextView {
|
|
||||||
|
|
||||||
public ATEPrimaryTextView(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPrimaryTextView(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEPrimaryTextView(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setTextColor(ThemeStore.textColorPrimary(context));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.widget.ProgressBar;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEProgressBar extends ProgressBar {
|
|
||||||
|
|
||||||
public ATEProgressBar(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEProgressBar(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATEProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
ATH.setTint(this, ThemeStore.accentColor(context));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.widget.RadioButton;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATERadioButton extends RadioButton {
|
|
||||||
|
|
||||||
public ATERadioButton(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATERadioButton(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATERadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATERadioButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
ATH.setTint(this, ThemeStore.accentColor(context));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.appcompat.widget.AppCompatTextView;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATESecondaryTextView extends AppCompatTextView {
|
|
||||||
|
|
||||||
public ATESecondaryTextView(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESecondaryTextView(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESecondaryTextView(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
setTextColor(ThemeStore.textColorSecondary(context));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.widget.SeekBar;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATESeekBar extends SeekBar {
|
|
||||||
|
|
||||||
public ATESeekBar(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESeekBar(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
public ATESeekBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
|
||||||
super(context, attrs, defStyleAttr, defStyleRes);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
ATH.setTint(this, ThemeStore.accentColor(context));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.Switch;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATEStockSwitch extends Switch {
|
|
||||||
|
|
||||||
public ATEStockSwitch(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEStockSwitch(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATEStockSwitch(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
ATH.setTint(this, ThemeStore.accentColor(context));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isShown() {
|
|
||||||
return getParent() != null && getVisibility() == View.VISIBLE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.common.views;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.appcompat.widget.SwitchCompat;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ATH;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public class ATESwitch extends SwitchCompat {
|
|
||||||
|
|
||||||
public ATESwitch(Context context) {
|
|
||||||
super(context);
|
|
||||||
init(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESwitch(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ATESwitch(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
init(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init(Context context, AttributeSet attrs) {
|
|
||||||
ATH.setTint(this, ThemeStore.accentColor(context));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isShown() {
|
|
||||||
return getParent() != null && getVisibility() == View.VISIBLE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.TypedArray;
|
|
||||||
import androidx.annotation.AttrRes;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public final class ATHUtil {
|
|
||||||
|
|
||||||
public static boolean isWindowBackgroundDark(Context context) {
|
|
||||||
return !ColorUtil.isColorLight(ATHUtil.resolveColor(context, android.R.attr.windowBackground));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int resolveColor(Context context, @AttrRes int attr) {
|
|
||||||
return resolveColor(context, attr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int resolveColor(Context context, @AttrRes int attr, int fallback) {
|
|
||||||
TypedArray a = context.getTheme().obtainStyledAttributes(new int[]{attr});
|
|
||||||
try {
|
|
||||||
return a.getColor(0, fallback);
|
|
||||||
} finally {
|
|
||||||
a.recycle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isInClassPath(@NonNull String clsName) {
|
|
||||||
try {
|
|
||||||
return inClassPath(clsName) != null;
|
|
||||||
} catch (Throwable t) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Class<?> inClassPath(@NonNull String clsName) {
|
|
||||||
try {
|
|
||||||
return Class.forName(clsName);
|
|
||||||
} catch (Throwable t) {
|
|
||||||
throw new IllegalStateException(String.format("%s is not in your class path! You must include the associated library.", clsName));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ATHUtil() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,77 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.graphics.Color;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.FloatRange;
|
|
||||||
|
|
||||||
|
|
||||||
public final class ColorUtil {
|
|
||||||
|
|
||||||
public static int stripAlpha(@ColorInt int color) {
|
|
||||||
return 0xff000000 | color;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ColorInt
|
|
||||||
public static int shiftColor(@ColorInt int color, @FloatRange(from = 0.0f, to = 2.0f) float by) {
|
|
||||||
if (by == 1f) return color;
|
|
||||||
int alpha = Color.alpha(color);
|
|
||||||
float[] hsv = new float[3];
|
|
||||||
Color.colorToHSV(color, hsv);
|
|
||||||
hsv[2] *= by; // value component
|
|
||||||
return (alpha << 24) + (0x00ffffff & Color.HSVToColor(hsv));
|
|
||||||
}
|
|
||||||
|
|
||||||
@ColorInt
|
|
||||||
public static int darkenColor(@ColorInt int color) {
|
|
||||||
return shiftColor(color, 0.9f);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ColorInt
|
|
||||||
public static int lightenColor(@ColorInt int color) {
|
|
||||||
return shiftColor(color, 1.1f);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isColorLight(@ColorInt int color) {
|
|
||||||
final double darkness = 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255;
|
|
||||||
return darkness < 0.4;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ColorInt
|
|
||||||
public static int invertColor(@ColorInt int color) {
|
|
||||||
final int r = 255 - Color.red(color);
|
|
||||||
final int g = 255 - Color.green(color);
|
|
||||||
final int b = 255 - Color.blue(color);
|
|
||||||
return Color.argb(Color.alpha(color), r, g, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ColorInt
|
|
||||||
public static int adjustAlpha(@ColorInt int color, @FloatRange(from = 0.0, to = 1.0) float factor) {
|
|
||||||
int alpha = Math.round(Color.alpha(color) * factor);
|
|
||||||
int red = Color.red(color);
|
|
||||||
int green = Color.green(color);
|
|
||||||
int blue = Color.blue(color);
|
|
||||||
return Color.argb(alpha, red, green, blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ColorInt
|
|
||||||
public static int withAlpha(@ColorInt int baseColor, @FloatRange(from = 0.0, to = 1.0) float alpha) {
|
|
||||||
int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24;
|
|
||||||
int rgb = 0x00ffffff & baseColor;
|
|
||||||
return a + rgb;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Taken from CollapsingToolbarLayout's CollapsingTextHelper class.
|
|
||||||
*/
|
|
||||||
public static int blendColors(int color1, int color2, @FloatRange(from = 0.0, to = 1.0) float ratio) {
|
|
||||||
final float inverseRatio = 1f - ratio;
|
|
||||||
float a = (Color.alpha(color1) * inverseRatio) + (Color.alpha(color2) * ratio);
|
|
||||||
float r = (Color.red(color1) * inverseRatio) + (Color.red(color2) * ratio);
|
|
||||||
float g = (Color.green(color1) * inverseRatio) + (Color.green(color2) * ratio);
|
|
||||||
float b = (Color.blue(color1) * inverseRatio) + (Color.blue(color2) * ratio);
|
|
||||||
return Color.argb((int) a, (int) r, (int) g, (int) b);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ColorUtil() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.graphics.drawable.ColorDrawable;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.graphics.drawable.TransitionDrawable;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
|
|
||||||
|
|
||||||
public final class DrawableUtil {
|
|
||||||
|
|
||||||
public static TransitionDrawable createTransitionDrawable(@ColorInt int startColor, @ColorInt int endColor) {
|
|
||||||
return createTransitionDrawable(new ColorDrawable(startColor), new ColorDrawable(endColor));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TransitionDrawable createTransitionDrawable(Drawable start, Drawable end) {
|
|
||||||
final Drawable[] drawables = new Drawable[2];
|
|
||||||
|
|
||||||
drawables[0] = start;
|
|
||||||
drawables[1] = end;
|
|
||||||
|
|
||||||
return new TransitionDrawable(drawables);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DrawableUtil() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,334 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.Build;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.viewpager.widget.ViewPager;
|
|
||||||
import androidx.core.widget.EdgeEffectCompat;
|
|
||||||
import androidx.core.widget.NestedScrollView;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import android.widget.AbsListView;
|
|
||||||
import android.widget.EdgeEffect;
|
|
||||||
import android.widget.ScrollView;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.BuildConfig;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
public class EdgeGlowUtil {
|
|
||||||
|
|
||||||
protected EdgeGlowUtil() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Invalidation methods
|
|
||||||
|
|
||||||
private static Field EDGE_GLOW_FIELD_EDGE;
|
|
||||||
private static Field EDGE_GLOW_FIELD_GLOW;
|
|
||||||
private static Field EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT;
|
|
||||||
|
|
||||||
private static void invalidateEdgeEffectFields() {
|
|
||||||
if (EDGE_GLOW_FIELD_EDGE != null && EDGE_GLOW_FIELD_GLOW != null &&
|
|
||||||
EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT != null) {
|
|
||||||
EDGE_GLOW_FIELD_EDGE.setAccessible(true);
|
|
||||||
EDGE_GLOW_FIELD_GLOW.setAccessible(true);
|
|
||||||
EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT.setAccessible(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
Field edge = null, glow = null;
|
|
||||||
Class cls = null;
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
|
||||||
try {
|
|
||||||
cls = Class.forName("android.widget.EdgeGlow");
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
if (BuildConfig.DEBUG) e.printStackTrace();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cls = EdgeEffect.class;
|
|
||||||
}
|
|
||||||
if (cls != null) {
|
|
||||||
for (Field f : cls.getDeclaredFields()) {
|
|
||||||
switch (f.getName()) {
|
|
||||||
case "mEdge":
|
|
||||||
f.setAccessible(true);
|
|
||||||
edge = f;
|
|
||||||
break;
|
|
||||||
case "mGlow":
|
|
||||||
f.setAccessible(true);
|
|
||||||
glow = f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EDGE_GLOW_FIELD_EDGE = edge;
|
|
||||||
EDGE_GLOW_FIELD_GLOW = glow;
|
|
||||||
} else {
|
|
||||||
EDGE_GLOW_FIELD_EDGE = null;
|
|
||||||
EDGE_GLOW_FIELD_GLOW = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Field efc = null;
|
|
||||||
try {
|
|
||||||
efc = EdgeEffectCompat.class.getDeclaredField("mEdgeEffect");
|
|
||||||
} catch (NoSuchFieldException e) {
|
|
||||||
if (BuildConfig.DEBUG) e.printStackTrace();
|
|
||||||
}
|
|
||||||
EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT = efc;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Field SCROLL_VIEW_FIELD_EDGE_GLOW_TOP;
|
|
||||||
private static Field SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM;
|
|
||||||
|
|
||||||
private static void invalidateScrollViewFields() {
|
|
||||||
if (SCROLL_VIEW_FIELD_EDGE_GLOW_TOP != null && SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM != null) {
|
|
||||||
SCROLL_VIEW_FIELD_EDGE_GLOW_TOP.setAccessible(true);
|
|
||||||
SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM.setAccessible(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final Class<?> cls = ScrollView.class;
|
|
||||||
for (Field f : cls.getDeclaredFields()) {
|
|
||||||
switch (f.getName()) {
|
|
||||||
case "mEdgeGlowTop":
|
|
||||||
f.setAccessible(true);
|
|
||||||
SCROLL_VIEW_FIELD_EDGE_GLOW_TOP = f;
|
|
||||||
break;
|
|
||||||
case "mEdgeGlowBottom":
|
|
||||||
f.setAccessible(true);
|
|
||||||
SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM = f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Field NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP;
|
|
||||||
private static Field NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM;
|
|
||||||
|
|
||||||
private static void invalidateNestedScrollViewFields() {
|
|
||||||
if (NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP != null && NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM != null) {
|
|
||||||
NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP.setAccessible(true);
|
|
||||||
NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM.setAccessible(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final Class<?> cls = ATHUtil.inClassPath("android.support.v4.widget.NestedScrollView");
|
|
||||||
for (Field f : cls.getDeclaredFields()) {
|
|
||||||
switch (f.getName()) {
|
|
||||||
case "mEdgeGlowTop":
|
|
||||||
f.setAccessible(true);
|
|
||||||
NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP = f;
|
|
||||||
break;
|
|
||||||
case "mEdgeGlowBottom":
|
|
||||||
f.setAccessible(true);
|
|
||||||
NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM = f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Field LIST_VIEW_FIELD_EDGE_GLOW_TOP;
|
|
||||||
private static Field LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM;
|
|
||||||
|
|
||||||
private static void invalidateListViewFields() {
|
|
||||||
if (LIST_VIEW_FIELD_EDGE_GLOW_TOP != null && LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM != null) {
|
|
||||||
LIST_VIEW_FIELD_EDGE_GLOW_TOP.setAccessible(true);
|
|
||||||
LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM.setAccessible(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final Class<?> cls = AbsListView.class;
|
|
||||||
for (Field f : cls.getDeclaredFields()) {
|
|
||||||
switch (f.getName()) {
|
|
||||||
case "mEdgeGlowTop":
|
|
||||||
f.setAccessible(true);
|
|
||||||
LIST_VIEW_FIELD_EDGE_GLOW_TOP = f;
|
|
||||||
break;
|
|
||||||
case "mEdgeGlowBottom":
|
|
||||||
f.setAccessible(true);
|
|
||||||
LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM = f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Field RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP;
|
|
||||||
private static Field RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT;
|
|
||||||
private static Field RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT;
|
|
||||||
private static Field RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM;
|
|
||||||
|
|
||||||
private static void invalidateRecyclerViewFields() {
|
|
||||||
if (RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP != null && RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT != null &&
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT != null && RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM != null) {
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP.setAccessible(true);
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT.setAccessible(true);
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT.setAccessible(true);
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM.setAccessible(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final Class<?> cls = ATHUtil.inClassPath("android.support.v7.widget.RecyclerView");
|
|
||||||
for (Field f : cls.getDeclaredFields()) {
|
|
||||||
switch (f.getName()) {
|
|
||||||
case "mTopGlow":
|
|
||||||
f.setAccessible(true);
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP = f;
|
|
||||||
break;
|
|
||||||
case "mBottomGlow":
|
|
||||||
f.setAccessible(true);
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM = f;
|
|
||||||
break;
|
|
||||||
case "mLeftGlow":
|
|
||||||
f.setAccessible(true);
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT = f;
|
|
||||||
break;
|
|
||||||
case "mRightGlow":
|
|
||||||
f.setAccessible(true);
|
|
||||||
RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT = f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Field VIEW_PAGER_FIELD_EDGE_GLOW_LEFT;
|
|
||||||
private static Field VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT;
|
|
||||||
|
|
||||||
private static void invalidateViewPagerFields() {
|
|
||||||
if (VIEW_PAGER_FIELD_EDGE_GLOW_LEFT != null && VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT != null) {
|
|
||||||
VIEW_PAGER_FIELD_EDGE_GLOW_LEFT.setAccessible(true);
|
|
||||||
VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT.setAccessible(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final Class<?> cls = ATHUtil.inClassPath("android.support.v4.view.ViewPager");
|
|
||||||
for (Field f : cls.getDeclaredFields()) {
|
|
||||||
switch (f.getName()) {
|
|
||||||
case "mLeftEdge":
|
|
||||||
f.setAccessible(true);
|
|
||||||
VIEW_PAGER_FIELD_EDGE_GLOW_LEFT = f;
|
|
||||||
break;
|
|
||||||
case "mRightEdge":
|
|
||||||
f.setAccessible(true);
|
|
||||||
VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT = f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setter methods
|
|
||||||
|
|
||||||
public static void setEdgeGlowColor(@NonNull ScrollView scrollView, @ColorInt int color) {
|
|
||||||
invalidateScrollViewFields();
|
|
||||||
try {
|
|
||||||
Object ee;
|
|
||||||
ee = SCROLL_VIEW_FIELD_EDGE_GLOW_TOP.get(scrollView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
ee = SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM.get(scrollView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
if (BuildConfig.DEBUG) ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setEdgeGlowColor(@NonNull NestedScrollView scrollView, @ColorInt int color) {
|
|
||||||
invalidateNestedScrollViewFields();
|
|
||||||
try {
|
|
||||||
Object ee;
|
|
||||||
ee = NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_TOP.get(scrollView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
ee = NESTED_SCROLL_VIEW_FIELD_EDGE_GLOW_BOTTOM.get(scrollView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
if (BuildConfig.DEBUG) ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setEdgeGlowColor(@NonNull AbsListView listView, @ColorInt int color) {
|
|
||||||
invalidateListViewFields();
|
|
||||||
try {
|
|
||||||
Object ee;
|
|
||||||
ee = LIST_VIEW_FIELD_EDGE_GLOW_TOP.get(listView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
ee = LIST_VIEW_FIELD_EDGE_GLOW_BOTTOM.get(listView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
if (BuildConfig.DEBUG) ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setEdgeGlowColor(@NonNull RecyclerView scrollView, final @ColorInt int color, @Nullable RecyclerView.OnScrollListener scrollListener) {
|
|
||||||
invalidateRecyclerViewFields();
|
|
||||||
invalidateRecyclerViewFields();
|
|
||||||
if (scrollListener == null) {
|
|
||||||
scrollListener = new RecyclerView.OnScrollListener() {
|
|
||||||
@Override
|
|
||||||
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
|
|
||||||
super.onScrollStateChanged(recyclerView, newState);
|
|
||||||
EdgeGlowUtil.setEdgeGlowColor(recyclerView, color, this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
scrollView.addOnScrollListener(scrollListener);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Object ee;
|
|
||||||
ee = RECYCLER_VIEW_FIELD_EDGE_GLOW_TOP.get(scrollView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
ee = RECYCLER_VIEW_FIELD_EDGE_GLOW_BOTTOM.get(scrollView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
ee = RECYCLER_VIEW_FIELD_EDGE_GLOW_LEFT.get(scrollView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
ee = RECYCLER_VIEW_FIELD_EDGE_GLOW_RIGHT.get(scrollView);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
if (BuildConfig.DEBUG) ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setEdgeGlowColor(@NonNull ViewPager pager, @ColorInt int color) {
|
|
||||||
invalidateViewPagerFields();
|
|
||||||
try {
|
|
||||||
Object ee;
|
|
||||||
ee = VIEW_PAGER_FIELD_EDGE_GLOW_LEFT.get(pager);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
ee = VIEW_PAGER_FIELD_EDGE_GLOW_RIGHT.get(pager);
|
|
||||||
setEffectColor(ee, color);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
if (BuildConfig.DEBUG) ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Utilities
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
private static void setEffectColor(Object edgeEffect, @ColorInt int color) {
|
|
||||||
invalidateEdgeEffectFields();
|
|
||||||
if (edgeEffect instanceof EdgeEffectCompat) {
|
|
||||||
// EdgeEffectCompat
|
|
||||||
try {
|
|
||||||
EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT.setAccessible(true);
|
|
||||||
edgeEffect = EDGE_EFFECT_COMPAT_FIELD_EDGE_EFFECT.get(edgeEffect);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (edgeEffect == null)
|
|
||||||
return;
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
// EdgeGlow
|
|
||||||
try {
|
|
||||||
EDGE_GLOW_FIELD_EDGE.setAccessible(true);
|
|
||||||
final Drawable mEdge = (Drawable) EDGE_GLOW_FIELD_EDGE.get(edgeEffect);
|
|
||||||
EDGE_GLOW_FIELD_GLOW.setAccessible(true);
|
|
||||||
final Drawable mGlow = (Drawable) EDGE_GLOW_FIELD_GLOW.get(edgeEffect);
|
|
||||||
mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN);
|
|
||||||
mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN);
|
|
||||||
mEdge.setCallback(null); // free up any references
|
|
||||||
mGlow.setCallback(null); // free up any references
|
|
||||||
} catch (Exception ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// EdgeEffect
|
|
||||||
((EdgeEffect) edgeEffect).setColor(color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.ColorStateList;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.internal.ThemeSingleton;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
|
|
||||||
public final class MaterialDialogsUtil {
|
|
||||||
|
|
||||||
public static void updateMaterialDialogsThemeSingleton(Context context) {
|
|
||||||
final ThemeSingleton md = ThemeSingleton.get();
|
|
||||||
md.titleColor = ThemeStore.textColorPrimary(context);
|
|
||||||
md.contentColor = ThemeStore.textColorSecondary(context);
|
|
||||||
md.itemColor = md.titleColor;
|
|
||||||
md.widgetColor = ThemeStore.accentColor(context);
|
|
||||||
md.linkColor = ColorStateList.valueOf(md.widgetColor);
|
|
||||||
md.positiveColor = ColorStateList.valueOf(md.widgetColor);
|
|
||||||
md.neutralColor = ColorStateList.valueOf(md.widgetColor);
|
|
||||||
md.negativeColor = ColorStateList.valueOf(md.widgetColor);
|
|
||||||
md.darkTheme = ATHUtil.isWindowBackgroundDark(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
private MaterialDialogsUtil() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.ColorStateList;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import com.google.android.material.button.MaterialButton;
|
|
||||||
import com.google.android.material.textfield.TextInputLayout;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
public class MaterialUtil {
|
|
||||||
public static void setTint(@NonNull MaterialButton button, boolean background) {
|
|
||||||
setTint(button, background, ThemeStore.accentColor(button.getContext()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setTint(@NonNull MaterialButton button) {
|
|
||||||
setTint(button, ThemeStore.accentColor(button.getContext()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void setTint(MaterialButton button, int accentColor) {
|
|
||||||
final Context context = button.getContext();
|
|
||||||
final ColorStateList textColor = ColorStateList.valueOf(MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(accentColor)));
|
|
||||||
button.setTextColor(textColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setTint(@NonNull MaterialButton button, boolean background, int color) {
|
|
||||||
//button.setPadding(48, 48, 48, 48);
|
|
||||||
button.setAllCaps(false);
|
|
||||||
final Context context = button.getContext();
|
|
||||||
final ColorStateList colorState = ColorStateList.valueOf(color);
|
|
||||||
final ColorStateList textColor = ColorStateList.valueOf(MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(color)));
|
|
||||||
|
|
||||||
|
|
||||||
if (background) {
|
|
||||||
button.setBackgroundTintList(colorState);
|
|
||||||
button.setTextColor(textColor);
|
|
||||||
button.setIconTint(textColor);
|
|
||||||
} else {
|
|
||||||
button.setStrokeColor(colorState);
|
|
||||||
button.setTextColor(colorState);
|
|
||||||
button.setIconTint(colorState);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setTint(TextInputLayout textInputLayout, boolean background) {
|
|
||||||
final Context context = textInputLayout.getContext();
|
|
||||||
final int accentColor = ThemeStore.accentColor(context);
|
|
||||||
final ColorStateList colorState = ColorStateList.valueOf(accentColor);
|
|
||||||
|
|
||||||
if (background) {
|
|
||||||
textInputLayout.setBackgroundTintList(colorState);
|
|
||||||
textInputLayout.setDefaultHintTextColor(colorState);
|
|
||||||
} else {
|
|
||||||
textInputLayout.setBoxStrokeColor(accentColor);
|
|
||||||
textInputLayout.setDefaultHintTextColor(colorState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
|
|
||||||
import code.name.monkey.appthemehelper.R;
|
|
||||||
|
|
||||||
|
|
||||||
public final class MaterialValueHelper {
|
|
||||||
|
|
||||||
@SuppressLint("PrivateResource")
|
|
||||||
@ColorInt
|
|
||||||
public static int getPrimaryTextColor(final Context context, boolean dark) {
|
|
||||||
if (dark) {
|
|
||||||
return ContextCompat.getColor(context, R.color.primary_text_default_material_light);
|
|
||||||
}
|
|
||||||
return ContextCompat.getColor(context, R.color.primary_text_default_material_dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("PrivateResource")
|
|
||||||
@ColorInt
|
|
||||||
public static int getSecondaryTextColor(final Context context, boolean dark) {
|
|
||||||
if (dark) {
|
|
||||||
return ContextCompat.getColor(context, R.color.secondary_text_default_material_light);
|
|
||||||
}
|
|
||||||
return ContextCompat.getColor(context, R.color.secondary_text_default_material_dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("PrivateResource")
|
|
||||||
@ColorInt
|
|
||||||
public static int getPrimaryDisabledTextColor(final Context context, boolean dark) {
|
|
||||||
if (dark) {
|
|
||||||
return ContextCompat.getColor(context, R.color.primary_text_disabled_material_light);
|
|
||||||
}
|
|
||||||
return ContextCompat.getColor(context, R.color.primary_text_disabled_material_dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("PrivateResource")
|
|
||||||
@ColorInt
|
|
||||||
public static int getSecondaryDisabledTextColor(final Context context, boolean dark) {
|
|
||||||
if (dark) {
|
|
||||||
return ContextCompat.getColor(context, R.color.secondary_text_disabled_material_light);
|
|
||||||
}
|
|
||||||
return ContextCompat.getColor(context, R.color.secondary_text_disabled_material_dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
private MaterialValueHelper() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.content.res.ColorStateList;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
|
|
||||||
import com.google.android.material.bottomnavigation.BottomNavigationView;
|
|
||||||
import com.google.android.material.navigation.NavigationView;
|
|
||||||
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public final class NavigationViewUtil {
|
|
||||||
|
|
||||||
private NavigationViewUtil() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setItemIconColors(@NonNull NavigationView navigationView, @ColorInt int normalColor, @ColorInt int selectedColor) {
|
|
||||||
final ColorStateList iconSl = new ColorStateList(
|
|
||||||
new int[][]{
|
|
||||||
new int[]{-android.R.attr.state_checked},
|
|
||||||
new int[]{android.R.attr.state_checked}
|
|
||||||
},
|
|
||||||
new int[]{
|
|
||||||
normalColor,
|
|
||||||
selectedColor
|
|
||||||
});
|
|
||||||
navigationView.setItemIconTintList(iconSl);
|
|
||||||
Drawable drawable = navigationView.getItemBackground();
|
|
||||||
navigationView.setItemBackground(TintHelper.createTintedDrawable(drawable, ColorUtil.withAlpha(ThemeStore.accentColor(navigationView.getContext()), 0.2f)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setItemTextColors(@NonNull NavigationView navigationView, @ColorInt int normalColor, @ColorInt int selectedColor) {
|
|
||||||
final ColorStateList textSl = new ColorStateList(
|
|
||||||
new int[][]{
|
|
||||||
new int[]{-android.R.attr.state_checked},
|
|
||||||
new int[]{android.R.attr.state_checked}
|
|
||||||
},
|
|
||||||
new int[]{
|
|
||||||
normalColor,
|
|
||||||
selectedColor
|
|
||||||
});
|
|
||||||
navigationView.setItemTextColor(textSl);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setItemIconColors(@NonNull BottomNavigationView bottomNavigationView, @ColorInt int normalColor, @ColorInt int selectedColor) {
|
|
||||||
final ColorStateList iconSl = new ColorStateList(
|
|
||||||
new int[][]{
|
|
||||||
new int[]{-android.R.attr.state_checked},
|
|
||||||
new int[]{android.R.attr.state_checked}
|
|
||||||
},
|
|
||||||
new int[]{
|
|
||||||
normalColor,
|
|
||||||
selectedColor
|
|
||||||
});
|
|
||||||
bottomNavigationView.setItemIconTintList(iconSl);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setItemTextColors(@NonNull BottomNavigationView bottomNavigationView, @ColorInt int normalColor, @ColorInt int selectedColor) {
|
|
||||||
final ColorStateList textSl = new ColorStateList(
|
|
||||||
new int[][]{
|
|
||||||
new int[]{-android.R.attr.state_checked},
|
|
||||||
new int[]{android.R.attr.state_checked}
|
|
||||||
},
|
|
||||||
new int[]{
|
|
||||||
normalColor,
|
|
||||||
selectedColor
|
|
||||||
});
|
|
||||||
bottomNavigationView.setItemTextColor(textSl);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.content.res.ColorStateList;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import com.google.android.material.tabs.TabLayout;
|
|
||||||
|
|
||||||
|
|
||||||
public final class TabLayoutUtil {
|
|
||||||
|
|
||||||
public static void setTabIconColors(@Nullable TabLayout tabLayout, @ColorInt int normalColor, @ColorInt int selectedColor) {
|
|
||||||
if (tabLayout == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
final ColorStateList sl = new ColorStateList(new int[][]{
|
|
||||||
new int[]{-android.R.attr.state_selected},
|
|
||||||
new int[]{android.R.attr.state_selected}
|
|
||||||
},
|
|
||||||
new int[]{
|
|
||||||
normalColor,
|
|
||||||
selectedColor
|
|
||||||
});
|
|
||||||
for (int i = 0; i < tabLayout.getTabCount(); i++) {
|
|
||||||
final TabLayout.Tab tab = tabLayout.getTabAt(i);
|
|
||||||
if (tab != null && tab.getIcon() != null) {
|
|
||||||
tab.setIcon(TintHelper.createTintedDrawable(tab.getIcon(), sl));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private TabLayoutUtil() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.content.res.ColorStateList;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import com.google.android.material.textfield.TextInputLayout;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
public final class TextInputLayoutUtil {
|
|
||||||
|
|
||||||
public static void setHint(@NonNull TextInputLayout view, @ColorInt int hintColor) {
|
|
||||||
try {
|
|
||||||
final Field mDefaultTextColorField = TextInputLayout.class.getDeclaredField("mDefaultTextColor");
|
|
||||||
mDefaultTextColorField.setAccessible(true);
|
|
||||||
mDefaultTextColorField.set(view, ColorStateList.valueOf(hintColor));
|
|
||||||
} catch (Throwable t) {
|
|
||||||
throw new RuntimeException("Failed to set TextInputLayout hint (collapsed) color: " + t.getLocalizedMessage(), t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setAccent(@NonNull TextInputLayout view, @ColorInt int accentColor) {
|
|
||||||
try {
|
|
||||||
final Field mFocusedTextColorField = TextInputLayout.class.getDeclaredField("mFocusedTextColor");
|
|
||||||
mFocusedTextColorField.setAccessible(true);
|
|
||||||
mFocusedTextColorField.set(view, ColorStateList.valueOf(accentColor));
|
|
||||||
} catch (Throwable t) {
|
|
||||||
throw new RuntimeException("Failed to set TextInputLayout accent (expanded) color: " + t.getLocalizedMessage(), t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private TextInputLayoutUtil() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -60,10 +60,10 @@ public final class TintHelper {
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public static void setTintSelector(@NonNull View view, @ColorInt final int color, final boolean darker, final boolean useDarkTheme) {
|
public static void setTintSelector(@NonNull View view, @ColorInt final int color, final boolean darker, final boolean useDarkTheme) {
|
||||||
final boolean isColorLight = ColorUtil.isColorLight(color);
|
final boolean isColorLight = ColorUtil.INSTANCE.isColorLight(color);
|
||||||
final int disabled = ContextCompat.getColor(view.getContext(), useDarkTheme ? R.color.ate_button_disabled_dark : R.color.ate_button_disabled_light);
|
final int disabled = ContextCompat.getColor(view.getContext(), useDarkTheme ? R.color.ate_button_disabled_dark : R.color.ate_button_disabled_light);
|
||||||
final int pressed = ColorUtil.shiftColor(color, darker ? 0.9f : 1.1f);
|
final int pressed = ColorUtil.INSTANCE.shiftColor(color, darker ? 0.9f : 1.1f);
|
||||||
final int activated = ColorUtil.shiftColor(color, darker ? 1.1f : 0.9f);
|
final int activated = ColorUtil.INSTANCE.shiftColor(color, darker ? 1.1f : 0.9f);
|
||||||
final int rippleColor = getDefaultRippleColor(view.getContext(), isColorLight);
|
final int rippleColor = getDefaultRippleColor(view.getContext(), isColorLight);
|
||||||
final int textColor = ContextCompat.getColor(view.getContext(), isColorLight ? R.color.ate_primary_text_light : R.color.ate_primary_text_dark);
|
final int textColor = ContextCompat.getColor(view.getContext(), isColorLight ? R.color.ate_primary_text_light : R.color.ate_primary_text_dark);
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ public final class TintHelper {
|
||||||
Drawable drawable = view.getBackground();
|
Drawable drawable = view.getBackground();
|
||||||
if (drawable != null) {
|
if (drawable != null) {
|
||||||
drawable = createTintedDrawable(drawable, sl);
|
drawable = createTintedDrawable(drawable, sl);
|
||||||
ViewUtil.setBackgroundCompat(view, drawable);
|
ViewUtil.INSTANCE.setBackgroundCompat(view, drawable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (view instanceof TextView && !(view instanceof Button)) {
|
if (view instanceof TextView && !(view instanceof Button)) {
|
||||||
|
@ -128,7 +128,7 @@ public final class TintHelper {
|
||||||
|
|
||||||
public static void setTintAuto(final @NonNull View view, final @ColorInt int color,
|
public static void setTintAuto(final @NonNull View view, final @ColorInt int color,
|
||||||
boolean background) {
|
boolean background) {
|
||||||
setTintAuto(view, color, background, ATHUtil.isWindowBackgroundDark(view.getContext()));
|
setTintAuto(view, color, background, ATHUtil.INSTANCE.isWindowBackgroundDark(view.getContext()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
|
@ -159,7 +159,7 @@ public final class TintHelper {
|
||||||
RippleDrawable rd = (RippleDrawable) view.getBackground();
|
RippleDrawable rd = (RippleDrawable) view.getBackground();
|
||||||
@SuppressLint("PrivateResource") final int unchecked = ContextCompat.getColor(view.getContext(),
|
@SuppressLint("PrivateResource") final int unchecked = ContextCompat.getColor(view.getContext(),
|
||||||
isDark ? R.color.ripple_material_dark : R.color.ripple_material_light);
|
isDark ? R.color.ripple_material_dark : R.color.ripple_material_light);
|
||||||
final int checked = ColorUtil.adjustAlpha(color, 0.4f);
|
final int checked = ColorUtil.INSTANCE.adjustAlpha(color, 0.4f);
|
||||||
final ColorStateList sl = new ColorStateList(
|
final ColorStateList sl = new ColorStateList(
|
||||||
new int[][]{
|
new int[][]{
|
||||||
new int[]{-android.R.attr.state_activated, -android.R.attr.state_checked},
|
new int[]{-android.R.attr.state_activated, -android.R.attr.state_checked},
|
||||||
|
@ -183,7 +183,7 @@ public final class TintHelper {
|
||||||
Drawable drawable = view.getBackground();
|
Drawable drawable = view.getBackground();
|
||||||
if (drawable != null) {
|
if (drawable != null) {
|
||||||
drawable = createTintedDrawable(drawable, color);
|
drawable = createTintedDrawable(drawable, color);
|
||||||
ViewUtil.setBackgroundCompat(view, drawable);
|
ViewUtil.INSTANCE.setBackgroundCompat(view, drawable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ public final class TintHelper {
|
||||||
new int[]{android.R.attr.state_enabled, android.R.attr.state_checked}
|
new int[]{android.R.attr.state_enabled, android.R.attr.state_checked}
|
||||||
}, new int[]{
|
}, new int[]{
|
||||||
// Rdio button includes own alpha for disabled state
|
// Rdio button includes own alpha for disabled state
|
||||||
ColorUtil.stripAlpha(ContextCompat.getColor(radioButton.getContext(), useDarker ? R.color.ate_control_disabled_dark : R.color.ate_control_disabled_light)),
|
ColorUtil.INSTANCE.stripAlpha(ContextCompat.getColor(radioButton.getContext(), useDarker ? R.color.ate_control_disabled_dark : R.color.ate_control_disabled_light)),
|
||||||
ContextCompat.getColor(radioButton.getContext(), useDarker ? R.color.ate_control_normal_dark : R.color.ate_control_normal_light),
|
ContextCompat.getColor(radioButton.getContext(), useDarker ? R.color.ate_control_normal_dark : R.color.ate_control_normal_light),
|
||||||
color
|
color
|
||||||
});
|
});
|
||||||
|
@ -298,9 +298,9 @@ public final class TintHelper {
|
||||||
|
|
||||||
private static Drawable modifySwitchDrawable(@NonNull Context context, @NonNull Drawable from, @ColorInt int tint, boolean thumb, boolean compatSwitch, boolean useDarker) {
|
private static Drawable modifySwitchDrawable(@NonNull Context context, @NonNull Drawable from, @ColorInt int tint, boolean thumb, boolean compatSwitch, boolean useDarker) {
|
||||||
if (useDarker) {
|
if (useDarker) {
|
||||||
tint = ColorUtil.shiftColor(tint, 1.1f);
|
tint = ColorUtil.INSTANCE.shiftColor(tint, 1.1f);
|
||||||
}
|
}
|
||||||
tint = ColorUtil.adjustAlpha(tint, (compatSwitch && !thumb) ? 0.5f : 1.0f);
|
tint = ColorUtil.INSTANCE.adjustAlpha(tint, (compatSwitch && !thumb) ? 0.5f : 1.0f);
|
||||||
int disabled;
|
int disabled;
|
||||||
int normal;
|
int normal;
|
||||||
if (thumb) {
|
if (thumb) {
|
||||||
|
@ -313,7 +313,7 @@ public final class TintHelper {
|
||||||
|
|
||||||
// Stock switch includes its own alpha
|
// Stock switch includes its own alpha
|
||||||
if (!compatSwitch) {
|
if (!compatSwitch) {
|
||||||
normal = ColorUtil.stripAlpha(normal);
|
normal = ColorUtil.INSTANCE.stripAlpha(normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
final ColorStateList sl = new ColorStateList(
|
final ColorStateList sl = new ColorStateList(
|
||||||
|
|
|
@ -140,8 +140,8 @@ public final class ToolbarContentTintHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Step 3: Changing the color of title and subtitle.
|
//Step 3: Changing the color of title and subtitle.
|
||||||
toolbarView.setTitleTextColor(ThemeStore.textColorPrimary(activity));
|
toolbarView.setTitleTextColor(ThemeStore.Companion.textColorPrimary(activity));
|
||||||
toolbarView.setSubtitleTextColor(ThemeStore.textColorSecondary(activity));
|
toolbarView.setSubtitleTextColor(ThemeStore.Companion.textColorSecondary(activity));
|
||||||
|
|
||||||
//Step 4: Changing the color of the Overflow Menu icon.
|
//Step 4: Changing the color of the Overflow Menu icon.
|
||||||
setOverflowButtonColor(activity, toolbarView, toolbarIconsColor);
|
setOverflowButtonColor(activity, toolbarView, toolbarIconsColor);
|
||||||
|
@ -204,7 +204,7 @@ public final class ToolbarContentTintHelper {
|
||||||
public static void setToolbarContentColorBasedOnToolbarColor(@NonNull Context context,
|
public static void setToolbarContentColorBasedOnToolbarColor(@NonNull Context context,
|
||||||
Toolbar toolbar, @Nullable Menu menu, int toolbarColor) {
|
Toolbar toolbar, @Nullable Menu menu, int toolbarColor) {
|
||||||
setToolbarContentColorBasedOnToolbarColor(context, toolbar, menu, toolbarColor,
|
setToolbarContentColorBasedOnToolbarColor(context, toolbar, menu, toolbarColor,
|
||||||
ThemeStore.accentColor(context));
|
ThemeStore.Companion.accentColor(context));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setToolbarContentColorBasedOnToolbarColor(@NonNull Context context,
|
public static void setToolbarContentColorBasedOnToolbarColor(@NonNull Context context,
|
||||||
|
@ -309,7 +309,7 @@ public final class ToolbarContentTintHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleOnPrepareOptionsMenu(Activity activity, Toolbar toolbar) {
|
public static void handleOnPrepareOptionsMenu(Activity activity, Toolbar toolbar) {
|
||||||
handleOnPrepareOptionsMenu(activity, toolbar, ThemeStore.accentColor(activity));
|
handleOnPrepareOptionsMenu(activity, toolbar, ThemeStore.Companion.accentColor(activity));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleOnPrepareOptionsMenu(Activity activity, Toolbar toolbar,
|
public static void handleOnPrepareOptionsMenu(Activity activity, Toolbar toolbar,
|
||||||
|
@ -332,7 +332,7 @@ public final class ToolbarContentTintHelper {
|
||||||
@CheckResult
|
@CheckResult
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public static int toolbarContentColor(@NonNull Context context, @ColorInt int toolbarColor) {
|
public static int toolbarContentColor(@NonNull Context context, @ColorInt int toolbarColor) {
|
||||||
if (ColorUtil.isColorLight(toolbarColor)) {
|
if (ColorUtil.INSTANCE.isColorLight(toolbarColor)) {
|
||||||
return toolbarSubtitleColor(context, toolbarColor);
|
return toolbarSubtitleColor(context, toolbarColor);
|
||||||
}
|
}
|
||||||
return toolbarTitleColor(context, toolbarColor);
|
return toolbarTitleColor(context, toolbarColor);
|
||||||
|
@ -341,13 +341,13 @@ public final class ToolbarContentTintHelper {
|
||||||
@CheckResult
|
@CheckResult
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public static int toolbarSubtitleColor(@NonNull Context context, @ColorInt int toolbarColor) {
|
public static int toolbarSubtitleColor(@NonNull Context context, @ColorInt int toolbarColor) {
|
||||||
return MaterialValueHelper.getSecondaryTextColor(context, ColorUtil.isColorLight(toolbarColor));
|
return MaterialValueHelper.INSTANCE.getSecondaryTextColor(context, ColorUtil.INSTANCE.isColorLight(toolbarColor));
|
||||||
}
|
}
|
||||||
|
|
||||||
@CheckResult
|
@CheckResult
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public static int toolbarTitleColor(@NonNull Context context, @ColorInt int toolbarColor) {
|
public static int toolbarTitleColor(@NonNull Context context, @ColorInt int toolbarColor) {
|
||||||
return MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(toolbarColor));
|
return MaterialValueHelper.INSTANCE.getPrimaryTextColor(context, ColorUtil.INSTANCE.isColorLight(toolbarColor));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ATHMenuPresenterCallback implements MenuPresenter.Callback {
|
private static class ATHMenuPresenterCallback implements MenuPresenter.Callback {
|
||||||
|
@ -485,8 +485,8 @@ public final class ToolbarContentTintHelper {
|
||||||
.getDeclaredField("mRadioButton");
|
.getDeclaredField("mRadioButton");
|
||||||
radioButtonField.setAccessible(true);
|
radioButtonField.setAccessible(true);
|
||||||
|
|
||||||
final boolean isDark = !ColorUtil.isColorLight(
|
final boolean isDark = !ColorUtil.INSTANCE.isColorLight(
|
||||||
ATHUtil.resolveColor(context, android.R.attr.windowBackground));
|
ATHUtil.INSTANCE.resolveColor(context, android.R.attr.windowBackground));
|
||||||
|
|
||||||
for (int i = 0; i < listView.getChildCount(); i++) {
|
for (int i = 0; i < listView.getChildCount(); i++) {
|
||||||
View v = listView.getChildAt(i);
|
View v = listView.getChildAt(i);
|
||||||
|
@ -545,7 +545,7 @@ public final class ToolbarContentTintHelper {
|
||||||
}
|
}
|
||||||
final AppCompatImageView overflow = (AppCompatImageView) outViews.get(0);
|
final AppCompatImageView overflow = (AppCompatImageView) outViews.get(0);
|
||||||
overflow.setImageDrawable(TintHelper.createTintedDrawable(overflow.getDrawable(), color));
|
overflow.setImageDrawable(TintHelper.createTintedDrawable(overflow.getDrawable(), color));
|
||||||
ViewUtil.removeOnGlobalLayoutListener(decorView, this);
|
ViewUtil.INSTANCE.removeOnGlobalLayoutListener(decorView, this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -576,7 +576,7 @@ public final class ToolbarContentTintHelper {
|
||||||
mSearchSrcTextViewField.setAccessible(true);
|
mSearchSrcTextViewField.setAccessible(true);
|
||||||
final EditText mSearchSrcTextView = (EditText) mSearchSrcTextViewField.get(searchView);
|
final EditText mSearchSrcTextView = (EditText) mSearchSrcTextViewField.get(searchView);
|
||||||
mSearchSrcTextView.setTextColor(color);
|
mSearchSrcTextView.setTextColor(color);
|
||||||
mSearchSrcTextView.setHintTextColor(ColorUtil.adjustAlpha(color, 0.5f));
|
mSearchSrcTextView.setHintTextColor(ColorUtil.INSTANCE.adjustAlpha(color, 0.5f));
|
||||||
TintHelper.setCursorTint(mSearchSrcTextView, color);
|
TintHelper.setCursorTint(mSearchSrcTextView, color);
|
||||||
|
|
||||||
Field field = cls.getDeclaredField("mSearchButton");
|
Field field = cls.getDeclaredField("mSearchButton");
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Aidan Follestad (afollestad)
|
|
||||||
*/
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Typeface;
|
|
||||||
import androidx.collection.SimpleArrayMap;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Each call to Typeface.createFromAsset will load a new instance of the typeface into memory,
|
|
||||||
and this memory is not consistently get garbage collected
|
|
||||||
http://code.google.com/p/android/issues/detail?id=9904
|
|
||||||
(It states released but even on Lollipop you can see the typefaces accumulate even after
|
|
||||||
multiple GC passes)
|
|
||||||
|
|
||||||
You can detect this by running:
|
|
||||||
adb shell dumpsys meminfo com.your.packagenage
|
|
||||||
|
|
||||||
You will see output like:
|
|
||||||
|
|
||||||
Asset Allocations
|
|
||||||
zip:/data/app/com.your.packagenage-1.apk:/assets/Roboto-Medium.ttf: 125K
|
|
||||||
zip:/data/app/com.your.packagenage-1.apk:/assets/Roboto-Medium.ttf: 125K
|
|
||||||
zip:/data/app/com.your.packagenage-1.apk:/assets/Roboto-Medium.ttf: 125K
|
|
||||||
zip:/data/app/com.your.packagenage-1.apk:/assets/Roboto-Regular.ttf: 123K
|
|
||||||
zip:/data/app/com.your.packagenage-1.apk:/assets/Roboto-Medium.ttf: 125K
|
|
||||||
|
|
||||||
*/
|
|
||||||
public final class TypefaceHelper {
|
|
||||||
|
|
||||||
private static final SimpleArrayMap<String, Typeface> cache = new SimpleArrayMap<>();
|
|
||||||
|
|
||||||
public static Typeface get(Context c, String name) {
|
|
||||||
synchronized (cache) {
|
|
||||||
if (!cache.containsKey(name)) {
|
|
||||||
try {
|
|
||||||
Typeface t = Typeface.createFromAsset(c.getAssets(), name);
|
|
||||||
cache.put(name, t);
|
|
||||||
return t;
|
|
||||||
} catch (RuntimeException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cache.get(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.os.Build;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Hemanth S (h4h13).
|
|
||||||
*/
|
|
||||||
|
|
||||||
public final class VersionUtils {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if device is running API >= 19
|
|
||||||
*/
|
|
||||||
public static boolean hasKitKat() {
|
|
||||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if device is running API >= 20
|
|
||||||
*/
|
|
||||||
public static boolean hasAndroidLPreview() {
|
|
||||||
return Build.VERSION.SDK_INT >= 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if device is running API >= 21
|
|
||||||
*/
|
|
||||||
public static boolean hasLollipop() {
|
|
||||||
return Build.VERSION.SDK_INT >= 21;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if device is running API >= 23
|
|
||||||
*/
|
|
||||||
public static boolean hasMarshmallow() {
|
|
||||||
return Build.VERSION.SDK_INT >= 23;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if device is running API >= 24
|
|
||||||
*/
|
|
||||||
public static boolean hasNougat() {
|
|
||||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if device is running API >= 24
|
|
||||||
*/
|
|
||||||
public static boolean hasNougatMR() {
|
|
||||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if device is running API >= 26
|
|
||||||
*/
|
|
||||||
public static boolean hasOreo() {
|
|
||||||
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
package code.name.monkey.appthemehelper.util;
|
|
||||||
|
|
||||||
import android.graphics.drawable.ColorDrawable;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.graphics.drawable.TransitionDrawable;
|
|
||||||
import android.os.Build;
|
|
||||||
import androidx.annotation.ColorInt;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewTreeObserver;
|
|
||||||
|
|
||||||
|
|
||||||
public final class ViewUtil {
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener) {
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
|
|
||||||
v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
|
|
||||||
} else {
|
|
||||||
v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public static void setBackgroundCompat(@NonNull View view, @Nullable Drawable drawable) {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
|
|
||||||
view.setBackground(drawable);
|
|
||||||
else view.setBackgroundDrawable(drawable);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TransitionDrawable setBackgroundTransition(@NonNull View view, @NonNull Drawable newDrawable) {
|
|
||||||
TransitionDrawable transition = DrawableUtil.createTransitionDrawable(view.getBackground(), newDrawable);
|
|
||||||
setBackgroundCompat(view, transition);
|
|
||||||
return transition;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TransitionDrawable setBackgroundColorTransition(@NonNull View view, @ColorInt int newColor) {
|
|
||||||
final Drawable oldColor = view.getBackground();
|
|
||||||
|
|
||||||
Drawable start = oldColor != null ? oldColor : new ColorDrawable(view.getSolidColor());
|
|
||||||
Drawable end = new ColorDrawable(newColor);
|
|
||||||
|
|
||||||
TransitionDrawable transition = DrawableUtil.createTransitionDrawable(start, end);
|
|
||||||
|
|
||||||
setBackgroundCompat(view, transition);
|
|
||||||
|
|
||||||
return transition;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ViewUtil() {
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue