Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7100e940 authored by Clark Scheff's avatar Clark Scheff Committed by Gerrit Code Review
Browse files

Themes: Support applying components from multiple themes [1/3]

The current implementation assumes the components being passed
into the ThemeService belong to the same theme.  This patch uses
a Map instead of a List to pass in a mapping of components to
package names, allowing us to apply several components from
different themes.

Requesting a theme change now takes a Map<String, String> which
maps components to the theme package name they will be applied
from.
Example:
    Map<String, String> componentMap = new HashMap<String,String>();
    componentMap.add(ThemesColumns.MODIFIES_ICONS, "com.mytheme.blue");
    componentMap.add(ThemesColumns.MODIFIES_OVERLAYS, "com.mytheme.red");

    ThemeManager tm = (ThemeManager) contex.getSystemService(Context.THEME_SERVICE);
    tm.requestThemeChange(componentMap);

Change-Id: I13fa17eabecb824884fe522d5dc1822a4d7c55f4
parent afd19451
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -17,6 +17,6 @@ package android.content.res;

/** {@hide} */
oneway interface IThemeChangeListener {
    void onProgress(int progress, String pkgName);
    void onFinish(boolean isSuccess, String pkgName);
    void onProgress(int progress);
    void onFinish(boolean isSuccess);
}
+4 −4
Original line number Diff line number Diff line
@@ -18,17 +18,17 @@ package android.content.res;
import android.content.res.IThemeChangeListener;
import android.graphics.Bitmap;

import java.util.List;
import java.util.Map;

/** {@hide} */
interface IThemeService {
    void requestThemeChangeUpdates(in IThemeChangeListener listener);
    void removeUpdates(in IThemeChangeListener listener);

    void requestThemeChange(String pkgName, in List<String> components);
    void requestThemeChange(in Map componentMap);
    void applyDefaultTheme();
    boolean isThemeApplying(String pkgName);
    int getProgress(String pkgName);
    boolean isThemeApplying();
    int getProgress();

    boolean cacheComposedIcon(in Bitmap icon, String path);
}
+47 −42
Original line number Diff line number Diff line
@@ -23,7 +23,10 @@ import android.os.RemoteException;
import android.util.Log;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * {@hide}
@@ -34,8 +37,8 @@ public class ThemeManager {
    private IThemeService mService;
    private Handler mHandler;

    private HashMap<String, ThemeChangeListener> mListeners =
            new HashMap<String, ThemeChangeListener>();
    private Set<ThemeChangeListener> mListeners =
            new HashSet<ThemeChangeListener>();

    public ThemeManager(Context context, IThemeService service) {
        mContext = context;
@@ -45,42 +48,40 @@ public class ThemeManager {

    private final IThemeChangeListener mThemeChangeListener = new IThemeChangeListener.Stub() {
        @Override
        public void onProgress(final int progress, final String pkgName) throws RemoteException {
            final ThemeChangeListener listener = mListeners.get(pkgName);
            if (listener != null) {
        public void onProgress(final int progress) throws RemoteException {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    for (ThemeChangeListener listener : mListeners) {
                        try {
                            listener.onProgress(progress);
                        } catch (Throwable e) {
                            Log.w(TAG, "Unable to update progress for " + pkgName, e);
                            Log.w(TAG, "Unable to update theme change progress", e);
                        }
                    }
                });
                }
            });
        }

        @Override
        public void onFinish(final boolean isSuccess, final String pkgName) throws RemoteException {
            final ThemeChangeListener listener = mListeners.get(pkgName);
            if (listener != null) {
        public void onFinish(final boolean isSuccess) throws RemoteException {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    for (ThemeChangeListener listener : mListeners) {
                        try {
                            listener.onFinish(isSuccess);
                        } catch (Throwable e) {
                            Log.w(TAG, "Unable to update listener for " + pkgName, e);
                            Log.w(TAG, "Unable to update theme change listener", e);
                        }
                    }
                });
                }
            });
        }
    };

    public void addClient(String pkgName, ThemeChangeListener listener) {
        if (mListeners.containsKey(pkgName)) {
    public void addClient(ThemeChangeListener listener) {
        if (mListeners.contains(listener)) {
            throw new IllegalArgumentException("Client was already added ");
        }
        if (mListeners.size() == 0) {
@@ -90,11 +91,11 @@ public class ThemeManager {
                Log.w(TAG, "Unable to register listener", e);
            }
        }
        mListeners.put(pkgName, listener);
        mListeners.add(listener);
    }

    public void removeClient(String pkgName) {
        mListeners.remove(pkgName);
    public void removeClient(ThemeChangeListener listener) {
        mListeners.remove(listener);
        if (mListeners.size() == 0) {
            try {
                mService.removeUpdates(mThemeChangeListener);
@@ -104,33 +105,37 @@ public class ThemeManager {
        }
    }

    public void onClientPaused(String pkgName) {
        removeClient(pkgName);
    public void onClientPaused(ThemeChangeListener listener) {
        removeClient(listener);
    }

    public void onClientResumed(String pkgName, ThemeChangeListener listener) {
        addClient(pkgName, listener);
    public void onClientResumed(ThemeChangeListener listener) {
        addClient(listener);
    }

    public void onClientDestroyed(String pkgName) {
        removeClient(pkgName);
    public void onClientDestroyed(ThemeChangeListener listener) {
        removeClient(listener);
    }

    /**
     * Convenience method. Applies the entire theme.
     */
    public void requestThemeChange(String pkgName) {
        try {
        List<String> components = ThemeUtils.getSupportedComponents(mContext, pkgName);
            mService.requestThemeChange(pkgName, components);
        } catch (RemoteException e) {
            Log.w(TAG, "Unable to access ThemeService", e);
        }
        requestThemeChange(pkgName, components);
    }

    public void requestThemeChange(String pkgName, List<String> components) {
        Map<String, String> componentMap = new HashMap<String, String>(components.size());
        for (String component : components) {
            componentMap.put(component, pkgName);
        }
        requestThemeChange(componentMap);
    }

    public void requestThemeChange(Map<String, String> componentMap) {
        try {
            mService.requestThemeChange(pkgName, components);
            mService.requestThemeChange(componentMap);
        } catch (RemoteException e) {
            Log.w(TAG, "Unable to access ThemeService", e);
        }
@@ -144,9 +149,9 @@ public class ThemeManager {
        }
    }

    public boolean isThemeApplying(String pkgName) {
    public boolean isThemeApplying() {
        try {
            return mService.isThemeApplying(pkgName);
            return mService.isThemeApplying();
        } catch (RemoteException e) {
            Log.w(TAG, "Unable to access ThemeService", e);
        }
@@ -154,9 +159,9 @@ public class ThemeManager {
        return false;
    }

    public int getProgress(String pkgName) {
    public int getProgress() {
        try {
            return mService.getProgress(pkgName);
            return mService.getProgress();
        } catch (RemoteException e) {
            Log.w(TAG, "Unable to access ThemeService", e);
        }
+154 −140

File changed.

Preview size limit exceeded, changes collapsed.