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

Commit c1be09f1 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "OMS: Make updates to category not reset the overlay's state"

parents 4ebf6287 7b03181a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ LOCAL_CERTIFICATE := platform
LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_v1
LOCAL_AAPT_FLAGS += --version-code 1 --version-name v1
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/v1/res
LOCAL_MANIFEST_FILE := app/AndroidManifest.xml
LOCAL_MANIFEST_FILE := app/v1/AndroidManifest.xml
include $(BUILD_PACKAGE)

include $(CLEAR_VARS)
@@ -67,7 +67,7 @@ LOCAL_CERTIFICATE := platform
LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_v2
LOCAL_AAPT_FLAGS += --version-code 2 --version-name v2
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/v2/res
LOCAL_MANIFEST_FILE := app/AndroidManifest.xml
LOCAL_MANIFEST_FILE := app/v2/AndroidManifest.xml
include $(BUILD_PACKAGE)

my_package_prefix :=
+21 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 The Android Open Source 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.
-->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.server.om.hosttest.app_overlay">
    <overlay android:targetPackage="com.android.server.om.hosttest.update_overlay_test"
        android:category="android.theme" />
</manifest>
+5 −3
Original line number Diff line number Diff line
@@ -64,6 +64,8 @@ import com.android.server.SystemService;
import com.android.server.pm.Installer;
import com.android.server.pm.UserManagerService;

import libcore.util.EmptyArray;

import org.xmlpull.v1.XmlPullParserException;

