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

Commit db99997d authored by Ryan Mitchell's avatar Ryan Mitchell Committed by Automerger Merge Worker
Browse files

Merge changes from topic "revert-1507500-oms-transactional-api-UQLIXJBEPB" am:...

Merge changes from topic "revert-1507500-oms-transactional-api-UQLIXJBEPB" am: 2c2853d0 am: 547beff3 am: 0c32deef

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1548921

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I86fe58cbbd953d3553f5c6c74ee1207f6499733f
parents a152a925 0c32deef
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
{
  "presubmit": [
    {
      "name" : "OverlayDeviceTests"
    }
  ]
}
+73 −137
Original line number Diff line number Diff line
@@ -29,8 +29,6 @@ import static android.os.Trace.TRACE_TAG_RRO;
import static android.os.Trace.traceBegin;
import static android.os.Trace.traceEnd;

import static com.android.server.om.OverlayManagerServiceImpl.OperationFailedException;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
@@ -51,7 +49,6 @@ import android.content.res.ApkAssets;
import android.net.Uri;
import android.os.Binder;
import android.os.Environment;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
@@ -68,6 +65,7 @@ import android.util.SparseArray;

import com.android.internal.content.om.OverlayConfig;
import com.android.server.FgThread;
import com.android.server.IoThread;
import com.android.server.LocalServices;
import com.android.server.SystemConfig;
import com.android.server.SystemService;
@@ -91,7 +89,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * Service to manage asset overlays.
@@ -240,9 +238,7 @@ public final class OverlayManagerService extends SystemService {

    private final OverlayActorEnforcer mActorEnforcer;

    private final Consumer<PackageAndUser> mOnOverlaysChanged = (pair) -> {
        onOverlaysChanged(pair.packageName, pair.userId);
    };
    private final AtomicBoolean mPersistSettingsScheduled = new AtomicBoolean(false);

    public OverlayManagerService(@NonNull final Context context) {
        super(context);
@@ -255,19 +251,17 @@ public final class OverlayManagerService extends SystemService {
            IdmapManager im = new IdmapManager(IdmapDaemon.getInstance(), mPackageManager);
            mSettings = new OverlayManagerSettings();
            mImpl = new OverlayManagerServiceImpl(mPackageManager, im, mSettings,
                    OverlayConfig.getSystemInstance(), getDefaultOverlayPackages());
                    OverlayConfig.getSystemInstance(), getDefaultOverlayPackages(),
                    new OverlayChangeListener());
            mActorEnforcer = new OverlayActorEnforcer(mPackageManager);

            HandlerThread packageReceiverThread = new HandlerThread(TAG);
            packageReceiverThread.start();

            final IntentFilter packageFilter = new IntentFilter();
            packageFilter.addAction(ACTION_PACKAGE_ADDED);
            packageFilter.addAction(ACTION_PACKAGE_CHANGED);
            packageFilter.addAction(ACTION_PACKAGE_REMOVED);
            packageFilter.addDataScheme("package");
            getContext().registerReceiverAsUser(new PackageReceiver(), UserHandle.ALL,
                    packageFilter, null, packageReceiverThread.getThreadHandler());
                    packageFilter, null, null);

            final IntentFilter userFilter = new IntentFilter();
            userFilter.addAction(ACTION_USER_ADDED);
@@ -324,7 +318,7 @@ public final class OverlayManagerService extends SystemService {
                final List<String> targets = mImpl.updateOverlaysForUser(newUserId);
                updateAssets(newUserId, targets);
            }
            persistSettings();
            schedulePersistSettings();
        } finally {
            traceEnd(TRACE_TAG_RRO);
        }
