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