import java.io.File;
@@ -303,10 +305,10 @@ public final class OverlayManagerService extends SystemService {
        schedulePersistSettings();
    }

    private static Set<String> getDefaultOverlayPackages() {
    private static String[] getDefaultOverlayPackages() {
        final String str = SystemProperties.get(DEFAULT_OVERLAYS_PROP);
        if (TextUtils.isEmpty(str)) {
            return Collections.emptySet();
            return EmptyArray.STRING;
        }

        final ArraySet<String> defaultPackages = new ArraySet<>();
@@ -315,7 +317,7 @@ public final class OverlayManagerService extends SystemService {
                defaultPackages.add(packageName);
            }
        }
        return defaultPackages;
        return defaultPackages.toArray(new String[defaultPackages.size()]);
    }

    private final class PackageReceiver extends BroadcastReceiver {
+55 −18
Original line number Diff line number Diff line
@@ -60,13 +60,13 @@ final class OverlayManagerServiceImpl {
    private final PackageManagerHelper mPackageManager;
    private final IdmapManager mIdmapManager;
    private final OverlayManagerSettings mSettings;
    private final Set<String> mDefaultOverlays;
    private final String[] mDefaultOverlays;
    private final OverlayChangeListener mListener;

    OverlayManagerServiceImpl(@NonNull final PackageManagerHelper packageManager,
            @NonNull final IdmapManager idmapManager,
            @NonNull final OverlayManagerSettings settings,
            @NonNull final Set<String> defaultOverlays,
            @NonNull final String[] defaultOverlays,
            @NonNull final OverlayChangeListener listener) {
        mPackageManager = packageManager;
        mIdmapManager = idmapManager;
@@ -104,31 +104,27 @@ final class OverlayManagerServiceImpl {
        for (int i = 0; i < overlayPackagesSize; i++) {
            final PackageInfo overlayPackage = overlayPackages.get(i);
            final OverlayInfo oi = storedOverlayInfos.get(overlayPackage.packageName);
            if (oi == null || !oi.targetPackageName.equals(overlayPackage.overlayTarget)
                    || !Objects.equals(oi.category, overlayPackage.overlayCategory)) {
                // Update the overlay if it didn't exist or had the wrong target package.
            if (oi == null || !oi.targetPackageName.equals(overlayPackage.overlayTarget)) {
                // Reset the overlay if it didn't exist or had the wrong target package.
                mSettings.init(overlayPackage.packageName, newUserId,
                        overlayPackage.overlayTarget,
                        overlayPackage.applicationInfo.getBaseCodePath(),
                        overlayPackage.isStaticOverlayPackage(), overlayPackage.overlayPriority,
                        overlayPackage.isStaticOverlayPackage(),
                        overlayPackage.overlayPriority,
                        overlayPackage.overlayCategory);

                if (oi == null) {
                    // This overlay does not exist in our settings.
                    if (overlayPackage.isStaticOverlayPackage() ||
                            mDefaultOverlays.contains(overlayPackage.packageName)) {
                        // Enable this overlay by default.
                        if (DEBUG) {
                            Slog.d(TAG, "Enabling overlay " + overlayPackage.packageName
                                    + " for user " + newUserId + " by default");
                        }
                        mSettings.setEnabled(overlayPackage.packageName, newUserId, true);
                    }
                } else {
                if (oi != null) {
                    // The targetPackageName we have stored doesn't match the overlay's target.
                    // Queue the old target for an update as well.
                    packagesToUpdateAssets.add(oi.targetPackageName);
                }
            } else {
                // Update all other components of an overlay that don't require a hard reset.
                if (!Objects.equals(oi.category, overlayPackage.overlayCategory)) {
                    // When changing categories, it is ok just to update our internal state.
                    mSettings.setCategory(overlayPackage.packageName, newUserId,
                            overlayPackage.overlayCategory);
                }
            }

            try {
@@ -160,6 +156,42 @@ final class OverlayManagerServiceImpl {
                iter.remove();
            }
        }

        // Collect all of the categories in which we have at least one overlay enabled.
        final ArraySet<String> enabledCategories = new ArraySet<>();
        final ArrayMap<String, List<OverlayInfo>> userOverlays =
                mSettings.getOverlaysForUser(newUserId);
        final int userOverlayTargetCount = userOverlays.size();
        for (int i = 0; i < userOverlayTargetCount; i++) {
            final List<OverlayInfo> overlayList = userOverlays.valueAt(i);
            final int overlayCount = overlayList != null ? overlayList.size() : 0;
            for (int j = 0; j < overlayCount; j++) {
                final OverlayInfo oi = overlayList.get(j);
                if (oi.isEnabled()) {
                    enabledCategories.add(oi.category);
                }
            }
        }

        // Enable the default overlay if its category does not have a single overlay enabled.
        for (final String defaultOverlay : mDefaultOverlays) {
            try {
                final OverlayInfo oi = mSettings.getOverlayInfo(defaultOverlay, newUserId);
                if (!enabledCategories.contains(oi.category)) {
                    Slog.w(TAG, "Enabling default overlay '" + defaultOverlay + "' for target '"
                            + oi.targetPackageName + "' in category '" + oi.category + "' for user "
                            + newUserId);
                    mSettings.setEnabled(oi.packageName, newUserId, true);
                    if (updateState(oi.targetPackageName, oi.packageName, newUserId, 0)) {
                        packagesToUpdateAssets.add(oi.targetPackageName);
                    }
                }
            } catch (OverlayManagerSettings.BadKeyException e) {
                Slog.e(TAG, "Failed to set default overlay '" + defaultOverlay + "' for user "
                        + newUserId, e);
            }
        }

        return new ArrayList<>(packagesToUpdateAssets);
    }

@@ -325,6 +357,11 @@ final class OverlayManagerServiceImpl {
                mSettings.init(packageName, userId, pkg.overlayTarget,
                        pkg.applicationInfo.getBaseCodePath(), pkg.isStaticOverlayPackage(),
                        pkg.overlayPriority, pkg.overlayCategory);
            } else {
                if (!Objects.equals(oldOi.category, pkg.overlayCategory)) {
                    // Update the category in-place.
                    mSettings.setCategory(packageName, userId, pkg.overlayCategory);
                }
            }

            if (updateState(pkg.overlayTarget, packageName, userId, 0)) {
Loading