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

Commit edc5099e authored by Jesse Evans's avatar Jesse Evans
Browse files

Instant apps show supported links not open default

On the app info page, instant apps show only the supported links
dialog rather than Open by default which opens in a secondary page
where the user can control things that aren't relevant to instant
apps.
Test: make RunSettingsRoboTests
Bug: 36497697
Change-Id: If4eba7c11c5490cbda1ef617002121fe108c4085
parent 0770f85c
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -52,6 +52,11 @@
        android:summary="@string/summary_placeholder"
        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
        android:key="data_settings"
        android:title="@string/data_usage_summary_title"
+26 −1
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;

@@ -158,6 +159,8 @@ public class InstalledAppDetails extends AppInfoBase
    private static final String KEY_BATTERY = "battery";
    private static final String KEY_MEMORY = "memory";
    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<>();

@@ -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<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.
    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();
+55 −15
Original line number Diff line number Diff line
@@ -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);
    }
}