127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerpackage com.android.launcher3.dynamicui; 227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerimport android.content.Context; 427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerimport android.graphics.Color; 527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerimport android.support.v4.graphics.ColorUtils; 627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerimport android.util.Pair; 727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerimport com.android.launcher3.compat.WallpaperColorsCompat; 927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerimport com.android.launcher3.compat.WallpaperManagerCompat; 1027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 1127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerimport java.util.ArrayList; 1227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 1327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerimport static android.app.WallpaperManager.FLAG_SYSTEM; 1427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 1527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschlerpublic class WallpaperColorInfo implements WallpaperManagerCompat.OnColorsChangedListenerCompat { 1627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 1727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private static final int FALLBACK_COLOR = Color.WHITE; 1827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private static final Object sInstanceLock = new Object(); 1927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private static WallpaperColorInfo sInstance; 2027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 2127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public static WallpaperColorInfo getInstance(Context context) { 2227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler synchronized (sInstanceLock) { 2327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler if (sInstance == null) { 2427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler sInstance = new WallpaperColorInfo(context.getApplicationContext()); 2527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 2627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler return sInstance; 2727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 2827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 2927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 3027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private final ArrayList<OnChangeListener> mListeners = new ArrayList<>(); 3127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private final WallpaperManagerCompat mWallpaperManager; 32c6e07299c2aafe9397324e0823311171a7b9b09eMario Bertschler private final ColorExtractionAlgorithm mExtractionType; 3327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private int mMainColor; 3427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private int mSecondaryColor; 3527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private boolean mIsDark; 36a69369450281376cb207be554199bb4895843eb2Mario Bertschler private boolean mSupportsDarkText; 3727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private OnThemeChangeListener mOnThemeChangeListener; 3827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 3927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private WallpaperColorInfo(Context context) { 4027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mWallpaperManager = WallpaperManagerCompat.getInstance(context); 4127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mWallpaperManager.addOnColorsChangedListener(this); 42c6e07299c2aafe9397324e0823311171a7b9b09eMario Bertschler mExtractionType = ColorExtractionAlgorithm.newInstance(context); 4327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler update(mWallpaperManager.getWallpaperColors(FLAG_SYSTEM)); 4427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 4527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 4627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public int getMainColor() { 4727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler return mMainColor; 4827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 4927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 5027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public int getSecondaryColor() { 5127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler return mSecondaryColor; 5227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 5327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 5427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public boolean isDark() { 5527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler return mIsDark; 5627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 5727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 58a69369450281376cb207be554199bb4895843eb2Mario Bertschler public boolean supportsDarkText() { 59a69369450281376cb207be554199bb4895843eb2Mario Bertschler return mSupportsDarkText; 60a69369450281376cb207be554199bb4895843eb2Mario Bertschler } 61a69369450281376cb207be554199bb4895843eb2Mario Bertschler 6227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler @Override 6327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public void onColorsChanged(WallpaperColorsCompat colors, int which) { 648392c823a938d527ac826904c0e8dbe7310d6176Sunny Goyal if ((which & FLAG_SYSTEM) != 0) { 6527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler boolean wasDarkTheme = mIsDark; 666d55202c9bf4e7181cf5a34772a070d4941b6de0Mario Bertschler boolean didSupportDarkText = mSupportsDarkText; 6727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler update(colors); 686d55202c9bf4e7181cf5a34772a070d4941b6de0Mario Bertschler notifyChange(wasDarkTheme != mIsDark || didSupportDarkText != mSupportsDarkText); 6927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 7027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 7127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 7227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler private void update(WallpaperColorsCompat wallpaperColors) { 7327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler Pair<Integer, Integer> colors = mExtractionType.extractInto(wallpaperColors); 7427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler if (colors != null) { 7527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mMainColor = colors.first; 7627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mSecondaryColor = colors.second; 7727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } else { 7827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mMainColor = FALLBACK_COLOR; 7927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mSecondaryColor = FALLBACK_COLOR; 8027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 81636e081ab720d43a233ff50177392dde6076e9d0Mario Bertschler mSupportsDarkText = wallpaperColors != null 82636e081ab720d43a233ff50177392dde6076e9d0Mario Bertschler ? (wallpaperColors.getColorHints() 83636e081ab720d43a233ff50177392dde6076e9d0Mario Bertschler & WallpaperColorsCompat.HINT_SUPPORTS_DARK_TEXT) > 0 : false; 84e5f4939cba2e884c2ceec03886e84f7dba6c26abMario Bertschler mIsDark = wallpaperColors != null 85e5f4939cba2e884c2ceec03886e84f7dba6c26abMario Bertschler ? (wallpaperColors.getColorHints() 86e5f4939cba2e884c2ceec03886e84f7dba6c26abMario Bertschler & WallpaperColorsCompat.HINT_SUPPORTS_DARK_THEME) > 0 : false; 8727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 8827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 8927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public void setOnThemeChangeListener(OnThemeChangeListener onThemeChangeListener) { 9027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler this.mOnThemeChangeListener = onThemeChangeListener; 9127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 9227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 9327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public void addOnChangeListener(OnChangeListener listener) { 9427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mListeners.add(listener); 9527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 9627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 9727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public void removeOnChangeListener(OnChangeListener listener) { 9827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mListeners.remove(listener); 9927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 10027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 10127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public void notifyChange(boolean themeChanged) { 10227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler if (themeChanged) { 10327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler if (mOnThemeChangeListener != null) { 10427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler mOnThemeChangeListener.onThemeChanged(); 10527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 10627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } else { 10727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler for (OnChangeListener listener : mListeners) { 10827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler listener.onExtractedColorsChanged(this); 10927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 11027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 11127288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 11227288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 11327288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public interface OnChangeListener { 11427288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo); 11527288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 11627288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler 11727288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler public interface OnThemeChangeListener { 11827288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler void onThemeChanged(); 11927288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler } 12027288381a1e29203cd9b1354ac0b25705e55ac9aMario Bertschler} 121