Loading res/xml/installed_app_details_ia.xml +5 −0 Original line number Original line Diff line number Diff line Loading @@ -52,6 +52,11 @@ android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder" android:selectable="true"/> android:selectable="true"/> <com.android.settings.applications.AppDomainsPreference android:key="instant_app_launch_supported_domain_urls" android:title="@string/app_launch_supported_domain_urls_title" android:selectable="true" /> <Preference <Preference android:key="data_settings" android:key="data_settings" android:title="@string/data_usage_summary_title" android:title="@string/data_usage_summary_title" Loading src/com/android/settings/applications/InstalledAppDetails.java +26 −1 Original line number Original line Diff line number Diff line Loading @@ -113,6 +113,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.ArrayList; import java.util.HashSet; import java.util.HashSet; import java.util.List; import java.util.List; import java.util.Set; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; Loading Loading @@ -159,6 +160,8 @@ public class InstalledAppDetails extends AppInfoBase private static final String KEY_BATTERY = "battery"; private static final String KEY_BATTERY = "battery"; private static final String KEY_MEMORY = "memory"; private static final String KEY_MEMORY = "memory"; private static final String KEY_VERSION = "app_version"; private static final String KEY_VERSION = "app_version"; private static final String KEY_INSTANT_APP_SUPPORTED_LINKS = "instant_app_launch_supported_domain_urls"; private final HashSet<String> mHomePackages = new HashSet<>(); private final HashSet<String> mHomePackages = new HashSet<>(); Loading @@ -176,6 +179,7 @@ public class InstalledAppDetails extends AppInfoBase private Preference mDataPreference; private Preference mDataPreference; private Preference mMemoryPreference; private Preference mMemoryPreference; private Preference mVersionPreference; private Preference mVersionPreference; private AppDomainsPreference mInstantAppDomainsPreference; private boolean mDisableAfterUninstall; private boolean mDisableAfterUninstall; Loading Loading @@ -433,7 +437,8 @@ public class InstalledAppDetails extends AppInfoBase mMemoryPreference = findPreference(KEY_MEMORY); mMemoryPreference = findPreference(KEY_MEMORY); mMemoryPreference.setOnPreferenceClickListener(this); mMemoryPreference.setOnPreferenceClickListener(this); mVersionPreference = findPreference(KEY_VERSION); mVersionPreference = findPreference(KEY_VERSION); mInstantAppDomainsPreference = (AppDomainsPreference) findPreference(KEY_INSTANT_APP_SUPPORTED_LINKS); mLaunchPreference = findPreference(KEY_LAUNCH); mLaunchPreference = findPreference(KEY_LAUNCH); if (mAppEntry != null && mAppEntry.info != null) { if (mAppEntry != null && mAppEntry.info != null) { if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || Loading Loading @@ -551,6 +556,25 @@ public class InstalledAppDetails extends AppInfoBase public void onLoaderReset(Loader<AppStorageStats> loader) { public void onLoaderReset(Loader<AppStorageStats> 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<String> 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. // Utility method to set application label and icon. private void setAppLabelAndIcon(PackageInfo pkgInfo) { private void setAppLabelAndIcon(PackageInfo pkgInfo) { final View appSnippet = mHeader.findViewById(R.id.app_snippet); final View appSnippet = mHeader.findViewById(R.id.app_snippet); Loading Loading @@ -642,6 +666,7 @@ public class InstalledAppDetails extends AppInfoBase checkForceStop(); checkForceStop(); setAppLabelAndIcon(mPackageInfo); setAppLabelAndIcon(mPackageInfo); initUninstallButtons(); initUninstallButtons(); prepareInstantAppPrefs(); // Update the preference summaries. // Update the preference summaries. Activity context = getActivity(); Activity context = getActivity(); Loading tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +55 −15 Original line number Original line Diff line number Diff line Loading @@ -17,21 +17,34 @@ package com.android.settings.applications; 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.AlertDialog; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.BatteryStats; import android.os.BatteryStats; import android.os.UserManager; import android.os.UserManager; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceScreen; import android.view.View; import android.view.View; import android.widget.Button; import android.widget.Button; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.TestConfig; Loading @@ -39,8 +52,8 @@ import com.android.settings.applications.instantapps.InstantAppButtonsController import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState.AppEntry; 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.StorageStatsSource.AppStorageStats; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; import org.junit.Before; import org.junit.Before; import org.junit.Test; import org.junit.Test; Loading @@ -52,18 +65,6 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; 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) @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) Loading Loading @@ -315,4 +316,43 @@ public final class InstalledAppDetailsTest { verify(buttonsController).setPackageName(anyString()); verify(buttonsController).setPackageName(anyString()); verify(buttonsController).show(); 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); } } } Loading
res/xml/installed_app_details_ia.xml +5 −0 Original line number Original line Diff line number Diff line Loading @@ -52,6 +52,11 @@ android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder" android:selectable="true"/> android:selectable="true"/> <com.android.settings.applications.AppDomainsPreference android:key="instant_app_launch_supported_domain_urls" android:title="@string/app_launch_supported_domain_urls_title" android:selectable="true" /> <Preference <Preference android:key="data_settings" android:key="data_settings" android:title="@string/data_usage_summary_title" android:title="@string/data_usage_summary_title" Loading
src/com/android/settings/applications/InstalledAppDetails.java +26 −1 Original line number Original line Diff line number Diff line Loading @@ -113,6 +113,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.ArrayList; import java.util.HashSet; import java.util.HashSet; import java.util.List; import java.util.List; import java.util.Set; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; Loading Loading @@ -159,6 +160,8 @@ public class InstalledAppDetails extends AppInfoBase private static final String KEY_BATTERY = "battery"; private static final String KEY_BATTERY = "battery"; private static final String KEY_MEMORY = "memory"; private static final String KEY_MEMORY = "memory"; private static final String KEY_VERSION = "app_version"; private static final String KEY_VERSION = "app_version"; private static final String KEY_INSTANT_APP_SUPPORTED_LINKS = "instant_app_launch_supported_domain_urls"; private final HashSet<String> mHomePackages = new HashSet<>(); private final HashSet<String> mHomePackages = new HashSet<>(); Loading @@ -176,6 +179,7 @@ public class InstalledAppDetails extends AppInfoBase private Preference mDataPreference; private Preference mDataPreference; private Preference mMemoryPreference; private Preference mMemoryPreference; private Preference mVersionPreference; private Preference mVersionPreference; private AppDomainsPreference mInstantAppDomainsPreference; private boolean mDisableAfterUninstall; private boolean mDisableAfterUninstall; Loading Loading @@ -433,7 +437,8 @@ public class InstalledAppDetails extends AppInfoBase mMemoryPreference = findPreference(KEY_MEMORY); mMemoryPreference = findPreference(KEY_MEMORY); mMemoryPreference.setOnPreferenceClickListener(this); mMemoryPreference.setOnPreferenceClickListener(this); mVersionPreference = findPreference(KEY_VERSION); mVersionPreference = findPreference(KEY_VERSION); mInstantAppDomainsPreference = (AppDomainsPreference) findPreference(KEY_INSTANT_APP_SUPPORTED_LINKS); mLaunchPreference = findPreference(KEY_LAUNCH); mLaunchPreference = findPreference(KEY_LAUNCH); if (mAppEntry != null && mAppEntry.info != null) { if (mAppEntry != null && mAppEntry.info != null) { if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || Loading Loading @@ -551,6 +556,25 @@ public class InstalledAppDetails extends AppInfoBase public void onLoaderReset(Loader<AppStorageStats> loader) { public void onLoaderReset(Loader<AppStorageStats> 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<String> 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. // Utility method to set application label and icon. private void setAppLabelAndIcon(PackageInfo pkgInfo) { private void setAppLabelAndIcon(PackageInfo pkgInfo) { final View appSnippet = mHeader.findViewById(R.id.app_snippet); final View appSnippet = mHeader.findViewById(R.id.app_snippet); Loading Loading @@ -642,6 +666,7 @@ public class InstalledAppDetails extends AppInfoBase checkForceStop(); checkForceStop(); setAppLabelAndIcon(mPackageInfo); setAppLabelAndIcon(mPackageInfo); initUninstallButtons(); initUninstallButtons(); prepareInstantAppPrefs(); // Update the preference summaries. // Update the preference summaries. Activity context = getActivity(); Activity context = getActivity(); Loading
tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +55 −15 Original line number Original line Diff line number Diff line Loading @@ -17,21 +17,34 @@ package com.android.settings.applications; 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.AlertDialog; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.BatteryStats; import android.os.BatteryStats; import android.os.UserManager; import android.os.UserManager; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceScreen; import android.view.View; import android.view.View; import android.widget.Button; import android.widget.Button; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.TestConfig; Loading @@ -39,8 +52,8 @@ import com.android.settings.applications.instantapps.InstantAppButtonsController import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState.AppEntry; 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.StorageStatsSource.AppStorageStats; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; import org.junit.Before; import org.junit.Before; import org.junit.Test; import org.junit.Test; Loading @@ -52,18 +65,6 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; 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) @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) Loading Loading @@ -315,4 +316,43 @@ public final class InstalledAppDetailsTest { verify(buttonsController).setPackageName(anyString()); verify(buttonsController).setPackageName(anyString()); verify(buttonsController).show(); 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); } } }