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

Commit 0f34680f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Instant apps show supported links not open default" into oc-dev

parents c4f08120 edc5099e
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -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"
+26 −1
Original line number Original line Diff line number Diff line
@@ -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;


@@ -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<>();


@@ -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;


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