From f75f7d99ea8bdf13d6f1db656239ccf85e5a4e3f Mon Sep 17 00:00:00 2001 From: Piyush Mehrotra Date: Wed, 27 Jul 2022 14:05:04 +0000 Subject: [PATCH] Unregister transport when user disables corresponding package. Register transport when user puts package in default enable state. This change is an extension of ag/17072365. TransportManager#onPackageChanged is not correctly handling these 2 cases - 1. When a package is disabled by user. Meaning, the state 'COMPONENT_ENABLED_STATE_DISABLED_USER' was being ignored. 2. When a package is default-enabled. Meaning, the state 'COMPONENT_ENABLED_STATE_DEFAULT' was being ignored. If the package in question contains backup transports, they should be registered or unregistered depending on the state. For state 'COMPONENT_ENABLED_STATE_DEFAULT', I'm considering it as if package is enabled. The only situation where package is in disabled state in default state is when it is explicitly specified in Manifest at an application level. Bug: 162725876, 237049952 Fixes: 162725876, 237049952 Test: 1. atest -v BackupFrameworksServicesRoboTests:TransportManagerTest 2. Manual test on device (Oriole) - List transports - Disable package via Settings -> Apps - List transports and verify disabled transports are not present. - Enable package via Settings -> Apps - List transports and verify default-enabled transports are present. - Verify logs via logcat to ensure correct switch codepaths was taken in TransportManager Change-Id: I1d5e9f8bf5625257bd01a910d29b4dbcb68f3ab4 --- .../server/backup/TransportManager.java | 20 +++++++++ .../server/backup/TransportManagerTest.java | 42 ++++++++++++++++--- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/services/backup/backuplib/java/com/android/server/backup/TransportManager.java b/services/backup/backuplib/java/com/android/server/backup/TransportManager.java index 930f49e4d117e..a4ea698c5c4f7 100644 --- a/services/backup/backuplib/java/com/android/server/backup/TransportManager.java +++ b/services/backup/backuplib/java/com/android/server/backup/TransportManager.java @@ -16,7 +16,9 @@ package com.android.server.backup; +import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; +import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import android.annotation.Nullable; @@ -166,6 +168,17 @@ public class TransportManager { onPackageEnabled(packageName); return; } + case COMPONENT_ENABLED_STATE_DEFAULT: { + // Package is set to its default enabled state (as specified in its manifest). + // Unless explicitly specified in manifest, the default enabled state + // is 'enabled'. Here, we assume that default state always means enabled. + if (MORE_DEBUG) { + Slog.d(TAG, "Package " + packageName + + " was put in default enabled state."); + } + onPackageEnabled(packageName); + return; + } case COMPONENT_ENABLED_STATE_DISABLED: { if (MORE_DEBUG) { Slog.d(TAG, "Package " + packageName + " was disabled."); @@ -173,6 +186,13 @@ public class TransportManager { onPackageDisabled(packageName); return; } + case COMPONENT_ENABLED_STATE_DISABLED_USER: { + if (MORE_DEBUG) { + Slog.d(TAG, "Package " + packageName + " was disabled by user."); + } + onPackageDisabled(packageName); + return; + } default: { Slog.w(TAG, "Package " + packageName + " enabled setting: " + enabled); return; diff --git a/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java index 8a9845b1c2d2d..b25f265c16dc2 100644 --- a/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java +++ b/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java @@ -18,6 +18,7 @@ package com.android.server.backup; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; +import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import static com.android.server.backup.testing.TransportData.genericTransport; @@ -326,7 +327,25 @@ public class TransportManagerTest { .setApplicationEnabledSetting( PACKAGE_A, Integer.valueOf(COMPONENT_ENABLED_STATE_DISABLED), - 0 /*flags*/); + /* flags */ 0); + transportManager.onPackageChanged(PACKAGE_A, PACKAGE_A); + + assertRegisteredTransports(transportManager, singletonList(mTransportB1)); + verify(mListener, never()).onTransportRegistered(any(), any()); + } + + @Test + public void testOnPackageChanged_whenPackageChanged_packageDisabledByUserUnregistersTransport() + throws Exception { + TransportManager transportManager = + createTransportManagerWithRegisteredTransports(mTransportA1, mTransportB1); + reset(mListener); + + mContext.getPackageManager() + .setApplicationEnabledSetting( + PACKAGE_A, + Integer.valueOf(COMPONENT_ENABLED_STATE_DISABLED_USER), + /* flags */ 0); transportManager.onPackageChanged(PACKAGE_A, PACKAGE_A); assertRegisteredTransports(transportManager, singletonList(mTransportB1)); @@ -344,7 +363,7 @@ public class TransportManagerTest { .setApplicationEnabledSetting( PACKAGE_A, Integer.valueOf(COMPONENT_ENABLED_STATE_DISABLED), - 0 /*flags*/); + /* flags */ 0); transportManager.onPackageChanged(PACKAGE_A, PACKAGE_A); assertRegisteredTransports(transportManager, singletonList(mTransportB1)); @@ -354,7 +373,7 @@ public class TransportManagerTest { .setApplicationEnabledSetting( PACKAGE_A, Integer.valueOf(COMPONENT_ENABLED_STATE_ENABLED), - 0 /*flags*/); + /* flags */ 0); transportManager.onPackageChanged(PACKAGE_A, PACKAGE_A); assertRegisteredTransports(transportManager, asList(mTransportA1, mTransportB1)); @@ -363,21 +382,32 @@ public class TransportManagerTest { } @Test - public void testOnPackageChanged_whenPackageChanged_unknownComponentStateIsIgnored() + public void testOnPackageChanged_whenPackageChanged_packageDefaultEnabledRegistersTransport() throws Exception { TransportManager transportManager = createTransportManagerWithRegisteredTransports(mTransportA1, mTransportB1); reset(mListener); + mContext.getPackageManager() + .setApplicationEnabledSetting( + PACKAGE_A, + Integer.valueOf(COMPONENT_ENABLED_STATE_DISABLED_USER), + /* flags */ 0); + transportManager.onPackageChanged(PACKAGE_A, PACKAGE_A); + + assertRegisteredTransports(transportManager, singletonList(mTransportB1)); + verify(mListener, never()).onTransportRegistered(any(), any()); + mContext.getPackageManager() .setApplicationEnabledSetting( PACKAGE_A, Integer.valueOf(COMPONENT_ENABLED_STATE_DEFAULT), - 0 /*flags*/); + /* flags */ 0); transportManager.onPackageChanged(PACKAGE_A, PACKAGE_A); assertRegisteredTransports(transportManager, asList(mTransportA1, mTransportB1)); - verify(mListener, never()).onTransportRegistered(any(), any()); + verify(mListener) + .onTransportRegistered(mTransportA1.transportName, mTransportA1.transportDirName); } @Test