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:
1685
src/com/android/settings/applications/AppInfoDashboardFragment.java
Executable file
1685
src/com/android/settings/applications/AppInfoDashboardFragment.java
Executable file
File diff suppressed because it is too large
Load Diff
@@ -121,7 +121,10 @@ import java.util.Set;
|
|||||||
* System applications that do not want clear user data do not have this option.
|
* 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
|
* For non-system applications, there is no option to clear data. Instead there is an option to
|
||||||
* uninstall the application.
|
* uninstall the application.
|
||||||
|
*
|
||||||
|
* deprecated in favor of {@link AppInfoDashboardFragment}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public class InstalledAppDetails extends AppInfoBase
|
public class InstalledAppDetails extends AppInfoBase
|
||||||
implements OnPreferenceClickListener, LoaderManager.LoaderCallbacks<AppStorageStats> {
|
implements OnPreferenceClickListener, LoaderManager.LoaderCallbacks<AppStorageStats> {
|
||||||
|
|
||||||
|
@@ -17,21 +17,29 @@
|
|||||||
package com.android.settings.applications;
|
package com.android.settings.applications;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
|
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
|
import com.android.settings.core.FeatureFlags;
|
||||||
|
|
||||||
public class InstalledAppDetailsTop extends SettingsActivity {
|
public class InstalledAppDetailsTop extends SettingsActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Intent getIntent() {
|
public Intent getIntent() {
|
||||||
Intent modIntent = new Intent(super.getIntent());
|
Intent modIntent = new Intent(super.getIntent());
|
||||||
|
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());
|
modIntent.putExtra(EXTRA_SHOW_FRAGMENT, InstalledAppDetails.class.getName());
|
||||||
|
}
|
||||||
return modIntent;
|
return modIntent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isValidFragment(String fragmentName) {
|
protected boolean isValidFragment(String fragmentName) {
|
||||||
if (InstalledAppDetails.class.getName().equals(fragmentName)) return true;
|
if (FeatureFlagUtils.isEnabled(this, FeatureFlags.APP_INFO_V2)) {
|
||||||
return false;
|
return AppInfoDashboardFragment.class.getName().equals(fragmentName);
|
||||||
|
}
|
||||||
|
return InstalledAppDetails.class.getName().equals(fragmentName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -34,11 +34,13 @@ import android.support.v7.preference.PreferenceScreen;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
import android.util.IconDrawableFactory;
|
import android.util.IconDrawableFactory;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
|
import com.android.settings.core.FeatureFlags;
|
||||||
import com.android.settings.core.PreferenceControllerMixin;
|
import com.android.settings.core.PreferenceControllerMixin;
|
||||||
import com.android.settings.widget.AppPreference;
|
import com.android.settings.widget.AppPreference;
|
||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
@@ -241,10 +243,17 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
|
|||||||
System.currentTimeMillis() - stat.getLastTimeUsed(), false));
|
System.currentTimeMillis() - stat.getLastTimeUsed(), false));
|
||||||
pref.setOrder(i);
|
pref.setOrder(i);
|
||||||
pref.setOnPreferenceClickListener(preference -> {
|
pref.setOnPreferenceClickListener(preference -> {
|
||||||
|
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,
|
AppInfoBase.startAppInfoFragment(InstalledAppDetails.class,
|
||||||
R.string.application_info_label, pkgName, appEntry.info.uid, mHost,
|
R.string.application_info_label, pkgName, appEntry.info.uid, mHost,
|
||||||
1001 /*RequestCode*/, SETTINGS_APP_NOTIF_CATEGORY);
|
1001 /*RequestCode*/, SETTINGS_APP_NOTIF_CATEGORY);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
if (!rebindPref) {
|
if (!rebindPref) {
|
||||||
mCategory.addPreference(pref);
|
mCategory.addPreference(pref);
|
||||||
|
@@ -50,6 +50,7 @@ import android.support.v7.widget.LinearLayoutManager;
|
|||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
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.NotificationApps;
|
||||||
import com.android.settings.applications.UsageAccessDetails;
|
import com.android.settings.applications.UsageAccessDetails;
|
||||||
import com.android.settings.applications.WriteSettingsDetails;
|
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.core.InstrumentedPreferenceFragment;
|
||||||
import com.android.settings.dashboard.SummaryLoader;
|
import com.android.settings.dashboard.SummaryLoader;
|
||||||
import com.android.settings.fuelgauge.HighPowerDetail;
|
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
|
// 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.
|
// app. Maybe when they load the list of apps that contains managed profile apps.
|
||||||
default:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,4 +24,5 @@ public class FeatureFlags {
|
|||||||
public static final String DEV_OPTION_V1 = "dev_option_v1";
|
public static final String DEV_OPTION_V1 = "dev_option_v1";
|
||||||
public static final String SEARCH_V2 = "settings_search_v2";
|
public static final String SEARCH_V2 = "settings_search_v2";
|
||||||
public static final String SUGGESTIONS_V2 = "new_settings_suggestion";
|
public static final String SUGGESTIONS_V2 = "new_settings_suggestion";
|
||||||
|
public static final String APP_INFO_V2 = "settings_app_info_v2";
|
||||||
}
|
}
|
||||||
|
@@ -52,6 +52,7 @@ import com.android.settings.applications.ProcessStatsUi;
|
|||||||
import com.android.settings.applications.UsageAccessDetails;
|
import com.android.settings.applications.UsageAccessDetails;
|
||||||
import com.android.settings.applications.VrListenerSettings;
|
import com.android.settings.applications.VrListenerSettings;
|
||||||
import com.android.settings.applications.WriteSettingsDetails;
|
import com.android.settings.applications.WriteSettingsDetails;
|
||||||
|
import com.android.settings.applications.AppInfoDashboardFragment;
|
||||||
import com.android.settings.applications.assist.ManageAssist;
|
import com.android.settings.applications.assist.ManageAssist;
|
||||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||||
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
|
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
|
||||||
@@ -208,6 +209,7 @@ public class SettingsGateway {
|
|||||||
ChooseLockPassword.ChooseLockPasswordFragment.class.getName(),
|
ChooseLockPassword.ChooseLockPasswordFragment.class.getName(),
|
||||||
ChooseLockPattern.ChooseLockPatternFragment.class.getName(),
|
ChooseLockPattern.ChooseLockPatternFragment.class.getName(),
|
||||||
InstalledAppDetails.class.getName(),
|
InstalledAppDetails.class.getName(),
|
||||||
|
AppInfoDashboardFragment.class.getName(),
|
||||||
BatterySaverSettings.class.getName(),
|
BatterySaverSettings.class.getName(),
|
||||||
AppNotificationSettings.class.getName(),
|
AppNotificationSettings.class.getName(),
|
||||||
ChannelNotificationSettings.class.getName(),
|
ChannelNotificationSettings.class.getName(),
|
||||||
|
@@ -20,6 +20,7 @@ import android.os.Bundle;
|
|||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
@@ -31,6 +32,8 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.SettingsPreferenceFragment;
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
import com.android.settings.applications.AppStateBaseBridge;
|
import com.android.settings.applications.AppStateBaseBridge;
|
||||||
import com.android.settings.applications.InstalledAppDetails;
|
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.datausage.AppStateDataUsageBridge.DataUsageState;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.widget.AppSwitchPreference;
|
import com.android.settings.widget.AppSwitchPreference;
|
||||||
@@ -271,10 +274,17 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
|||||||
protected void onClick() {
|
protected void onClick() {
|
||||||
if (mState.isDataSaverBlacklisted) {
|
if (mState.isDataSaverBlacklisted) {
|
||||||
// app is blacklisted, launch App Data Usage screen
|
// app is blacklisted, launch App Data Usage screen
|
||||||
|
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,
|
InstalledAppDetails.startAppInfoFragment(AppDataUsage.class,
|
||||||
R.string.app_data_usage,
|
R.string.app_data_usage,
|
||||||
UnrestrictedDataAccess.this,
|
UnrestrictedDataAccess.this,
|
||||||
mEntry);
|
mEntry);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// app is not blacklisted, let superclass handle toggle switch
|
// app is not blacklisted, let superclass handle toggle switch
|
||||||
super.onClick();
|
super.onClick();
|
||||||
|
@@ -20,10 +20,13 @@ import android.support.annotation.VisibleForTesting;
|
|||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceCategory;
|
import android.support.v7.preference.PreferenceCategory;
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.applications.InstalledAppDetails;
|
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.settings.widget.AppPreference;
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
import com.android.settingslib.location.RecentLocationApps;
|
import com.android.settingslib.location.RecentLocationApps;
|
||||||
@@ -56,11 +59,19 @@ public class RecentLocationRequestPreferenceController extends LocationBasePrefe
|
|||||||
public boolean onPreferenceClick(Preference preference) {
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
// start new fragment to display extended information
|
// start new fragment to display extended information
|
||||||
final Bundle args = new Bundle();
|
final Bundle args = new Bundle();
|
||||||
|
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);
|
args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackage);
|
||||||
((SettingsActivity) mFragment.getActivity()).startPreferencePanelAsUser(
|
((SettingsActivity) mFragment.getActivity()).startPreferencePanelAsUser(
|
||||||
mFragment,
|
mFragment,
|
||||||
InstalledAppDetails.class.getName(), args,
|
InstalledAppDetails.class.getName(), args,
|
||||||
R.string.application_info_label, null, mUserHandle);
|
R.string.application_info_label, null, mUserHandle);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -32,6 +32,7 @@ import android.support.annotation.IntDef;
|
|||||||
import android.support.annotation.VisibleForTesting;
|
import android.support.annotation.VisibleForTesting;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -44,6 +45,8 @@ import com.android.settings.Utils;
|
|||||||
import com.android.settings.applications.AppInfoBase;
|
import com.android.settings.applications.AppInfoBase;
|
||||||
import com.android.settings.applications.InstalledAppDetails;
|
import com.android.settings.applications.InstalledAppDetails;
|
||||||
import com.android.settings.applications.LayoutPreference;
|
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.settings.overlay.FeatureFactory;
|
||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
@@ -272,11 +275,17 @@ public class EntityHeaderController {
|
|||||||
entityHeaderContent.setOnClickListener(new View.OnClickListener() {
|
entityHeaderContent.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
|
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(
|
AppInfoBase.startAppInfoFragment(
|
||||||
InstalledAppDetails.class, R.string.application_info_label,
|
InstalledAppDetails.class, R.string.application_info_label,
|
||||||
mPackageName, mUid, mFragment, 0 /* request */,
|
mPackageName, mUid, mFragment, 0 /* request */,
|
||||||
mMetricsCategory);
|
mMetricsCategory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
@@ -47,6 +47,7 @@ com.android.settings.applications.RunningServices
|
|||||||
com.android.settings.applications.ConfirmConvertToFbe
|
com.android.settings.applications.ConfirmConvertToFbe
|
||||||
com.android.settings.deviceinfo.PublicVolumeSettings
|
com.android.settings.deviceinfo.PublicVolumeSettings
|
||||||
com.android.settings.applications.InstalledAppDetails
|
com.android.settings.applications.InstalledAppDetails
|
||||||
|
com.android.settings.applications.AppInfoDashboardFragment
|
||||||
com.android.settings.accessibility.ToggleAccessibilityServicePreferenceFragment
|
com.android.settings.accessibility.ToggleAccessibilityServicePreferenceFragment
|
||||||
com.android.settings.print.PrintServiceSettingsFragment
|
com.android.settings.print.PrintServiceSettingsFragment
|
||||||
com.android.settings.wfd.WifiDisplaySettings
|
com.android.settings.wfd.WifiDisplaySettings
|
||||||
|
@@ -35,11 +35,14 @@ import android.support.v7.preference.Preference;
|
|||||||
import android.support.v7.preference.PreferenceCategory;
|
import android.support.v7.preference.PreferenceCategory;
|
||||||
import android.support.v7.preference.PreferenceScreen;
|
import android.support.v7.preference.PreferenceScreen;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
import com.android.settings.applications.InstalledAppDetails;
|
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.testutils.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.widget.AppPreference;
|
import com.android.settings.widget.AppPreference;
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
@@ -167,8 +170,15 @@ public class RecentLocationRequestPreferenceControllerTest {
|
|||||||
|
|
||||||
preference.performClick();
|
preference.performClick();
|
||||||
|
|
||||||
verify(activity).startPreferencePanelAsUser(any(), eq(InstalledAppDetails.class.getName()),
|
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.APP_INFO_V2)) {
|
||||||
|
verify(activity).startPreferencePanelAsUser(any(),
|
||||||
|
eq(AppInfoDashboardFragment.class.getName()),
|
||||||
any(Bundle.class), anyInt(), any(), any());
|
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) {
|
private static ArgumentMatcher<Preference> titleMatches(String expected) {
|
||||||
|
Reference in New Issue
Block a user