Create version 2 of InstalledAppDetails

- this is the first step for converting InstalledAppDetails into
DashboardFragment
- add a feature flag to determine whether to show the new installed app
detail page.
- decouple the fragment from AppInfoBase: extends from
SettingsPreferenceFragment directly and copy all codes from
AppInfoBase.

Bug: 69384089
Test: make RunSettingsRoboTests
Change-Id: If1ab5b216620eaba1d6bde20e65e7a602931fd94
This commit is contained in:
Doris Ling
2017-11-17 15:15:27 -08:00
parent 1eaf52aad4
commit 529e207986
12 changed files with 1782 additions and 24 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -121,7 +121,10 @@ import java.util.Set;
* System applications that do not want clear user data do not have this option.
* For non-system applications, there is no option to clear data. Instead there is an option to
* uninstall the application.
*
* deprecated in favor of {@link AppInfoDashboardFragment}
*/
@Deprecated
public class InstalledAppDetails extends AppInfoBase
implements OnPreferenceClickListener, LoaderManager.LoaderCallbacks<AppStorageStats> {

View File

@@ -17,21 +17,29 @@
package com.android.settings.applications;
import android.content.Intent;
import android.util.FeatureFlagUtils;
import com.android.settings.SettingsActivity;
import com.android.settings.core.FeatureFlags;
public class InstalledAppDetailsTop extends SettingsActivity {
@Override
public Intent getIntent() {
Intent modIntent = new Intent(super.getIntent());
modIntent.putExtra(EXTRA_SHOW_FRAGMENT, InstalledAppDetails.class.getName());
if (FeatureFlagUtils.isEnabled(this, FeatureFlags.APP_INFO_V2)) {
modIntent.putExtra(EXTRA_SHOW_FRAGMENT, AppInfoDashboardFragment.class.getName());
} else {
modIntent.putExtra(EXTRA_SHOW_FRAGMENT, InstalledAppDetails.class.getName());
}
return modIntent;
}
@Override
protected boolean isValidFragment(String fragmentName) {
if (InstalledAppDetails.class.getName().equals(fragmentName)) return true;
return false;
if (FeatureFlagUtils.isEnabled(this, FeatureFlags.APP_INFO_V2)) {
return AppInfoDashboardFragment.class.getName().equals(fragmentName);
}
return InstalledAppDetails.class.getName().equals(fragmentName);
}
}

View File

@@ -34,11 +34,13 @@ import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.FeatureFlagUtils;
import android.util.IconDrawableFactory;
import android.util.Log;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.FeatureFlags;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.applications.ApplicationsState;
@@ -241,10 +243,17 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
System.currentTimeMillis() - stat.getLastTimeUsed(), false));
pref.setOrder(i);
pref.setOnPreferenceClickListener(preference -> {
AppInfoBase.startAppInfoFragment(InstalledAppDetails.class,
R.string.application_info_label, pkgName, appEntry.info.uid, mHost,
1001 /*RequestCode*/, SETTINGS_APP_NOTIF_CATEGORY);
return true;
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.APP_INFO_V2)) {
AppInfoBase.startAppInfoFragment(AppInfoDashboardFragment.class,
R.string.application_info_label, pkgName, appEntry.info.uid, mHost,
1001 /*RequestCode*/, SETTINGS_APP_NOTIF_CATEGORY);
return true;
} else {
AppInfoBase.startAppInfoFragment(InstalledAppDetails.class,
R.string.application_info_label, pkgName, appEntry.info.uid, mHost,
1001 /*RequestCode*/, SETTINGS_APP_NOTIF_CATEGORY);
return true;
}
});
if (!rebindPref) {
mCategory.addPreference(pref);

View File

@@ -50,6 +50,7 @@ import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -95,6 +96,8 @@ import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.applications.NotificationApps;
import com.android.settings.applications.UsageAccessDetails;
import com.android.settings.applications.WriteSettingsDetails;
import com.android.settings.applications.AppInfoDashboardFragment;
import com.android.settings.core.FeatureFlags;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.fuelgauge.HighPowerDetail;
@@ -538,7 +541,13 @@ public class ManageApplications extends InstrumentedPreferenceFragment
// process ahead of time, to avoid a long load of data when user clicks on a managed
// app. Maybe when they load the list of apps that contains managed profile apps.
default:
startAppInfoFragment(InstalledAppDetails.class, R.string.application_info_label);
if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.APP_INFO_V2)) {
startAppInfoFragment(
AppInfoDashboardFragment.class, R.string.application_info_label);
} else {
startAppInfoFragment(
InstalledAppDetails.class, R.string.application_info_label);
}
break;
}
}

View File

@@ -24,4 +24,5 @@ public class FeatureFlags {
public static final String DEV_OPTION_V1 = "dev_option_v1";
public static final String SEARCH_V2 = "settings_search_v2";
public static final String SUGGESTIONS_V2 = "new_settings_suggestion";
public static final String APP_INFO_V2 = "settings_app_info_v2";
}

View File

