Move OM calls to the background
Test: manual Test: atest ThemeOverlayApplierTest Bug: 181591270 Bug: 181617612 Change-Id: I42907260fb2287d58d9e9c22740fbb45e0c64f05
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.android.systemui.theme;
|
||||
|
||||
import android.annotation.AnyThread;
|
||||
import android.content.om.FabricatedOverlay;
|
||||
import android.content.om.OverlayIdentifier;
|
||||
import android.content.om.OverlayInfo;
|
||||
@@ -159,44 +160,48 @@ public class ThemeOverlayApplier implements Dumpable {
|
||||
FabricatedOverlay[] pendingCreation,
|
||||
int currentUser,
|
||||
Set<UserHandle> managedProfiles) {
|
||||
// Disable all overlays that have not been specified in the user setting.
|
||||
final Set<String> overlayCategoriesToDisable = new HashSet<>(THEME_CATEGORIES);
|
||||
final Set<String> targetPackagesToQuery = overlayCategoriesToDisable.stream()
|
||||
.map(category -> mCategoryToTargetPackage.get(category))
|
||||
.collect(Collectors.toSet());
|
||||
final List<OverlayInfo> overlays = new ArrayList<>();
|
||||
targetPackagesToQuery.forEach(targetPackage -> overlays.addAll(mOverlayManager
|
||||
.getOverlayInfosForTarget(targetPackage, UserHandle.SYSTEM)));
|
||||
final List<Pair<String, String>> overlaysToDisable = overlays.stream()
|
||||
.filter(o ->
|
||||
mTargetPackageToCategories.get(o.targetPackageName).contains(o.category))
|
||||
.filter(o -> overlayCategoriesToDisable.contains(o.category))
|
||||
.filter(o -> !categoryToPackage.containsValue(new OverlayIdentifier(o.packageName)))
|
||||
.filter(o -> o.isEnabled())
|
||||
.map(o -> new Pair<>(o.category, o.packageName))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
OverlayManagerTransaction.Builder transaction = getTransactionBuilder();
|
||||
if (pendingCreation != null) {
|
||||
for (FabricatedOverlay overlay : pendingCreation) {
|
||||
transaction.registerFabricatedOverlay(overlay);
|
||||
}
|
||||
}
|
||||
|
||||
for (Pair<String, String> packageToDisable : overlaysToDisable) {
|
||||
OverlayIdentifier overlayInfo = new OverlayIdentifier(packageToDisable.second);
|
||||
setEnabled(transaction, overlayInfo, packageToDisable.first, currentUser,
|
||||
managedProfiles, false);
|
||||
}
|
||||
|
||||
for (String category : THEME_CATEGORIES) {
|
||||
if (categoryToPackage.containsKey(category)) {
|
||||
OverlayIdentifier overlayInfo = categoryToPackage.get(category);
|
||||
setEnabled(transaction, overlayInfo, category, currentUser, managedProfiles, true);
|
||||
}
|
||||
}
|
||||
|
||||
mExecutor.execute(() -> {
|
||||
|
||||
// Disable all overlays that have not been specified in the user setting.
|
||||
final Set<String> overlayCategoriesToDisable = new HashSet<>(THEME_CATEGORIES);
|
||||
final Set<String> targetPackagesToQuery = overlayCategoriesToDisable.stream()
|
||||
.map(category -> mCategoryToTargetPackage.get(category))
|
||||
.collect(Collectors.toSet());
|
||||
final List<OverlayInfo> overlays = new ArrayList<>();
|
||||
targetPackagesToQuery.forEach(targetPackage -> overlays.addAll(mOverlayManager
|
||||
.getOverlayInfosForTarget(targetPackage, UserHandle.SYSTEM)));
|
||||
final List<Pair<String, String>> overlaysToDisable = overlays.stream()
|
||||
.filter(o ->
|
||||
mTargetPackageToCategories.get(o.targetPackageName).contains(
|
||||
o.category))
|
||||
.filter(o -> overlayCategoriesToDisable.contains(o.category))
|
||||
.filter(o -> !categoryToPackage.containsValue(
|
||||
new OverlayIdentifier(o.packageName)))
|
||||
.filter(o -> o.isEnabled())
|
||||
.map(o -> new Pair<>(o.category, o.packageName))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
OverlayManagerTransaction.Builder transaction = getTransactionBuilder();
|
||||
if (pendingCreation != null) {
|
||||
for (FabricatedOverlay overlay : pendingCreation) {
|
||||
transaction.registerFabricatedOverlay(overlay);
|
||||
}
|
||||
}
|
||||
|
||||
for (Pair<String, String> packageToDisable : overlaysToDisable) {
|
||||
OverlayIdentifier overlayInfo = new OverlayIdentifier(packageToDisable.second);
|
||||
setEnabled(transaction, overlayInfo, packageToDisable.first, currentUser,
|
||||
managedProfiles, false);
|
||||
}
|
||||
|
||||
for (String category : THEME_CATEGORIES) {
|
||||
if (categoryToPackage.containsKey(category)) {
|
||||
OverlayIdentifier overlayInfo = categoryToPackage.get(category);
|
||||
setEnabled(transaction, overlayInfo, category, currentUser, managedProfiles,
|
||||
true);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
mOverlayManager.commit(transaction.build());
|
||||
} catch (SecurityException | IllegalStateException e) {
|
||||
@@ -210,6 +215,7 @@ public class ThemeOverlayApplier implements Dumpable {
|
||||
return new OverlayManagerTransaction.Builder();
|
||||
}
|
||||
|
||||
@AnyThread
|
||||
private void setEnabled(OverlayManagerTransaction.Builder transaction,
|
||||
OverlayIdentifier identifier, String category, int currentUser,
|
||||
Set<UserHandle> managedProfiles, boolean enabled) {
|
||||
|
||||
Reference in New Issue
Block a user