@@ -408,17 +402,10 @@ public final class OverlayManagerService extends SystemService {
                                false);
                        if (pi != null && !pi.applicationInfo.isInstantApp()) {
                            mPackageManager.cachePackageInfo(packageName, userId, pi);

                            try {
                            if (pi.isOverlayPackage()) {
                                    mImpl.onOverlayPackageAdded(packageName, userId)
                                        .ifPresent(mOnOverlaysChanged);
                                mImpl.onOverlayPackageAdded(packageName, userId);
                            } else {
                                    mImpl.onTargetPackageAdded(packageName, userId)
                                        .ifPresent(mOnOverlaysChanged);
                                }
                            } catch (OperationFailedException e) {
                                Slog.e(TAG, "onPackageAdded internal error", e);
                                mImpl.onTargetPackageAdded(packageName, userId);
                            }
                        }
                    }
@@ -438,17 +425,10 @@ public final class OverlayManagerService extends SystemService {
                                false);
                        if (pi != null && pi.applicationInfo.isInstantApp()) {
                            mPackageManager.cachePackageInfo(packageName, userId, pi);

                            try {
                            if (pi.isOverlayPackage()) {
                                    mImpl.onOverlayPackageChanged(packageName, userId)
                                        .ifPresent(mOnOverlaysChanged);
                                mImpl.onOverlayPackageChanged(packageName, userId);
                            }  else {
                                    mImpl.onTargetPackageChanged(packageName, userId)
                                        .ifPresent(mOnOverlaysChanged);
                                }
                            } catch (OperationFailedException e) {
                                Slog.e(TAG, "onPackageChanged internal error", e);
                                mImpl.onTargetPackageChanged(packageName, userId);
                            }
                        }
                    }
@@ -467,12 +447,7 @@ public final class OverlayManagerService extends SystemService {
                        mPackageManager.forgetPackageInfo(packageName, userId);
                        final OverlayInfo oi = mImpl.getOverlayInfo(packageName, userId);
                        if (oi != null) {
                            try {
                                mImpl.onOverlayPackageReplacing(packageName, userId)
                                    .ifPresent(mOnOverlaysChanged);
                            } catch (OperationFailedException e) {
                                Slog.e(TAG, "onPackageReplacing internal error", e);
                            }
                            mImpl.onOverlayPackageReplacing(packageName, userId);
                        }
                    }
                }
@@ -491,16 +466,10 @@ public final class OverlayManagerService extends SystemService {
                                false);
                        if (pi != null && !pi.applicationInfo.isInstantApp()) {
                            mPackageManager.cachePackageInfo(packageName, userId, pi);
                            try {
                            if (pi.isOverlayPackage()) {
                                    mImpl.onOverlayPackageReplaced(packageName, userId)
                                        .ifPresent(mOnOverlaysChanged);
                                mImpl.onOverlayPackageReplaced(packageName, userId);
                            } else {
                                    mImpl.onTargetPackageReplaced(packageName, userId)
                                        .ifPresent(mOnOverlaysChanged);
                                }
                            } catch (OperationFailedException e) {
                                Slog.e(TAG, "onPackageReplaced internal error", e);
                                mImpl.onTargetPackageReplaced(packageName, userId);
                            }
                        }
                    }
@@ -518,17 +487,10 @@ public final class OverlayManagerService extends SystemService {
                    synchronized (mLock) {
                        mPackageManager.forgetPackageInfo(packageName, userId);
                        final OverlayInfo oi = mImpl.getOverlayInfo(packageName, userId);

                        try {
                        if (oi != null) {
                                mImpl.onOverlayPackageRemoved(packageName, userId)
                                    .ifPresent(mOnOverlaysChanged);
                            mImpl.onOverlayPackageRemoved(packageName, userId);
                        } else {
                                mImpl.onTargetPackageRemoved(packageName, userId)
                                    .ifPresent(mOnOverlaysChanged);
                            }
                        } catch (OperationFailedException e) {
                            Slog.e(TAG, "onPackageRemoved internal error", e);
                            mImpl.onTargetPackageRemoved(packageName, userId);
                        }
                    }
                }
