Skip to content

Commit

Permalink
base: add more option on ThemesUtils
Browse files Browse the repository at this point in the history
  • Loading branch information
darknius09 committed May 27, 2023
1 parent 390f116 commit 72a4028
Showing 1 changed file with 214 additions and 1 deletion.
215 changes: 214 additions & 1 deletion core/java/com/android/internal/util/custom/ThemesUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,54 @@

import static android.os.UserHandle.USER_SYSTEM;

import android.app.UiModeManager;
import android.util.PathParser;

import android.content.ContentResolver;
import android.content.Context;
import android.content.om.IOverlayManager;
import android.content.om.OverlayInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ProviderInfo;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Typeface;
import android.graphics.Path;
import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.PathShape;
import android.net.Uri;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class ThemesUtils {

public static final String TAG = "ThemesUtils";

public static final String FONT_KEY = "android.theme.customization.font";
public static final String ICON_SHAPE_KEY= "android.theme.customization.adaptive_icon_shape";

public static final Comparator<OverlayInfo> OVERLAY_INFO_COMPARATOR =
Comparator.comparingInt(a -> a.priority);

private Context mContext;
private IOverlayManager mOverlayManager;
private PackageManager pm;
private Resources overlayRes;

// QS Tile Styles
public static final String[] QS_TILE_THEMES = {
"com.android.systemui.qstile.default", // 0
Expand Down Expand Up @@ -80,4 +115,182 @@ public static void stockNewTileStyle(IOverlayManager om, int userId) {
}
}
}

public ThemesUtils(Context context) {
mContext = context;
mOverlayManager = IOverlayManager.Stub
.asInterface(ServiceManager.getService(Context.OVERLAY_SERVICE));
pm = context.getPackageManager();
}

public void setOverlayEnabled(String category, String packageName) {
final String currentPackageName = getOverlayInfos(category).stream()
.filter(info -> info.isEnabled())
.map(info -> info.packageName)
.findFirst()
.orElse(null);

try {
if ("android".equals(packageName)) {
mOverlayManager.setEnabled(currentPackageName, false, USER_SYSTEM);
} else {
mOverlayManager.setEnabledExclusiveInCategory(packageName,
USER_SYSTEM);
}

writeSettings(category, packageName, "android".equals(packageName));

} catch (RemoteException e) {
}
}

public void writeSettings(String category, String packageName, boolean disable) {
final String overlayPackageJson = Settings.Secure.getStringForUser(
mContext.getContentResolver(),
Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES, USER_SYSTEM);
JSONObject object;
try {
if (overlayPackageJson == null) {
object = new JSONObject();
} else {
object = new JSONObject(overlayPackageJson);
}
if (disable) {
if (object.has(category)) object.remove(category);
} else {
object.put(category, packageName);
}
Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES,
object.toString(), USER_SYSTEM);
} catch (JSONException e) {
Log.e(TAG, "Failed to parse THEME_CUSTOMIZATION_OVERLAY_PACKAGES.", e);
}
}

public List<String> getOverlayPackagesForCategory(String category) {
return getOverlayPackagesForCategory(category, "android");
}

public List<String> getOverlayPackagesForCategory(String category, String target) {
List<String> overlays = new ArrayList<>();
overlays.add("android");
for (OverlayInfo info : getOverlayInfos(category, target)) {
if (category.equals(info.getCategory())) {
overlays.add(info.getPackageName());
}
}
return overlays;
}

public List<OverlayInfo> getOverlayInfos(String category) {
return getOverlayInfos(category, "android");
}

public List<OverlayInfo> getOverlayInfos(String category, String target) {
final List<OverlayInfo> filteredInfos = new ArrayList<>();
try {
List<OverlayInfo> overlayInfos = mOverlayManager
.getOverlayInfosForTarget(target, USER_SYSTEM);
for (OverlayInfo overlayInfo : overlayInfos) {
if (category.equals(overlayInfo.category)) {
filteredInfos.add(overlayInfo);
}
}
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
filteredInfos.sort(OVERLAY_INFO_COMPARATOR);
return filteredInfos;
}

public List<String> getLabels(String category) {
List<String> labels = new ArrayList<>();
labels.add("Default");
for (OverlayInfo info : getOverlayInfos(category)) {
if (category.equals(info.getCategory())) {
try {
labels.add(pm.getApplicationInfo(info.packageName, 0)
.loadLabel(pm).toString());
} catch (PackageManager.NameNotFoundException e) {
labels.add(info.packageName);
}
}
}
return labels;
}

public List<Typeface> getFonts() {
final List<Typeface> fontlist = new ArrayList<>();
for (String overlayPackage : getOverlayPackagesForCategory(FONT_KEY)) {
try {
overlayRes = overlayPackage.equals("android") ? Resources.getSystem()
: pm.getResourcesForApplication(overlayPackage);
final String font = overlayRes.getString(
overlayRes.getIdentifier("config_bodyFontFamily",
"string", overlayPackage));
fontlist.add(Typeface.create(font, Typeface.NORMAL));
} catch (NameNotFoundException | NotFoundException e) {
// Do nothing
}
}
return fontlist;
}

public List<ShapeDrawable> getShapeDrawables() {
final List<ShapeDrawable> shapelist = new ArrayList<>();
for (String overlayPackage : getOverlayPackagesForCategory(ICON_SHAPE_KEY)) {
shapelist.add(createShapeDrawable(overlayPackage));
}
return shapelist;
}

public ShapeDrawable createShapeDrawable(String overlayPackage) {
try {
if (overlayPackage.equals("android")) {
overlayRes = Resources.getSystem();
} else {
if (overlayPackage.equals("default")) overlayPackage = "android";
overlayRes = pm.getResourcesForApplication(overlayPackage);
}
} catch (NameNotFoundException | NotFoundException e) {
// Do nothing
}
final String shape = overlayRes.getString(
overlayRes.getIdentifier("config_icon_mask",
"string", overlayPackage));
Path path = TextUtils.isEmpty(shape) ? null : PathParser.createPathFromPathData(shape);
PathShape pathShape = new PathShape(path, 100f, 100f);
ShapeDrawable shapeDrawable = new ShapeDrawable(pathShape);
int mThumbSize = (int) (mContext.getResources().getDisplayMetrics().density * 72);
shapeDrawable.setIntrinsicHeight(mThumbSize);
shapeDrawable.setIntrinsicWidth(mThumbSize);
return shapeDrawable;
}

public boolean isOverlayEnabled(String overlayPackage) {
try {
OverlayInfo info = mOverlayManager.getOverlayInfo(overlayPackage, USER_SYSTEM);
return info == null ? false : info.isEnabled();
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}

public boolean isDefaultOverlay(String category) {
for (String overlayPackage : getOverlayPackagesForCategory(category)) {
try {
OverlayInfo info = mOverlayManager.getOverlayInfo(overlayPackage, USER_SYSTEM);
if (info != null && info.isEnabled()) {
return false;
} else {
continue;
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
return true;
}
}

0 comments on commit 72a4028

Please sign in to comment.