Support theme colors in AppShortcut icons
This commit is contained in:
parent
6b43160a0f
commit
49a3d0b28a
11 changed files with 95 additions and 48 deletions
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.kabouzeid.gramophone.appshortcuts;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.graphics.drawable.Icon;
|
||||||
|
import android.graphics.drawable.LayerDrawable;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.support.annotation.RequiresApi;
|
||||||
|
import android.util.TypedValue;
|
||||||
|
|
||||||
|
import com.kabouzeid.appthemehelper.ThemeStore;
|
||||||
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Campos
|
||||||
|
*/
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.N_MR1)
|
||||||
|
public final class AppShortcutIconGenerator {
|
||||||
|
public static Icon generateThemedIcon(Context context, int iconId) {
|
||||||
|
//Get background color from context's theme
|
||||||
|
final TypedValue typedColorBackground = new TypedValue();
|
||||||
|
context.getTheme().resolveAttribute(android.R.attr.colorBackground, typedColorBackground, true);
|
||||||
|
|
||||||
|
//Return an Icon of iconId with those colors
|
||||||
|
return generateThemedIcon(context, iconId,
|
||||||
|
ThemeStore.primaryColor(context),
|
||||||
|
typedColorBackground.data
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Icon generateThemedIcon(Context context, int iconId, int foregroundColor, int backgroundColor) {
|
||||||
|
//Get and tint foreground and background drawables
|
||||||
|
Drawable vectorDrawable = Util.getTintedVectorDrawable(context, iconId, foregroundColor);
|
||||||
|
Drawable backgroundDrawable = Util.getTintedVectorDrawable(context, R.drawable.ic_app_shortcut_background, backgroundColor);
|
||||||
|
|
||||||
|
//Squash the two drawables together
|
||||||
|
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{backgroundDrawable, vectorDrawable});
|
||||||
|
|
||||||
|
//Return as an Icon
|
||||||
|
return Icon.createWithBitmap(drawableToBitmap(layerDrawable));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Bitmap drawableToBitmap(Drawable drawable) {
|
||||||
|
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
|
||||||
|
Canvas canvas = new Canvas(bitmap);
|
||||||
|
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
|
||||||
|
drawable.draw(canvas);
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -47,6 +47,10 @@ public class DynamicShortcutManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateDynamicShortcuts() {
|
||||||
|
shortcutManager.updateShortcuts(getDefaultShortcuts());
|
||||||
|
}
|
||||||
|
|
||||||
public List<ShortcutInfo> getDefaultShortcuts() {
|
public List<ShortcutInfo> getDefaultShortcuts() {
|
||||||
return (Arrays.asList(
|
return (Arrays.asList(
|
||||||
new ShuffleAllShortcutType(mContext).getShortcutInfo(),
|
new ShuffleAllShortcutType(mContext).getShortcutInfo(),
|
||||||
|
|
@ -54,15 +58,4 @@ public class DynamicShortcutManager {
|
||||||
new LastAddedShortcutType(mContext).getShortcutInfo()
|
new LastAddedShortcutType(mContext).getShortcutInfo()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void tintShortcutIcons(ArrayList<ShortcutInfo> shortcutInfos, Color color) {
|
|
||||||
for (ShortcutInfo shortcutInfo : shortcutInfos) {
|
|
||||||
tintShortcutIcon(shortcutInfo, color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void tintShortcutIcon(ShortcutInfo shortcutInfo, Color color) {
|
|
||||||
//TODO Tint icons here
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype;
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ShortcutInfo;
|
import android.content.pm.ShortcutInfo;
|
||||||
import android.graphics.drawable.Icon;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator;
|
||||||
import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,7 +22,7 @@ public final class LastAddedShortcutType extends BaseShortcutType {
|
||||||
return new ShortcutInfo.Builder(mContext, ID_PREFIX + "last_added")
|
return new ShortcutInfo.Builder(mContext, ID_PREFIX + "last_added")
|
||||||
.setShortLabel(mContext.getString(R.string.app_shortcut_last_added_short))
|
.setShortLabel(mContext.getString(R.string.app_shortcut_last_added_short))
|
||||||
.setLongLabel(mContext.getString(R.string.app_shortcut_last_added_long))
|
.setLongLabel(mContext.getString(R.string.app_shortcut_last_added_long))
|
||||||
.setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_last_added))
|
.setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_last_added))
|
||||||
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED))
|
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.LAST_ADDED))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype;
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ShortcutInfo;
|
import android.content.pm.ShortcutInfo;
|
||||||
import android.graphics.drawable.Icon;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator;
|
||||||
import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,7 +22,7 @@ public final class ShuffleAllShortcutType extends BaseShortcutType {
|
||||||
return new ShortcutInfo.Builder(mContext, ID_PREFIX + "shuffle_all")
|
return new ShortcutInfo.Builder(mContext, ID_PREFIX + "shuffle_all")
|
||||||
.setShortLabel(mContext.getString(R.string.app_shortcut_shuffle_all_short))
|
.setShortLabel(mContext.getString(R.string.app_shortcut_shuffle_all_short))
|
||||||
.setLongLabel(mContext.getString(R.string.app_shortcut_shuffle_all_long))
|
.setLongLabel(mContext.getString(R.string.app_shortcut_shuffle_all_long))
|
||||||
.setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_shuffle_all))
|
.setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_shuffle_all))
|
||||||
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL))
|
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.SHUFFLE_ALL))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ package com.kabouzeid.gramophone.appshortcuts.shortcuttype;
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ShortcutInfo;
|
import android.content.pm.ShortcutInfo;
|
||||||
import android.graphics.drawable.Icon;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.appshortcuts.AppShortcutIconGenerator;
|
||||||
import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
import com.kabouzeid.gramophone.appshortcuts.AppShortcutLauncherActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -22,7 +22,7 @@ public final class TopTracksShortcutType extends BaseShortcutType {
|
||||||
return new ShortcutInfo.Builder(mContext, ID_PREFIX + "top_tracks")
|
return new ShortcutInfo.Builder(mContext, ID_PREFIX + "top_tracks")
|
||||||
.setShortLabel(mContext.getString(R.string.app_shortcut_top_tracks_short))
|
.setShortLabel(mContext.getString(R.string.app_shortcut_top_tracks_short))
|
||||||
.setLongLabel(mContext.getString(R.string.app_shortcut_top_tracks_long))
|
.setLongLabel(mContext.getString(R.string.app_shortcut_top_tracks_long))
|
||||||
.setIcon(Icon.createWithResource(mContext, R.drawable.ic_app_shortcut_top_tracks))
|
.setIcon(AppShortcutIconGenerator.generateThemedIcon(mContext, R.drawable.ic_app_shortcut_top_tracks))
|
||||||
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS))
|
.setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.ShortcutType.TOP_TRACKS))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
|
||||||
|
|
||||||
//Set up dynamic shortcuts
|
//Set up dynamic shortcuts
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
||||||
new DynamicShortcutManager(getApplicationContext()).initDynamicShortcuts();
|
new DynamicShortcutManager(this).initDynamicShortcuts();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEColorPreference;
|
||||||
import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat;
|
import com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat;
|
||||||
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
import com.kabouzeid.appthemehelper.util.ColorUtil;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.appshortcuts.DynamicShortcutManager;
|
||||||
import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreference;
|
import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreference;
|
||||||
import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreferenceDialog;
|
import com.kabouzeid.gramophone.preferences.NowPlayingScreenPreferenceDialog;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
|
||||||
|
|
@ -78,6 +79,10 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
|
||||||
.commit();
|
.commit();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
||||||
|
new DynamicShortcutManager(this).updateDynamicShortcuts();
|
||||||
|
}
|
||||||
recreate();
|
recreate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -171,6 +176,13 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
|
||||||
ThemeStore.editTheme(getActivity())
|
ThemeStore.editTheme(getActivity())
|
||||||
.activityTheme(PreferenceUtil.getThemeResFromPrefValue((String) o))
|
.activityTheme(PreferenceUtil.getThemeResFromPrefValue((String) o))
|
||||||
.commit();
|
.commit();
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
||||||
|
//Set the new theme so that updateAppShortcuts can pull it
|
||||||
|
getActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue((String) o));
|
||||||
|
new DynamicShortcutManager(getActivity()).updateDynamicShortcuts();
|
||||||
|
}
|
||||||
|
|
||||||
getActivity().recreate();
|
getActivity().recreate();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
app/src/main/res/drawable/ic_app_shortcut_background.xml
Normal file
18
app/src/main/res/drawable/ic_app_shortcut_background.xml
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="176dp"
|
||||||
|
android:height="176dp"
|
||||||
|
android:viewportHeight="176"
|
||||||
|
android:viewportWidth="176">
|
||||||
|
|
||||||
|
<group
|
||||||
|
android:pivotX="88"
|
||||||
|
android:pivotY="88"
|
||||||
|
android:scaleX="0.916"
|
||||||
|
android:scaleY="0.916">
|
||||||
|
<path
|
||||||
|
android:name="ic_app_shortcut_background"
|
||||||
|
android:fillColor="#f5f5f5"
|
||||||
|
android:pathData="M 88 0 C 136.601057985 0 176 39.3989420149 176 88 C 176 136.601057985 136.601057985 176 88 176 C 39.3989420149 176 0 136.601057985 0 88 C 0 39.3989420149 39.3989420149 0 88 0 Z" />
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
|
|
@ -5,16 +5,6 @@
|
||||||
android:viewportHeight="176"
|
android:viewportHeight="176"
|
||||||
android:viewportWidth="176">
|
android:viewportWidth="176">
|
||||||
|
|
||||||
<group
|
|
||||||
android:pivotX="88"
|
|
||||||
android:pivotY="88"
|
|
||||||
android:scaleX="0.916"
|
|
||||||
android:scaleY="0.916">
|
|
||||||
<path
|
|
||||||
android:name="ic_app_shortcut_last_added_bg"
|
|
||||||
android:fillColor="#f5f5f5"
|
|
||||||
android:pathData="M 88 0 C 136.601057985 0 176 39.3989420149 176 88 C 176 136.601057985 136.601057985 176 88 176 C 39.3989420149 176 0 136.601057985 0 88 C 0 39.3989420149 39.3989420149 0 88 0 Z" />
|
|
||||||
</group>
|
|
||||||
<group
|
<group
|
||||||
android:pivotX="88"
|
android:pivotX="88"
|
||||||
android:pivotY="88"
|
android:pivotY="88"
|
||||||
|
|
|
||||||
|
|
@ -5,16 +5,6 @@
|
||||||
android:viewportHeight="176"
|
android:viewportHeight="176"
|
||||||
android:viewportWidth="176">
|
android:viewportWidth="176">
|
||||||
|
|
||||||
<group
|
|
||||||
android:pivotX="88"
|
|
||||||
android:pivotY="88"
|
|
||||||
android:scaleX="0.916"
|
|
||||||
android:scaleY="0.916">
|
|
||||||
<path
|
|
||||||
android:name="ic_app_shortcut_shuffle_bg"
|
|
||||||
android:fillColor="#f5f5f5"
|
|
||||||
android:pathData="M 88 0 C 136.601057985 0 176 39.3989420149 176 88 C 176 136.601057985 136.601057985 176 88 176 C 39.3989420149 176 0 136.601057985 0 88 C 0 39.3989420149 39.3989420149 0 88 0 Z" />
|
|
||||||
</group>
|
|
||||||
<group
|
<group
|
||||||
android:pivotX="88"
|
android:pivotX="88"
|
||||||
android:pivotY="88"
|
android:pivotY="88"
|
||||||
|
|
|
||||||
|
|
@ -5,16 +5,6 @@
|
||||||
android:viewportHeight="176"
|
android:viewportHeight="176"
|
||||||
android:viewportWidth="176">
|
android:viewportWidth="176">
|
||||||
|
|
||||||
<group
|
|
||||||
android:pivotX="88"
|
|
||||||
android:pivotY="88"
|
|
||||||
android:scaleX="0.916"
|
|
||||||
android:scaleY="0.916">
|
|
||||||
<path
|
|
||||||
android:name="ic_app_shortcut_top_tracks_bg"
|
|
||||||
android:fillColor="#f5f5f5"
|
|
||||||
android:pathData="M 88 0 C 136.601057985 0 176 39.3989420149 176 88 C 176 136.601057985 136.601057985 176 88 176 C 39.3989420149 176 0 136.601057985 0 88 C 0 39.3989420149 39.3989420149 0 88 0 Z" />
|
|
||||||
</group>
|
|
||||||
<group
|
<group
|
||||||
android:pivotX="88"
|
android:pivotX="88"
|
||||||
android:pivotY="88"
|
android:pivotY="88"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue