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

Commit 2230d0d4 authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Add PackageMonitor callback for PACKAGE_UNSTOPPED broadcast.

Bug: 315046091
Test: atest core/tests/packagemonitortests/src/com/android/internal/content/PackageMonitorTest.java
Change-Id: If98b481be9d2543eefc9e7275cd985fb58b93877
parent 8c041687
Loading
Loading
Loading
Loading
+22 −2
Original line number Diff line number Diff line
@@ -199,6 +199,11 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
    public void onPackageChangedWithExtras(String packageName, Bundle extras) {
    }

    public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit,
            Bundle extras) {
        return onHandleForceStop(intent, packages, uid, doit);
    }

    public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
        return false;
    }
@@ -254,6 +259,15 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
    public void onPackageModified(@NonNull String packageName) {
    }

    /**
     * Called when a package in the stopped state is started for some reason.
     *
     * @param packageName Name of the package that was unstopped
     * @param uid UID of the package that was unstopped
     */
    public void onPackageUnstopped(String packageName, int uid, Bundle extras) {
    }

    public boolean didSomePackagesChange() {
        return mSomePackagesChanged;
    }
@@ -444,13 +458,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
            mChangeType = PACKAGE_TEMPORARY_CHANGE;
            boolean canRestart = onHandleForceStop(intent,
                    mDisappearingPackages,
                    intent.getIntExtra(Intent.EXTRA_UID, 0), false);
                    intent.getIntExtra(Intent.EXTRA_UID, 0), false, intent.getExtras());
            if (canRestart) setResultCode(Activity.RESULT_OK);
        } else if (Intent.ACTION_PACKAGE_RESTARTED.equals(action)) {
            mDisappearingPackages = new String[] {getPackageName(intent)};
            mChangeType = PACKAGE_TEMPORARY_CHANGE;
            onHandleForceStop(intent, mDisappearingPackages,
                    intent.getIntExtra(Intent.EXTRA_UID, 0), true);
                    intent.getIntExtra(Intent.EXTRA_UID, 0), true, intent.getExtras());
        } else if (Intent.ACTION_UID_REMOVED.equals(action)) {
            onUidRemoved(intent.getIntExtra(Intent.EXTRA_UID, 0));
        } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
@@ -485,6 +499,12 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
            String[] pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
            mSomePackagesChanged = true;
            onPackagesUnsuspended(pkgList);
        } else if (Intent.ACTION_PACKAGE_UNSTOPPED.equals(action)) {
            final String pkgName = getPackageName(intent);
            mAppearingPackages = new String[] {pkgName};
            mChangeType = PACKAGE_TEMPORARY_CHANGE;
            onPackageUnstopped(pkgName, intent.getIntExtra(Intent.EXTRA_UID, 0),
                    intent.getExtras());
        }

        if (mSomePackagesChanged) {
+31 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.os.UserHandle;

import androidx.test.runner.AndroidJUnit4;
@@ -38,6 +39,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

@@ -185,15 +187,43 @@ public class PackageMonitorTest {
        Intent intent = new Intent(Intent.ACTION_PACKAGE_RESTARTED);
        intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
        intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
        final long elapsedRealtimeMs = SystemClock.elapsedRealtime();
        intent.putExtra(Intent.EXTRA_TIME, elapsedRealtimeMs);
        intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
        spyPackageMonitor.doHandlePackageEvent(intent);

        verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
        verify(spyPackageMonitor, times(1)).onHandleForceStop(eq(intent),
                eq(new String[]{FAKE_PACKAGE_NAME}), eq(FAKE_PACKAGE_UID), eq(true));
                eq(new String[]{FAKE_PACKAGE_NAME}), eq(FAKE_PACKAGE_UID), eq(true),
                eqTimestamp(elapsedRealtimeMs));
        verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
    }

    @Test
    public void testPackageMonitorDoHandlePackageEventPackageUnstopped() throws Exception {
        PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());

        Intent intent = new Intent(Intent.ACTION_PACKAGE_UNSTOPPED);
        intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
        intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
        final long elapsedRealtimeMs = SystemClock.elapsedRealtime();
        intent.putExtra(Intent.EXTRA_TIME, elapsedRealtimeMs);
        intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
        spyPackageMonitor.doHandlePackageEvent(intent);

        verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
        verify(spyPackageMonitor, times(1)).onPackageUnstopped(
                eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID), eqTimestamp(elapsedRealtimeMs));
        verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
    }

    private static Bundle eqTimestamp(long expectedRealtimeMs) {
        return ArgumentMatchers.argThat(actualExtras -> {
            final long actualRealtimeMs = actualExtras.getLong(Intent.EXTRA_TIME);
            return expectedRealtimeMs == actualRealtimeMs;
        });
    }

    @Test
    public void testPackageMonitorDoHandlePackageEventPackageQueryRestarted() throws Exception {
        PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+3 −0
Original line number Diff line number Diff line
@@ -4604,6 +4604,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                            userIds, null, broadcastAllowList, null,
                            null);
                });
                mPackageMonitorCallbackHelper.notifyPackageMonitor(Intent.ACTION_PACKAGE_UNSTOPPED,
                        packageName, extras, userIds, null /* instantUserIds */,
                        broadcastAllowList, mHandler);
            }
        }
    }
+3 −1
Original line number Diff line number Diff line
@@ -188,7 +188,9 @@ class PackageMonitorCallbackHelper {
                || TextUtils.equals(action, Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE)
                || TextUtils.equals(action, Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE)
                || TextUtils.equals(action, Intent.ACTION_PACKAGE_DATA_CLEARED)
                || TextUtils.equals(action, Intent.ACTION_PACKAGE_RESTARTED);
                || TextUtils.equals(action, Intent.ACTION_PACKAGE_RESTARTED)
                || TextUtils.equals(action, Intent.ACTION_PACKAGE_UNSTOPPED);

    }

    private void doNotifyCallbacksByIntent(Intent intent, int userId,