Introduce Theme Versioning [2/2]

See also frameworks/base

Change-Id: I17fd6bfa39ce04fcfb344d14a6af1a6a09ed3f2f
This commit is contained in:
Andy Mast 2015-05-28 14:52:45 -07:00
parent cbc19f5cf2
commit 25410f2426
2 changed files with 241 additions and 0 deletions

View File

@ -0,0 +1,38 @@
/*
* Copyright (C) 2015 The CyanogenMod Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cyanogenmod.app;
/**
* The id value here matches the framework. Unknown is given a -1 value since future
* framework components will always be positive.
* @hide
*/
public enum ThemeComponent {
UNKNOWN(-1),
OVERLAY(0),
BOOT_ANIM(1),
WALLPAPER(2),
LOCKSCREEN(3),
FONT(4),
ICON(5),
SOUND(6);
public int id;
ThemeComponent(int id) {
this.id = id;
}
}

View File

@ -0,0 +1,203 @@
/*
* Copyright (C) 2015 The CyanogenMod Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cyanogenmod.app;
import android.os.Build;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class ThemeVersion {
private static final String THEME_VERSION_CLASS_NAME = "android.content.ThemeVersion";
private static final String THEME_VERSION_FIELD_NAME = "THEME_VERSION";
private static final String MIN_SUPPORTED_THEME_VERSION_FIELD_NAME =
"MIN_SUPPORTED_THEME_VERSION";
private static final int CM11 = 1;
private static final int CM12_PRE_VERSIONING = 2;
public static int getVersion() {
int version;
try {
Class<?> themeVersionClass = Class.forName(THEME_VERSION_CLASS_NAME);
Field themeVersionField = themeVersionClass.getField(THEME_VERSION_FIELD_NAME);
version = (Integer) themeVersionField.get(null);
} catch(Exception e) {
// Field doesn't exist. Fallback to SDK level
version = Build.VERSION.SDK_INT < 21 ? CM11 :
CM12_PRE_VERSIONING;
}
return version;
}
public static int getMinSupportedVersion() {
int getMinSupportedVersion;
try {
Class<?> themeVersionClass = Class.forName(THEME_VERSION_CLASS_NAME);
Field themeVersionField =
themeVersionClass.getField(MIN_SUPPORTED_THEME_VERSION_FIELD_NAME);
getMinSupportedVersion = (Integer) themeVersionField.get(null);
} catch(Exception e) {
// Field doesn't exist. Fallback to SDK level
getMinSupportedVersion = Build.VERSION.SDK_INT < 21 ? CM11 :
CM12_PRE_VERSIONING;
}
return getMinSupportedVersion;
}
public static ComponentVersion getComponentVersion(ThemeComponent component) {
int version = getVersion();
if (version == 1) {
throw new UnsupportedOperationException();
} else if (version == 2) {
return ThemeVersionImpl2.getDeviceComponentVersion(component);
} else {
return ThemeVersionImpl3.getDeviceComponentVersion(component);
}
}
public static List<ComponentVersion> getComponentVersions() {
int version = getVersion();
if (version == 1) {
throw new UnsupportedOperationException();
} else if (version == 2) {
return ThemeVersionImpl2.getDeviceComponentVersions();
} else {
return ThemeVersionImpl3.getDeviceComponentVersions();
}
}
public static class ComponentVersion {
protected int id;
protected String name;
protected ThemeComponent component;
protected int minVersion;
protected int currentVersion;
protected ComponentVersion(int id, ThemeComponent component, int targetVersion) {
this(id, component, component.name(), targetVersion, targetVersion);
}
protected ComponentVersion(int id,
ThemeComponent component,
String name,
int minVersion,
int targetVersion) {
this.id = id;
this.component = component;
this.name = name;
this.minVersion = minVersion;
this.currentVersion = targetVersion;
}
public ComponentVersion(ComponentVersion copy) {
this(copy.id, copy.component, copy.name, copy.minVersion, copy.currentVersion);
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public ThemeComponent getComponent() {
return component;
}
public int getMinVersion() {
return minVersion;
}
public int getCurrentVersion() {
return currentVersion;
}
}
private static class ThemeVersionImpl2 {
private static ArrayList<ComponentVersion> cVersions = new ArrayList<ComponentVersion>() {
{
add(new ComponentVersion(0, ThemeComponent.OVERLAY, 2));
add(new ComponentVersion(1, ThemeComponent.BOOT_ANIM, 1));
add(new ComponentVersion(2, ThemeComponent.WALLPAPER, 1));
add(new ComponentVersion(3, ThemeComponent.LOCKSCREEN, 1));
add(new ComponentVersion(4, ThemeComponent.ICON, 1));
add(new ComponentVersion(5, ThemeComponent.FONT, 1));
add(new ComponentVersion(6, ThemeComponent.SOUND, 1));
}
};
public static ComponentVersion getDeviceComponentVersion(ThemeComponent component) {
for(ComponentVersion compVersion : cVersions) {
if (compVersion.component.equals(component)) {
return new ComponentVersion(compVersion);
}
}
return null;
}
public static List<ComponentVersion> getDeviceComponentVersions() {
ArrayList<ComponentVersion> versions = new ArrayList<ComponentVersion>();
versions.addAll(cVersions);
return versions;
}
}
private static class ThemeVersionImpl3 {
public static ComponentVersion getDeviceComponentVersion(ThemeComponent component) {
for(android.content.ThemeVersion.ComponentVersion version :
android.content.ThemeVersion.ComponentVersion.values()) {
ComponentVersion sdkVersionInfo = fwCompVersionToSdkVersion(version);
if (sdkVersionInfo.component.equals(component)) {
return sdkVersionInfo;
}
}
return null;
}
public static List<ComponentVersion> getDeviceComponentVersions() {
List<ComponentVersion> versions = new ArrayList<ComponentVersion>();
for(android.content.ThemeVersion.ComponentVersion version :
android.content.ThemeVersion.ComponentVersion.values()) {
versions.add(fwCompVersionToSdkVersion(version));
}
return versions;
}
public static ComponentVersion fwCompVersionToSdkVersion(
android.content.ThemeVersion.ComponentVersion version) {
// Find the SDK component with the matching id
// If no ID matches then the FW must have a newer component that we don't
// know anything about. We can still return the id and name
ThemeComponent component = ThemeComponent.UNKNOWN;
for(ThemeComponent aComponent : ThemeComponent.values()) {
if (aComponent.id == version.id) {
component = aComponent;
}
}
int id = version.id;
String name = version.name();
int minVersion = version.minSupportedVersion;
int targetVersion = version.currentVersion;
return new ComponentVersion(id, component, name, minVersion, targetVersion);
}
}
}