@@ -646,13 +608,7 @@ public final class OverlayManagerService extends SystemService {
                final long ident = Binder.clearCallingIdentity();
                try {
                    synchronized (mLock) {
                        try {
                            mImpl.setEnabled(packageName, enable, realUserId)
                                .ifPresent(mOnOverlaysChanged);
                            return true;
                        } catch (OperationFailedException e) {
                            return false;
                        }
                        return mImpl.setEnabled(packageName, enable, realUserId);
                    }
                } finally {
                    Binder.restoreCallingIdentity(ident);
@@ -677,14 +633,8 @@ public final class OverlayManagerService extends SystemService {
                final long ident = Binder.clearCallingIdentity();
                try {
                    synchronized (mLock) {
                        try {
                            mImpl.setEnabledExclusive(packageName,
                                    false /* withinCategory */, realUserId)
                                .ifPresent(mOnOverlaysChanged);
                            return true;
                        } catch (OperationFailedException e) {
                            return false;
                        }
                        return mImpl.setEnabledExclusive(packageName, false /* withinCategory */,
                                realUserId);
                    }
                } finally {
                    Binder.restoreCallingIdentity(ident);
@@ -710,14 +660,8 @@ public final class OverlayManagerService extends SystemService {
                final long ident = Binder.clearCallingIdentity();
                try {
                    synchronized (mLock) {
                        try {
                            mImpl.setEnabledExclusive(packageName,
                                    true /* withinCategory */, realUserId)
                                .ifPresent(mOnOverlaysChanged);
                            return true;
                        } catch (OperationFailedException e) {
                            return false;
                        }
                        return mImpl.setEnabledExclusive(packageName, true /* withinCategory */,
                                realUserId);
                    }
                } finally {
                    Binder.restoreCallingIdentity(ident);
@@ -743,13 +687,7 @@ public final class OverlayManagerService extends SystemService {
                final long ident = Binder.clearCallingIdentity();
                try {
                    synchronized (mLock) {
                        try {
                            mImpl.setPriority(packageName, parentPackageName, realUserId)
                                .ifPresent(mOnOverlaysChanged);
                            return true;
                        } catch (OperationFailedException e) {
                            return false;
                        }
                        return mImpl.setPriority(packageName, parentPackageName, realUserId);
                    }
                } finally {
                    Binder.restoreCallingIdentity(ident);
@@ -773,13 +711,7 @@ public final class OverlayManagerService extends SystemService {
                final long ident = Binder.clearCallingIdentity();
                try {
                    synchronized (mLock) {
                        try {
                            mImpl.setHighestPriority(packageName, realUserId)
                                .ifPresent(mOnOverlaysChanged);
                            return true;
                        } catch (OperationFailedException e) {
                            return false;
                        }
                        return mImpl.setHighestPriority(packageName, realUserId);
                    }
                } finally {
                    Binder.restoreCallingIdentity(ident);
@@ -803,13 +735,7 @@ public final class OverlayManagerService extends SystemService {
                final long ident = Binder.clearCallingIdentity();
                try {
                    synchronized (mLock) {
                        try {
                            mImpl.setLowestPriority(packageName, realUserId)
                                .ifPresent(mOnOverlaysChanged);
                            return true;
                        } catch (OperationFailedException e) {
                            return false;
                        }
                        return mImpl.setLowestPriority(packageName, realUserId);
                    }
                } finally {
                    Binder.restoreCallingIdentity(ident);
@@ -978,8 +904,11 @@ public final class OverlayManagerService extends SystemService {
        }
    };

    private void onOverlaysChanged(@NonNull final String targetPackageName, final int userId) {
        persistSettings();
    private final class OverlayChangeListener
            implements OverlayManagerServiceImpl.OverlayChangeListener {
        @Override
        public void onOverlaysChanged(@NonNull final String targetPackageName, final int userId) {
            schedulePersistSettings();
            FgThread.getHandler().post(() -> {
                updateAssets(userId, targetPackageName);

@@ -992,14 +921,15 @@ public final class OverlayManagerService extends SystemService {
                }

                try {
                ActivityManager.getService().broadcastIntent(null, intent, null, null, 0,
                        null, null, null, android.app.AppOpsManager.OP_NONE, null, false, false,
                        userId);
                    ActivityManager.getService().broadcastIntentWithFeature(null, null, intent,
                            null, null, 0, null, null, null, android.app.AppOpsManager.OP_NONE,
                            null, false, false, userId);
                } catch (RemoteException e) {
                    // Intentionally left empty.
                }
            });
        }
    }

    /**
     * Updates the target packages' set of enabled overlays in PackageManager.
@@ -1071,7 +1001,12 @@ public final class OverlayManagerService extends SystemService {
        }
    }

    private void persistSettings() {
    private void schedulePersistSettings() {
        if (mPersistSettingsScheduled.getAndSet(true)) {
            return;
        }
        IoThread.getHandler().post(() -> {
            mPersistSettingsScheduled.set(false);
            if (DEBUG) {
                Slog.d(TAG, "Writing overlay settings");
            }
@@ -1086,6 +1021,7 @@ public final class OverlayManagerService extends SystemService {
                    Slog.e(TAG, "failed to persist overlay state", e);
                }
            }
        });
    }

    private void restoreSettings() {
+74 −98

File changed.

Preview size limit exceeded, changes collapsed.

+0 −57
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.
 */

package com.android.server.om;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;

final class PackageAndUser {
    public final @NonNull String packageName;
    public final @UserIdInt int userId;

    PackageAndUser(@NonNull String packageName, @UserIdInt int userId) {
        this.packageName = packageName;
        this.userId = userId;
    }

    @Override
    public boolean equals(@Nullable Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof PackageAndUser)) {
            return false;
        }
        PackageAndUser other = (PackageAndUser) obj;
        return packageName.equals(other.packageName) && userId == other.userId;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + packageName.hashCode();
        result = prime * result + userId;
        return result;
    }

    @Override
    public String toString() {
        return String.format("PackageAndUser{packageName=%s, userId=%d}", packageName, userId);
    }
}
+5 −5
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
    }

    @Test
    public void testImmutableEnabledChange() throws Exception {
    public void testImmutableEnabledChange() {
        final OverlayManagerServiceImpl impl = getImpl();
        installNewPackage(target(TARGET), USER);
        installNewPackage(overlay(OVERLAY, TARGET), USER);
@@ -106,7 +106,7 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
    }

    @Test
    public void testMutableEnabledChangeHasNoEffect() throws Exception {
    public void testMutableEnabledChangeHasNoEffect() {
        final OverlayManagerServiceImpl impl = getImpl();
        installNewPackage(target(TARGET), USER);
        installNewPackage(overlay(OVERLAY, TARGET), USER);
@@ -134,7 +134,7 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
    }

    @Test
    public void testMutableEnabledToImmutableEnabled() throws Exception {
    public void testMutableEnabledToImmutableEnabled() {
        final OverlayManagerServiceImpl impl = getImpl();
        installNewPackage(target(TARGET), USER);
        installNewPackage(overlay(OVERLAY, TARGET), USER);
@@ -178,7 +178,7 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
    }

    @Test
    public void testMutablePriorityChange() throws Exception {
    public void testMutablePriorityChange() {
        final OverlayManagerServiceImpl impl = getImpl();
        installNewPackage(target(TARGET), USER);
        installNewPackage(overlay(OVERLAY, TARGET), USER);
@@ -218,7 +218,7 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
    }

    @Test
    public void testImmutablePriorityChange() throws Exception {
    public void testImmutablePriorityChange() {
        final OverlayManagerServiceImpl impl = getImpl();
        installNewPackage(target(TARGET), USER);
        installNewPackage(overlay(OVERLAY, TARGET), USER);
Loading