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