cmsdk: Mandate themes feature xml's for service implementation.

The feature xml plays two roles:

      1) To allow sdk interface (constructor) to throw when system
      service is unavailable. This allows for clearer platform
      development debugging.

      2) To allow for simpler disambiguation of what services to
      instrument in a modular environment.

Change-Id: I67b16a0725ed89d5ddbc973b09337d6227087e4d
TICKET: CYNGNOS-2295
This commit is contained in:
Adnan Begovic 2016-03-24 17:55:10 -07:00
parent c406211045
commit ccdb292eec
6 changed files with 35 additions and 8 deletions

View File

@ -1073,7 +1073,7 @@ package cyanogenmod.themes {
public class ThemeManager {
method public deprecated void addClient(cyanogenmod.themes.ThemeManager.ThemeChangeListener);
method public void applyDefaultTheme();
method public static cyanogenmod.themes.ThemeManager getInstance();
method public static cyanogenmod.themes.ThemeManager getInstance(android.content.Context);
method public cyanogenmod.themes.ThemeChangeRequest.RequestType getLastThemeChangeRequestType();
method public long getLastThemeChangeTime();
method public int getProgress();

View File

@ -42,15 +42,22 @@ public class IconCacheManagerService extends SystemService {
private static final long PURGED_ICON_CACHE_SIZE = 25165824L; // 24 MB
private long mIconCacheSize = 0L;
private Context mContext;
public IconCacheManagerService(Context context) {
super(context);
mContext = context;
}
@Override
public void onStart() {
Log.d(TAG, "registerIconCache cmiconcache: " + this);
if (mContext.getPackageManager().hasSystemFeature(CMContextConstants.Features.THEMES)) {
publishBinderService(CMContextConstants.CM_ICON_CACHE_SERVICE, mService);
} else {
Log.wtf(TAG, "IconCache service started by system server but feature xml not" +
" declared. Not publishing binder service!");
}
}
private void purgeIconCache() {

View File

@ -236,7 +236,12 @@ public class ThemeManagerService extends SystemService {
@Override
public void onStart() {
if (mContext.getPackageManager().hasSystemFeature(CMContextConstants.Features.THEMES)) {
publishBinderService(CMContextConstants.CM_THEME_SERVICE, mService);
} else {
Log.wtf(TAG, "Theme service started by system server but feature xml not" +
" declared. Not publishing binder service!");
}
// listen for wallpaper changes
IntentFilter filter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
mContext.registerReceiver(mWallpaperChangeReceiver, filter);

View File

@ -157,5 +157,13 @@ public final class CMContextConstants {
*/
@SdkConstant(SdkConstant.SdkConstantType.FEATURE)
public static final String TELEPHONY = "org.cyanogenmod.telephony";
/**
* Feature for {@link PackageManager#getSystemAvailableFeatures} and
* {@link PackageManager#hasSystemFeature}: The device includes the cm theme service
* utilized by the cmsdk.
*/
@SdkConstant(SdkConstant.SdkConstantType.FEATURE)
public static final String THEMES = "org.cyanogenmod.theme";
}
}

View File

@ -16,6 +16,7 @@
package cyanogenmod.themes;
import android.content.Context;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@ -47,14 +48,20 @@ public class ThemeManager {
private Set<ThemeProcessingListener> mProcessingListeners = new ArraySet<>();
private ThemeManager() {
mHandler = new Handler(Looper.getMainLooper());
private ThemeManager(Context context) {
sService = getService();
if (context.getPackageManager().hasSystemFeature(
CMContextConstants.Features.THEMES) && sService == null) {
throw new RuntimeException("Unable to get ThemeManagerService. The service either" +
" crashed, was not started, or the interface has been called to early in" +
" SystemServer init");
}
mHandler = new Handler(Looper.getMainLooper());
}
public static ThemeManager getInstance() {
public static ThemeManager getInstance(Context context) {
if (sInstance == null) {
sInstance = new ThemeManager();
sInstance = new ThemeManager(context);
}
return sInstance;

View File

@ -1073,7 +1073,7 @@ package cyanogenmod.themes {
public class ThemeManager {
method public deprecated void addClient(cyanogenmod.themes.ThemeManager.ThemeChangeListener);
method public void applyDefaultTheme();
method public static cyanogenmod.themes.ThemeManager getInstance();
method public static cyanogenmod.themes.ThemeManager getInstance(android.content.Context);
method public cyanogenmod.themes.ThemeChangeRequest.RequestType getLastThemeChangeRequestType();
method public long getLastThemeChangeTime();
method public int getProgress();