@@ -52,6 +52,7 @@ import com.android.settings.applications.ProcessStatsUi;
import com.android.settings.applications.UsageAccessDetails;
import com.android.settings.applications.VrListenerSettings;
import com.android.settings.applications.WriteSettingsDetails;
import com.android.settings.applications.AppInfoDashboardFragment;
import com.android.settings.applications.assist.ManageAssist;
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
@@ -208,6 +209,7 @@ public class SettingsGateway {
ChooseLockPassword.ChooseLockPasswordFragment.class.getName(),
ChooseLockPattern.ChooseLockPatternFragment.class.getName(),
InstalledAppDetails.class.getName(),
AppInfoDashboardFragment.class.getName(),
BatterySaverSettings.class.getName(),
AppNotificationSettings.class.getName(),
ChannelNotificationSettings.class.getName(),

View File

@@ -20,6 +20,7 @@ import android.os.Bundle;
import android.os.UserHandle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.FeatureFlagUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@@ -31,6 +32,8 @@ import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.applications.AppStateBaseBridge;
import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.applications.AppInfoDashboardFragment;
import com.android.settings.core.FeatureFlags;
import com.android.settings.datausage.AppStateDataUsageBridge.DataUsageState;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.AppSwitchPreference;
@@ -271,10 +274,17 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
protected void onClick() {
if (mState.isDataSaverBlacklisted) {
// app is blacklisted, launch App Data Usage screen
InstalledAppDetails.startAppInfoFragment(AppDataUsage.class,
R.string.app_data_usage,
UnrestrictedDataAccess.this,
mEntry);
if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.APP_INFO_V2)) {
AppInfoDashboardFragment.startAppInfoFragment(AppDataUsage.class,
R.string.app_data_usage,
UnrestrictedDataAccess.this,
mEntry);
} else {
InstalledAppDetails.startAppInfoFragment(AppDataUsage.class,
R.string.app_data_usage,
UnrestrictedDataAccess.this,
mEntry);
}
} else {
// app is not blacklisted, let superclass handle toggle switch
super.onClick();

View File

@@ -20,10 +20,13 @@ import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
import android.util.FeatureFlagUtils;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.applications.AppInfoDashboardFragment;
import com.android.settings.core.FeatureFlags;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.location.RecentLocationApps;
@@ -56,11 +59,19 @@ public class RecentLocationRequestPreferenceController extends LocationBasePrefe
public boolean onPreferenceClick(Preference preference) {
// start new fragment to display extended information
final Bundle args = new Bundle();
args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackage);
((SettingsActivity) mFragment.getActivity()).startPreferencePanelAsUser(
mFragment,
InstalledAppDetails.class.getName(), args,
R.string.application_info_label, null, mUserHandle);
if (FeatureFlagUtils.isEnabled(mFragment.getActivity(), FeatureFlags.APP_INFO_V2)) {
args.putString(AppInfoDashboardFragment.ARG_PACKAGE_NAME, mPackage);
((SettingsActivity) mFragment.getActivity()).startPreferencePanelAsUser(
mFragment,
AppInfoDashboardFragment.class.getName(), args,
R.string.application_info_label, null, mUserHandle);
} else {
args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackage);
((SettingsActivity) mFragment.getActivity()).startPreferencePanelAsUser(
mFragment,
InstalledAppDetails.class.getName(), args,
R.string.application_info_label, null, mUserHandle);
}
return true;
}
}

View File

@@ -32,6 +32,7 @@ import android.support.annotation.IntDef;
import android.support.annotation.VisibleForTesting;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -44,6 +45,8 @@ import com.android.settings.Utils;
import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.applications.AppInfoDashboardFragment;
import com.android.settings.core.FeatureFlags;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -272,11 +275,17 @@ public class EntityHeaderController {
entityHeaderContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppInfoBase.startAppInfoFragment(
InstalledAppDetails.class, R.string.application_info_label,
mPackageName, mUid, mFragment, 0 /* request */,
mMetricsCategory);
if (FeatureFlagUtils.isEnabled(mAppContext, FeatureFlags.APP_INFO_V2)) {
AppInfoBase.startAppInfoFragment(
AppInfoDashboardFragment.class, R.string.application_info_label,
mPackageName, mUid, mFragment, 0 /* request */,
mMetricsCategory);
} else {
AppInfoBase.startAppInfoFragment(
InstalledAppDetails.class, R.string.application_info_label,
mPackageName, mUid, mFragment, 0 /* request */,
mMetricsCategory);
}
}
});
return;

View File

@@ -47,6 +47,7 @@ com.android.settings.applications.RunningServices
com.android.settings.applications.ConfirmConvertToFbe
com.android.settings.deviceinfo.PublicVolumeSettings
com.android.settings.applications.InstalledAppDetails
com.android.settings.applications.AppInfoDashboardFragment
com.android.settings.accessibility.ToggleAccessibilityServicePreferenceFragment
com.android.settings.print.PrintServiceSettingsFragment
com.android.settings.wfd.WifiDisplaySettings

View File

@@ -35,11 +35,14 @@ import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.applications.AppInfoDashboardFragment;
import com.android.settings.core.FeatureFlags;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -167,8 +170,15 @@ public class RecentLocationRequestPreferenceControllerTest {
preference.performClick();
verify(activity).startPreferencePanelAsUser(any(), eq(InstalledAppDetails.class.getName()),
any(Bundle.class), anyInt(), any(), any());
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.APP_INFO_V2)) {
verify(activity).startPreferencePanelAsUser(any(),
eq(AppInfoDashboardFragment.class.getName()),
any(Bundle.class), anyInt(), any(), any());
} else {
verify(activity).startPreferencePanelAsUser(any(),
eq(InstalledAppDetails.class.getName()),
any(Bundle.class), anyInt(), any(), any());
}
}
private static ArgumentMatcher<Preference> titleMatches(String expected) {