diff --git a/res/xml/installed_app_details_ia.xml b/res/xml/installed_app_details_ia.xml index b0927538ae2..538205f8343 100644 --- a/res/xml/installed_app_details_ia.xml +++ b/res/xml/installed_app_details_ia.xml @@ -52,6 +52,11 @@ android:summary="@string/summary_placeholder" android:selectable="true"/> + + mHomePackages = new HashSet<>(); @@ -175,6 +178,7 @@ public class InstalledAppDetails extends AppInfoBase private Preference mDataPreference; private Preference mMemoryPreference; private Preference mVersionPreference; + private AppDomainsPreference mInstantAppDomainsPreference; private boolean mDisableAfterUninstall; @@ -432,7 +436,8 @@ public class InstalledAppDetails extends AppInfoBase mMemoryPreference = findPreference(KEY_MEMORY); mMemoryPreference.setOnPreferenceClickListener(this); mVersionPreference = findPreference(KEY_VERSION); - + mInstantAppDomainsPreference = + (AppDomainsPreference) findPreference(KEY_INSTANT_APP_SUPPORTED_LINKS); mLaunchPreference = findPreference(KEY_LAUNCH); if (mAppEntry != null && mAppEntry.info != null) { if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || @@ -550,6 +555,25 @@ public class InstalledAppDetails extends AppInfoBase public void onLoaderReset(Loader loader) { } + /** + * Utility method to hide and show specific preferences based on whether the app being displayed + * is an Instant App or an installed app. + */ + @VisibleForTesting + void prepareInstantAppPrefs() { + final boolean isInstant = AppUtils.isInstant(mPackageInfo.applicationInfo); + if (isInstant) { + Set handledDomainSet = Utils.getHandledDomains(mPm, mPackageInfo.packageName); + String[] handledDomains = handledDomainSet.toArray(new String[handledDomainSet.size()]); + mInstantAppDomainsPreference.setTitles(handledDomains); + // Dummy values, unused in the implementation + mInstantAppDomainsPreference.setValues(new int[handledDomains.length]); + getPreferenceScreen().removePreference(mLaunchPreference); + } else { + getPreferenceScreen().removePreference(mInstantAppDomainsPreference); + } + } + // Utility method to set application label and icon. private void setAppLabelAndIcon(PackageInfo pkgInfo) { final View appSnippet = mHeader.findViewById(R.id.app_snippet); @@ -641,6 +665,7 @@ public class InstalledAppDetails extends AppInfoBase checkForceStop(); setAppLabelAndIcon(mPackageInfo); initUninstallButtons(); + prepareInstantAppPrefs(); // Update the preference summaries. Activity context = getActivity(); diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java index 5b1019ee642..f3728365abd 100644 --- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java @@ -17,21 +17,34 @@ package com.android.settings.applications; -import android.app.Activity; +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.os.BatteryStats; import android.os.UserManager; import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceManager; +import android.support.v7.preference.PreferenceScreen; import android.view.View; import android.widget.Button; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; -import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; @@ -39,8 +52,8 @@ import com.android.settings.applications.instantapps.InstantAppButtonsController import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState.AppEntry; -import com.android.settingslib.applications.instantapps.InstantAppDataProvider; import com.android.settingslib.applications.StorageStatsSource.AppStorageStats; +import com.android.settingslib.applications.instantapps.InstantAppDataProvider; import org.junit.Before; import org.junit.Test; @@ -52,18 +65,6 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @@ -315,4 +316,43 @@ public final class InstalledAppDetailsTest { verify(buttonsController).setPackageName(anyString()); verify(buttonsController).show(); } + + @Test + public void instantApps_removeCorrectPref() { + PreferenceScreen mockPreferenceScreen = mock(PreferenceScreen.class); + PreferenceManager mockPreferenceManager = mock(PreferenceManager.class); + AppDomainsPreference mockAppDomainsPref = mock(AppDomainsPreference.class); + Preference mockLaunchPreference = mock(Preference.class); + PackageInfo mockPackageInfo = mock(PackageInfo.class); + PackageManager mockPackageManager = mock(PackageManager.class); + ReflectionHelpers.setField( + mAppDetail, "mLaunchPreference", mockLaunchPreference); + ReflectionHelpers.setField( + mAppDetail, "mInstantAppDomainsPreference", mockAppDomainsPref); + ReflectionHelpers.setField( + mAppDetail, "mPreferenceManager", mockPreferenceManager); + ReflectionHelpers.setField( + mAppDetail, "mPackageInfo", mockPackageInfo); + ReflectionHelpers.setField( + mAppDetail, "mPm", mockPackageManager); + when(mockPreferenceManager.getPreferenceScreen()).thenReturn(mockPreferenceScreen); + + ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", + (InstantAppDataProvider) (i -> false)); + mAppDetail.prepareInstantAppPrefs(); + + // For the non instant case we remove the app domain pref, and leave the launch pref + verify(mockPreferenceScreen).removePreference(mockAppDomainsPref); + verify(mockPreferenceScreen, never()).removePreference(mockLaunchPreference); + + // For the instant app case we remove the launch preff, and leave the app domain pref + ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", + (InstantAppDataProvider) (i -> true)); + + mAppDetail.prepareInstantAppPrefs(); + verify(mockPreferenceScreen).removePreference(mockLaunchPreference); + // Will be 1 still due to above call + verify(mockPreferenceScreen, times(1)) + .removePreference(mockAppDomainsPref); + } }