Log source with visibility change

- Add a method in VisibilityLoggerMixin to log visible event using
  LogMaker, which allows logging additional FIELD_CONTEXT field.
- In Utils.startFragment, add current page's metricsCategory as an extra
  to next page.
- In next page's onResume(), extract the previous page's metricsCategory
  and send it to VisibilityLoggerMixin.visible()
- Update all caller with additional paramters

Change-Id: I8e1f2597fa465b7d3aa16fa1d21c052a3219694a
Fix: 35359289
Test: RunSettingsRoboTests
This commit is contained in:
Fan Zhang
2017-02-14 15:02:35 -08:00
parent 358eab0fff
commit c6ca314c0b
64 changed files with 347 additions and 215 deletions

View File

@@ -400,6 +400,7 @@
<!-- hiding for now. <!-- hiding for now.
<Preference <Preference
android:key="background_check" android:key="background_check"
android:fragment="com.android.settings.applications.BackgroundCheckSummary"
android:title="@string/background_check_pref" /> android:title="@string/background_check_pref" />
--> -->
@@ -410,7 +411,8 @@
<Preference <Preference
android:key="inactive_apps" android:key="inactive_apps"
android:title="@string/inactive_apps_title" /> android:title="@string/inactive_apps_title"
android:fragment="com.android.settings.fuelgauge.InactiveApps"/>
<SwitchPreference <SwitchPreference
android:key="force_allow_on_external" android:key="force_allow_on_external"

View File

@@ -28,6 +28,7 @@ import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.InstalledAppDetails; import com.android.settings.applications.InstalledAppDetails;
@@ -88,7 +89,7 @@ public class AppHeader {
if (includeAppInfo) { if (includeAppInfo) {
AppInfoBase.startAppInfoFragment(InstalledAppDetails.class, AppInfoBase.startAppInfoFragment(InstalledAppDetails.class,
R.string.application_info_label, pkgName, uid, activity, R.string.application_info_label, pkgName, uid, activity,
INSTALLED_APP_DETAILS); INSTALLED_APP_DETAILS, MetricsProto.MetricsEvent.VIEW_UNKNOWN);
} else { } else {
activity.finish(); activity.finish();
} }

View File

@@ -567,7 +567,8 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
void addDashboardCategoryPreferences() { void addDashboardCategoryPreferences() {
final PreferenceScreen screen = getPreferenceScreen(); final PreferenceScreen screen = getPreferenceScreen();
final List<Preference> tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory( final List<Preference> tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory(
getActivity(), getPrefContext(), CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT); getActivity(), getPrefContext(), getMetricsCategory(),
CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT);
if (tilePrefs != null) { if (tilePrefs != null) {
for (Preference preference : tilePrefs) { for (Preference preference : tilePrefs) {
screen.addPreference(preference); screen.addPreference(preference);
@@ -2469,10 +2470,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
writeUSBAudioOptions(); writeUSBAudioOptions();
} else if (preference == mForceResizable) { } else if (preference == mForceResizable) {
writeForceResizableOptions(); writeForceResizableOptions();
} else if (INACTIVE_APPS_KEY.equals(preference.getKey())) {
startInactiveAppsFragment();
} else if (BACKGROUND_CHECK_KEY.equals(preference.getKey())) {
startBackgroundCheckFragment();
} else if (preference == mBluetoothDisableAbsVolume) { } else if (preference == mBluetoothDisableAbsVolume) {
writeBluetoothDisableAbsVolumeOptions(); writeBluetoothDisableAbsVolumeOptions();
} else if (preference == mWebViewMultiprocess) { } else if (preference == mWebViewMultiprocess) {
@@ -2486,18 +2483,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
return false; return false;
} }
private void startInactiveAppsFragment() {
((SettingsActivity) getActivity()).startPreferencePanel(
InactiveApps.class.getName(),
null, R.string.inactive_apps_title, null, null, 0);
}
private void startBackgroundCheckFragment() {
((SettingsActivity) getActivity()).startPreferencePanel(
BackgroundCheckSummary.class.getName(),
null, R.string.background_check_title, null, null, 0);
}
private boolean showKeyguardConfirmation(Resources resources, int requestCode) { private boolean showKeyguardConfirmation(Resources resources, int requestCode) {
return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity( return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(
requestCode, resources.getString(R.string.oem_unlock_enable)); requestCode, resources.getString(R.string.oem_unlock_enable));

View File

@@ -118,7 +118,8 @@ public class MasterClear extends OptionsMenuFragment
private void showFinalConfirmation() { private void showFinalConfirmation() {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked()); args.putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked());
((SettingsActivity) getActivity()).startPreferencePanel(MasterClearConfirm.class.getName(), ((SettingsActivity) getActivity()).startPreferencePanel(
this, MasterClearConfirm.class.getName(),
args, R.string.master_clear_confirm_title, null, null, 0); args, R.string.master_clear_confirm_title, null, null, 0);
} }

View File

@@ -98,7 +98,8 @@ public class ResetNetwork extends OptionsMenuFragment {
SubscriptionInfo subscription = mSubscriptions.get(selectedIndex); SubscriptionInfo subscription = mSubscriptions.get(selectedIndex);
args.putInt(PhoneConstants.SUBSCRIPTION_KEY, subscription.getSubscriptionId()); args.putInt(PhoneConstants.SUBSCRIPTION_KEY, subscription.getSubscriptionId());
} }
((SettingsActivity) getActivity()).startPreferencePanel(ResetNetworkConfirm.class.getName(), ((SettingsActivity) getActivity()).startPreferencePanel(
this, ResetNetworkConfirm.class.getName(),
args, R.string.reset_network_confirm_title, null, null, 0); args, R.string.reset_network_confirm_title, null, null, 0);
} }

View File

@@ -414,7 +414,8 @@ public class SecuritySettings extends SettingsPreferenceFragment
(PreferenceGroup) root.findPreference(KEY_SECURITY_STATUS); (PreferenceGroup) root.findPreference(KEY_SECURITY_STATUS);
if (mDashboardFeatureProvider.isEnabled()) { if (mDashboardFeatureProvider.isEnabled()) {
final List<Preference> tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory( final List<Preference> tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory(
getActivity(), getPrefContext(), CategoryKey.CATEGORY_SECURITY); getActivity(), getPrefContext(), getMetricsCategory(),
CategoryKey.CATEGORY_SECURITY);
int numSecurityStatusPrefs = 0; int numSecurityStatusPrefs = 0;
if (tilePrefs != null && !tilePrefs.isEmpty()) { if (tilePrefs != null && !tilePrefs.isEmpty()) {
for (Preference preference : tilePrefs) { for (Preference preference : tilePrefs) {

View File

@@ -56,6 +56,7 @@ import com.android.internal.util.ArrayUtils;
import com.android.settings.Settings.WifiSettingsActivity; import com.android.settings.Settings.WifiSettingsActivity;
import com.android.settings.backup.BackupSettingsActivity; import com.android.settings.backup.BackupSettingsActivity;
import com.android.settings.core.gateway.SettingsGateway; import com.android.settings.core.gateway.SettingsGateway;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.core.instrumentation.SharedPreferencesLogger; import com.android.settings.core.instrumentation.SharedPreferencesLogger;
import com.android.settings.dashboard.DashboardContainerFragment; import com.android.settings.dashboard.DashboardContainerFragment;
import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider;
@@ -100,6 +101,11 @@ public class SettingsActivity extends SettingsDrawerActivity
*/ */
public static final String EXTRA_SHOW_FRAGMENT = ":settings:show_fragment"; public static final String EXTRA_SHOW_FRAGMENT = ":settings:show_fragment";
/**
* The metrics category constant for logging source when a setting fragment is opened.
*/
public static final String EXTRA_SOURCE_METRICS_CATEGORY = ":settings:source_metrics";
/** /**
* When starting this activity and using {@link #EXTRA_SHOW_FRAGMENT}, * When starting this activity and using {@link #EXTRA_SHOW_FRAGMENT},
* this extra can also be specified to supply a Bundle of arguments to pass * this extra can also be specified to supply a Bundle of arguments to pass
@@ -220,6 +226,7 @@ public class SettingsActivity extends SettingsDrawerActivity
private boolean mSearchMenuItemExpanded = false; private boolean mSearchMenuItemExpanded = false;
private SearchResultsSummary mSearchResultsFragment; private SearchResultsSummary mSearchResultsFragment;
private SearchFeatureProvider mSearchFeatureProvider; private SearchFeatureProvider mSearchFeatureProvider;
private MetricsFeatureProvider mMetricsFeatureProvider;
// Categories // Categories
private ArrayList<DashboardCategory> mCategories = new ArrayList<>(); private ArrayList<DashboardCategory> mCategories = new ArrayList<>();
@@ -239,7 +246,7 @@ public class SettingsActivity extends SettingsDrawerActivity
@Override @Override
public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) { public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
startPreferencePanel(pref.getFragment(), pref.getExtras(), -1, pref.getTitle(), startPreferencePanel(caller, pref.getFragment(), pref.getExtras(), -1, pref.getTitle(),
null, 0); null, 0);
return true; return true;
} }
@@ -350,6 +357,7 @@ public class SettingsActivity extends SettingsDrawerActivity
mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this); mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this);
mSearchFeatureProvider = factory.getSearchFeatureProvider(); mSearchFeatureProvider = factory.getSearchFeatureProvider();
mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
// Should happen before any call to getIntent() // Should happen before any call to getIntent()
getMetaData(); getMetaData();
@@ -748,8 +756,8 @@ public class SettingsActivity extends SettingsDrawerActivity
* @param resultRequestCode If resultTo is non-null, this is the caller's * @param resultRequestCode If resultTo is non-null, this is the caller's
* request code to be received with the result. * request code to be received with the result.
*/ */
public void startPreferencePanel(String fragmentClass, Bundle args, int titleRes, public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args,
CharSequence titleText, Fragment resultTo, int resultRequestCode) { int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) {
String title = null; String title = null;
if (titleRes < 0) { if (titleRes < 0) {
if (titleText != null) { if (titleText != null) {
@@ -760,7 +768,7 @@ public class SettingsActivity extends SettingsDrawerActivity
} }
} }
Utils.startWithFragment(this, fragmentClass, args, resultTo, resultRequestCode, Utils.startWithFragment(this, fragmentClass, args, resultTo, resultRequestCode,
titleRes, title, mIsShortcut); titleRes, title, mIsShortcut, mMetricsFeatureProvider.getMetricsCategory(caller));
} }
/** /**
@@ -775,8 +783,8 @@ public class SettingsActivity extends SettingsDrawerActivity
* @param titleText Optional text of the title of this fragment. * @param titleText Optional text of the title of this fragment.
* @param userHandle The user for which the panel has to be started. * @param userHandle The user for which the panel has to be started.
*/ */
public void startPreferencePanelAsUser(String fragmentClass, Bundle args, int titleRes, public void startPreferencePanelAsUser(Fragment caller, String fragmentClass,
CharSequence titleText, UserHandle userHandle) { Bundle args, int titleRes, CharSequence titleText, UserHandle userHandle) {
// This is a workaround. // This is a workaround.
// //
// Calling startWithFragmentAsUser() without specifying FLAG_ACTIVITY_NEW_TASK to the intent // Calling startWithFragmentAsUser() without specifying FLAG_ACTIVITY_NEW_TASK to the intent
@@ -788,7 +796,7 @@ public class SettingsActivity extends SettingsDrawerActivity
// another check here to call startPreferencePanel() instead of startWithFragmentAsUser() // another check here to call startPreferencePanel() instead of startWithFragmentAsUser()
// when we're calling it as the same user. // when we're calling it as the same user.
if (userHandle.getIdentifier() == UserHandle.myUserId()) { if (userHandle.getIdentifier() == UserHandle.myUserId()) {
startPreferencePanel(fragmentClass, args, titleRes, titleText, null, 0); startPreferencePanel(caller, fragmentClass, args, titleRes, titleText, null, 0);
} else { } else {
String title = null; String title = null;
if (titleRes < 0) { if (titleRes < 0) {
@@ -799,8 +807,8 @@ public class SettingsActivity extends SettingsDrawerActivity
title = ""; title = "";
} }
} }
Utils.startWithFragmentAsUser(this, fragmentClass, args, Utils.startWithFragmentAsUser(this, fragmentClass, args, titleRes, title,
titleRes, title, mIsShortcut, userHandle); mIsShortcut, mMetricsFeatureProvider.getMetricsCategory(caller), userHandle);
} }
} }

View File

@@ -732,7 +732,8 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF
final Activity activity = getActivity(); final Activity activity = getActivity();
if (activity instanceof SettingsActivity) { if (activity instanceof SettingsActivity) {
SettingsActivity sa = (SettingsActivity) activity; SettingsActivity sa = (SettingsActivity) activity;
sa.startPreferencePanel(fragmentClass, extras, titleRes, null, caller, requestCode); sa.startPreferencePanel(
caller, fragmentClass, extras, titleRes, null, caller, requestCode);
return true; return true;
} else { } else {
Log.w(TAG, Log.w(TAG,

View File

@@ -215,7 +215,7 @@ public class UserDictionarySettings extends ListFragment implements Instrumentab
args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut); args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut);
args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale); args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale);
SettingsActivity sa = (SettingsActivity) getActivity(); SettingsActivity sa = (SettingsActivity) getActivity();
sa.startPreferencePanel( sa.startPreferencePanel(this,
com.android.settings.inputmethod.UserDictionaryAddWordFragment.class.getName(), com.android.settings.inputmethod.UserDictionaryAddWordFragment.class.getName(),
args, R.string.user_dict_settings_add_dialog_title, null, null, 0); args, R.string.user_dict_settings_add_dialog_title, null, null, 0);
} }

View File

@@ -252,7 +252,6 @@ public final class Utils extends com.android.settingslib.Utils {
/** /**
* Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6 style * Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6 style
* addresses. * addresses.
* @param context the application context
* @return the formatted and newline-separated IP addresses, or null if none. * @return the formatted and newline-separated IP addresses, or null if none.
*/ */
public static String getDefaultIpAddresses(ConnectivityManager cm) { public static String getDefaultIpAddresses(ConnectivityManager cm) {
@@ -496,12 +495,14 @@ public final class Utils extends com.android.settingslib.Utils {
* @param titleResId resource id for the String to display for the title of this set * @param titleResId resource id for the String to display for the title of this set
* of preferences. * of preferences.
* @param title String to display for the title of this set of preferences. * @param title String to display for the title of this set of preferences.
* @param metricsCategory The current metricsCategory for logging source when fragment starts
*/ */
public static void startWithFragment(Context context, String fragmentName, Bundle args, public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, int titleResId, Fragment resultTo, int resultRequestCode, int titleResId,
CharSequence title) { CharSequence title, int metricsCategory) {
startWithFragment(context, fragmentName, args, resultTo, resultRequestCode, startWithFragment(context, fragmentName, args, resultTo, resultRequestCode,
null /* titleResPackageName */, titleResId, title, false /* not a shortcut */); null /* titleResPackageName */, titleResId, title, false /* not a shortcut */,
metricsCategory);
} }
/** /**
@@ -519,19 +520,21 @@ public final class Utils extends com.android.settingslib.Utils {
* @param titleResId resource id for the String to display for the title of this set * @param titleResId resource id for the String to display for the title of this set
* of preferences. * of preferences.
* @param title String to display for the title of this set of preferences. * @param title String to display for the title of this set of preferences.
* @param metricsCategory The current metricsCategory for logging source when fragment starts
*/ */
public static void startWithFragment(Context context, String fragmentName, Bundle args, public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId, Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
CharSequence title) { CharSequence title, int metricsCategory) {
startWithFragment(context, fragmentName, args, resultTo, resultRequestCode, startWithFragment(context, fragmentName, args, resultTo, resultRequestCode,
titleResPackageName, titleResId, title, false /* not a shortcut */); titleResPackageName, titleResId, title, false /* not a shortcut */,
metricsCategory);
} }
public static void startWithFragment(Context context, String fragmentName, Bundle args, public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, int titleResId, Fragment resultTo, int resultRequestCode, int titleResId,
CharSequence title, boolean isShortcut) { CharSequence title, boolean isShortcut, int metricsCategory) {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, Intent intent = onBuildStartFragmentIntent(context, fragmentName, args,
null /* titleResPackageName */, titleResId, title, isShortcut); null /* titleResPackageName */, titleResId, title, isShortcut, metricsCategory);
if (resultTo == null) { if (resultTo == null) {
context.startActivity(intent); context.startActivity(intent);
} else { } else {
@@ -541,9 +544,9 @@ public final class Utils extends com.android.settingslib.Utils {
public static void startWithFragment(Context context, String fragmentName, Bundle args, public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId, Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
CharSequence title, boolean isShortcut) { CharSequence title, boolean isShortcut, int metricsCategory) {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResPackageName, Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResPackageName,
titleResId, title, isShortcut); titleResId, title, isShortcut, metricsCategory);
if (resultTo == null) { if (resultTo == null) {
context.startActivity(intent); context.startActivity(intent);
} else { } else {
@@ -552,30 +555,15 @@ public final class Utils extends com.android.settingslib.Utils {
} }
public static void startWithFragmentAsUser(Context context, String fragmentName, Bundle args, public static void startWithFragmentAsUser(Context context, String fragmentName, Bundle args,
int titleResId, CharSequence title, boolean isShortcut, int titleResId, CharSequence title, boolean isShortcut, int metricsCategory,
UserHandle userHandle) { UserHandle userHandle) {
// workaround to avoid crash in b/17523189 // workaround to avoid crash in b/17523189
if (userHandle.getIdentifier() == UserHandle.myUserId()) { if (userHandle.getIdentifier() == UserHandle.myUserId()) {
startWithFragment(context, fragmentName, args, null, 0, titleResId, title, isShortcut); startWithFragment(context, fragmentName, args, null, 0, titleResId, title, isShortcut,
metricsCategory);
} else { } else {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, Intent intent = onBuildStartFragmentIntent(context, fragmentName, args,
null /* titleResPackageName */, titleResId, title, isShortcut); null /* titleResPackageName */, titleResId, title, isShortcut, metricsCategory);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivityAsUser(intent, userHandle);
}
}
public static void startWithFragmentAsUser(Context context, String fragmentName, Bundle args,
String titleResPackageName, int titleResId, CharSequence title, boolean isShortcut,
UserHandle userHandle) {
// workaround to avoid crash in b/17523189
if (userHandle.getIdentifier() == UserHandle.myUserId()) {
startWithFragment(context, fragmentName, args, null, 0, titleResPackageName, titleResId,
title, isShortcut);
} else {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args,
titleResPackageName, titleResId, title, isShortcut);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivityAsUser(intent, userHandle); context.startActivityAsUser(intent, userHandle);
@@ -595,12 +583,13 @@ public final class Utils extends com.android.settingslib.Utils {
* @param titleResId Optional title resource id to show for this item. * @param titleResId Optional title resource id to show for this item.
* @param title Optional title to show for this item. * @param title Optional title to show for this item.
* @param isShortcut tell if this is a Launcher Shortcut or not * @param isShortcut tell if this is a Launcher Shortcut or not
* @param sourceMetricsCategory The context (source) from which an action is performed
* @return Returns an Intent that can be launched to display the given * @return Returns an Intent that can be launched to display the given
* fragment. * fragment.
*/ */
public static Intent onBuildStartFragmentIntent(Context context, String fragmentName, public static Intent onBuildStartFragmentIntent(Context context, String fragmentName,
Bundle args, String titleResPackageName, int titleResId, CharSequence title, Bundle args, String titleResPackageName, int titleResId, CharSequence title,
boolean isShortcut) { boolean isShortcut, int sourceMetricsCategory) {
Intent intent = new Intent(Intent.ACTION_MAIN); Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClass(context, SubSettings.class); intent.setClass(context, SubSettings.class);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, fragmentName); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, fragmentName);
@@ -610,6 +599,7 @@ public final class Utils extends com.android.settingslib.Utils {
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, titleResId); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, titleResId);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut);
intent.putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory);
return intent; return intent;
} }
@@ -1197,15 +1187,6 @@ public final class Utils extends com.android.settingslib.Utils {
return null; return null;
} }
public static boolean isPackageEnabled(Context context, String packageName) {
try {
return context.getPackageManager().getApplicationInfo(packageName, 0).enabled;
} catch (NameNotFoundException e) {
// Thrown by PackageManager.getApplicationInfo if the package does not exist
}
return false;
}
public static boolean isPackageDirectBootAware(Context context, String packageName) { public static boolean isPackageDirectBootAware(Context context, String packageName) {
try { try {
final ApplicationInfo ai = context.getPackageManager().getApplicationInfo( final ApplicationInfo ai = context.getPackageManager().getApplicationInfo(

View File

@@ -85,8 +85,8 @@ public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivit
} }
@Override @Override
public void startPreferencePanel(String fragmentClass, Bundle args, int titleRes, public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args,
CharSequence titleText, Fragment resultTo, int resultRequestCode) { int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) {
// Set the title. // Set the title.
if (!TextUtils.isEmpty(titleText)) { if (!TextUtils.isEmpty(titleText)) {
setTitle(titleText); setTitle(titleText);

View File

@@ -45,6 +45,7 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.core.lifecycle.LifecycleObserver; import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.core.lifecycle.events.OnPause; import com.android.settings.core.lifecycle.events.OnPause;
import com.android.settings.core.lifecycle.events.OnResume; import com.android.settings.core.lifecycle.events.OnResume;
@@ -89,6 +90,7 @@ public class AccountPreferenceController extends PreferenceController
private int mAccountProfileOrder = ORDER_ACCOUNT_PROFILES; private int mAccountProfileOrder = ORDER_ACCOUNT_PROFILES;
private AccountRestrictionHelper mHelper; private AccountRestrictionHelper mHelper;
private DashboardFeatureProvider mDashboardFeatureProvider; private DashboardFeatureProvider mDashboardFeatureProvider;
private MetricsFeatureProvider mMetricsFeatureProvider;
/** /**
* Holds data related to the accounts belonging to one profile. * Holds data related to the accounts belonging to one profile.
@@ -135,8 +137,9 @@ public class AccountPreferenceController extends PreferenceController
if (mAuthorities != null) { if (mAuthorities != null) {
mAuthoritiesCount = mAuthorities.length; mAuthoritiesCount = mAuthorities.length;
} }
mDashboardFeatureProvider = final FeatureFactory featureFactory = FeatureFactory.getFactory(mContext);
FeatureFactory.getFactory(mContext).getDashboardFeatureProvider(mContext); mDashboardFeatureProvider = featureFactory.getDashboardFeatureProvider(mContext);
mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
mIAEnabled = mDashboardFeatureProvider.isEnabled(); mIAEnabled = mDashboardFeatureProvider.isEnabled();
mHelper = helper; mHelper = helper;
} }
@@ -235,7 +238,7 @@ public class AccountPreferenceController extends PreferenceController
if (preference == profileData.managedProfilePreference) { if (preference == profileData.managedProfilePreference) {
Bundle arguments = new Bundle(); Bundle arguments = new Bundle();
arguments.putParcelable(Intent.EXTRA_USER, profileData.userInfo.getUserHandle()); arguments.putParcelable(Intent.EXTRA_USER, profileData.userInfo.getUserHandle());
((SettingsActivity) mParent.getActivity()).startPreferencePanel( ((SettingsActivity) mParent.getActivity()).startPreferencePanel(mParent,
ManagedProfileSettings.class.getName(), arguments, ManagedProfileSettings.class.getName(), arguments,
R.string.managed_profile_settings_title, null, null, 0); R.string.managed_profile_settings_title, null, null, 0);
return true; return true;
@@ -446,7 +449,7 @@ public class AccountPreferenceController extends PreferenceController
UserHandle userHandle) { UserHandle userHandle) {
final String[] accountTypes = helper.getEnabledAccountTypes(); final String[] accountTypes = helper.getEnabledAccountTypes();
final ArrayList<AccountTypePreference> accountTypePreferences = final ArrayList<AccountTypePreference> accountTypePreferences =
new ArrayList<AccountTypePreference>(accountTypes.length); new ArrayList<>(accountTypes.length);
for (int i = 0; i < accountTypes.length; i++) { for (int i = 0; i < accountTypes.length; i++) {
final String accountType = accountTypes[i]; final String accountType = accountTypes[i];
@@ -489,7 +492,8 @@ public class AccountPreferenceController extends PreferenceController
titleResId); titleResId);
fragmentArguments.putParcelable(EXTRA_USER, userHandle); fragmentArguments.putParcelable(EXTRA_USER, userHandle);
accountTypePreferences.add(new AccountTypePreference( accountTypePreferences.add(new AccountTypePreference(
prefContext, account.name, titleResPackageName, titleResId, label, prefContext, mMetricsFeatureProvider.getMetricsCategory(mParent),
account.name, titleResPackageName, titleResId, label,
AccountDetailDashboardFragment.class.getName(), fragmentArguments, icon)); AccountDetailDashboardFragment.class.getName(), fragmentArguments, icon));
} }
} else if (skipToAccount) { } else if (skipToAccount) {
@@ -499,8 +503,9 @@ public class AccountPreferenceController extends PreferenceController
fragmentArguments.putParcelable(EXTRA_USER, userHandle); fragmentArguments.putParcelable(EXTRA_USER, userHandle);
accountTypePreferences.add(new AccountTypePreference( accountTypePreferences.add(new AccountTypePreference(
prefContext, label, titleResPackageName, prefContext, mMetricsFeatureProvider.getMetricsCategory(mParent),
titleResId, AccountSyncSettings.class.getName(), fragmentArguments, icon)); label, titleResPackageName, titleResId, AccountSyncSettings.class.getName(),
fragmentArguments, icon));
} else { } else {
final Bundle fragmentArguments = new Bundle(); final Bundle fragmentArguments = new Bundle();
fragmentArguments.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE, accountType); fragmentArguments.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE, accountType);
@@ -509,9 +514,9 @@ public class AccountPreferenceController extends PreferenceController
fragmentArguments.putParcelable(EXTRA_USER, userHandle); fragmentArguments.putParcelable(EXTRA_USER, userHandle);
accountTypePreferences.add(new AccountTypePreference( accountTypePreferences.add(new AccountTypePreference(
prefContext, mMetricsFeatureProvider.getMetricsCategory(mParent), label,
prefContext, label, titleResPackageName, titleResPackageName, titleResId, ManageAccountsSettings.class.getName(),
titleResId, ManageAccountsSettings.class.getName(), fragmentArguments, icon)); fragmentArguments, icon));
} }
helper.preloadDrawableForType(mContext, accountType); helper.preloadDrawableForType(mContext, accountType);
} }

View File

@@ -24,6 +24,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 com.android.internal.logging.nano.MetricsProto;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
@@ -53,7 +54,7 @@ public class AccountSyncPreferenceController extends PreferenceController {
args.putParcelable(AccountSyncSettings.ACCOUNT_KEY, mAccount); args.putParcelable(AccountSyncSettings.ACCOUNT_KEY, mAccount);
args.putParcelable(EXTRA_USER, mUserHandle); args.putParcelable(EXTRA_USER, mUserHandle);
Utils.startWithFragment(mContext, AccountSyncSettings.class.getName(), args, null, 0, -1, Utils.startWithFragment(mContext, AccountSyncSettings.class.getName(), args, null, 0, -1,
mAccount.name); mAccount.name, MetricsProto.MetricsEvent.ACCOUNT);
return true; return true;
} }

View File

@@ -65,15 +65,18 @@ public class AccountTypePreference extends Preference implements OnPreferenceCli
*/ */
private final Bundle mFragmentArguments; private final Bundle mFragmentArguments;
public AccountTypePreference(Context context, CharSequence title, String titleResPackageName, private final int mMetricsCategory;
int titleResId, String fragment, Bundle fragmentArguments, Drawable icon) {
this(context, title, titleResPackageName, titleResId, null, fragment, fragmentArguments, public AccountTypePreference(Context context, int metricsCategory, CharSequence title,
icon); String titleResPackageName, int titleResId, String fragment, Bundle fragmentArguments,
Drawable icon) {
this(context, metricsCategory, title, titleResPackageName, titleResId, null, fragment,
fragmentArguments, icon);
} }
public AccountTypePreference(Context context, CharSequence title, String titleResPackageName, public AccountTypePreference(Context context, int metricsCategory, CharSequence title,
int titleResId, CharSequence summary, String fragment, Bundle fragmentArguments, String titleResPackageName, int titleResId, CharSequence summary, String fragment,
Drawable icon) { Bundle fragmentArguments, Drawable icon) {
super(context); super(context);
mTitle = title; mTitle = title;
mTitleResPackageName = titleResPackageName; mTitleResPackageName = titleResPackageName;
@@ -81,6 +84,7 @@ public class AccountTypePreference extends Preference implements OnPreferenceCli
mSummary = summary; mSummary = summary;
mFragment = fragment; mFragment = fragment;
mFragmentArguments = fragmentArguments; mFragmentArguments = fragmentArguments;
mMetricsCategory = metricsCategory;
setWidgetLayoutResource(R.layout.account_type_preference); setWidgetLayoutResource(R.layout.account_type_preference);
setTitle(title); setTitle(title);
@@ -105,7 +109,7 @@ public class AccountTypePreference extends Preference implements OnPreferenceCli
} }
Utils.startWithFragment(getContext(), mFragment, mFragmentArguments, Utils.startWithFragment(getContext(), mFragment, mFragmentArguments,
null /* resultTo */, 0 /* resultRequestCode */, mTitleResPackageName, null /* resultTo */, 0 /* resultRequestCode */, mTitleResPackageName,
mTitleResId, null /* title */); mTitleResId, null /* title */, mMetricsCategory);
return true; return true;
} }
return false; return false;

View File

@@ -229,7 +229,7 @@ public class AccountTypePreferenceLoader {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
((SettingsActivity) mFragment.getActivity()).startPreferencePanel( ((SettingsActivity) mFragment.getActivity()).startPreferencePanel(mFragment,
mClass, null, mTitleRes, null, null, 0); mClass, null, mTitleRes, null, null, 0);
// Hack: announce that the Google account preferences page is launching the location // Hack: announce that the Google account preferences page is launching the location
// settings // settings

View File

@@ -158,7 +158,7 @@ public class ManageAccountsSettings extends AccountPreferenceBase
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putParcelable(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount()); args.putParcelable(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount());
args.putParcelable(EXTRA_USER, mUserHandle); args.putParcelable(EXTRA_USER, mUserHandle);
((SettingsActivity) getActivity()).startPreferencePanel( ((SettingsActivity) getActivity()).startPreferencePanel(this,
AccountSyncSettings.class.getCanonicalName(), args, AccountSyncSettings.class.getCanonicalName(), args,
R.string.account_sync_settings_title, acctPref.getAccount().name, R.string.account_sync_settings_title, acctPref.getAccount().name,
this, REQUEST_SHOW_SYNC_SETTINGS); this, REQUEST_SHOW_SYNC_SETTINGS);

View File

@@ -38,6 +38,7 @@ import com.android.settings.AppHeader;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.applications.instantapps.InstantAppDetails; import com.android.settings.applications.instantapps.InstantAppDetails;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@@ -65,6 +66,7 @@ public class AppHeaderController {
private final Context mContext; private final Context mContext;
private final Fragment mFragment; private final Fragment mFragment;
private final int mMetricsCategory;
private final View mAppHeader; private final View mAppHeader;
private Drawable mIcon; private Drawable mIcon;
@@ -84,6 +86,8 @@ public class AppHeaderController {
public AppHeaderController(Context context, Fragment fragment, View appHeader) { public AppHeaderController(Context context, Fragment fragment, View appHeader) {
mContext = context; mContext = context;
mFragment = fragment; mFragment = fragment;
mMetricsCategory = FeatureFactory.getFactory(context).getMetricsFeatureProvider()
.getMetricsCategory(fragment);
if (appHeader != null) { if (appHeader != null) {
mAppHeader = appHeader; mAppHeader = appHeader;
} else { } else {
@@ -266,7 +270,7 @@ public class AppHeaderController {
button.setImageResource(com.android.settings.R.drawable.ic_info); button.setImageResource(com.android.settings.R.drawable.ic_info);
button.setOnClickListener(v -> AppInfoBase.startAppInfoFragment( button.setOnClickListener(v -> AppInfoBase.startAppInfoFragment(
InstalledAppDetails.class, R.string.application_info_label, InstalledAppDetails.class, R.string.application_info_label,
mPackageName, mUid, mFragment, 0)); mPackageName, mUid, mFragment, 0 /* request */, mMetricsCategory));
button.setVisibility(View.VISIBLE); button.setVisibility(View.VISIBLE);
} }
return; return;

View File

@@ -215,18 +215,19 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
} }
public static void startAppInfoFragment(Class<?> fragment, int titleRes, public static void startAppInfoFragment(Class<?> fragment, int titleRes,
String pkg, int uid, Fragment source, int request) { String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) {
startAppInfoFragment(fragment, titleRes, pkg, uid, source.getActivity(), request); startAppInfoFragment(fragment, titleRes, pkg, uid, source.getActivity(), request,
sourceMetricsCategory);
} }
public static void startAppInfoFragment(Class<?> fragment, int titleRes, public static void startAppInfoFragment(Class<?> fragment, int titleRes,
String pkg, int uid, Activity source, int request) { String pkg, int uid, Activity source, int request, int sourceMetricsCategory) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg); args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg);
args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid); args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid);
Intent intent = Utils.onBuildStartFragmentIntent(source, fragment.getName(), Intent intent = Utils.onBuildStartFragmentIntent(source, fragment.getName(),
args, null, titleRes, null, false); args, null, titleRes, null, false, sourceMetricsCategory);
source.startActivityForResultAsUser(intent, request, source.startActivityForResultAsUser(intent, request,
new UserHandle(UserHandle.getUserId(uid))); new UserHandle(UserHandle.getUserId(uid)));
} }

View File

@@ -358,7 +358,7 @@ public class AppOpsCategory extends ListFragment implements
args.putString(AppOpsDetails.ARG_PACKAGE_NAME, mCurrentPkgName); args.putString(AppOpsDetails.ARG_PACKAGE_NAME, mCurrentPkgName);
SettingsActivity sa = (SettingsActivity) getActivity(); SettingsActivity sa = (SettingsActivity) getActivity();
sa.startPreferencePanel(AppOpsDetails.class.getName(), args, sa.startPreferencePanel(this, AppOpsDetails.class.getName(), args,
R.string.app_ops_settings, null, this, RESULT_APP_DETAILS); R.string.app_ops_settings, null, this, RESULT_APP_DETAILS);
} }

View File

@@ -19,11 +19,8 @@ package com.android.settings.applications;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ComponentInfo; import android.content.pm.ComponentInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;

View File

@@ -79,7 +79,7 @@ public class ConvertToFbe extends SettingsPreferenceFragment {
private void convert() { private void convert() {
SettingsActivity sa = (SettingsActivity) getActivity(); SettingsActivity sa = (SettingsActivity) getActivity();
sa.startPreferencePanel(ConfirmConvertToFbe.class.getName(), null, sa.startPreferencePanel(this, ConfirmConvertToFbe.class.getName(), null,
R.string.convert_to_file_encryption, null, null, 0); R.string.convert_to_file_encryption, null, null, 0);
} }

View File

@@ -811,7 +811,8 @@ public class InstalledAppDetails extends AppInfoBase
args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true);
SettingsActivity sa = (SettingsActivity) caller.getActivity(); SettingsActivity sa = (SettingsActivity) caller.getActivity();
sa.startPreferencePanel(fragment.getName(), args, -1, title, caller, SUB_INFO_FRAGMENT); sa.startPreferencePanel(caller, fragment.getName(), args, -1, title, caller,
SUB_INFO_FRAGMENT);
} }
/* /*
@@ -896,7 +897,7 @@ public class InstalledAppDetails extends AppInfoBase
startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage)); startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage));
} else if (preference == mBatteryPreference) { } else if (preference == mBatteryPreference) {
BatteryEntry entry = new BatteryEntry(getActivity(), null, mUserManager, mSipper); BatteryEntry entry = new BatteryEntry(getActivity(), null, mUserManager, mSipper);
PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this,
mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true, false); mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true, false);
} else { } else {
return false; return false;

View File

@@ -17,7 +17,6 @@
package com.android.settings.applications; package com.android.settings.applications;
import android.app.Activity; import android.app.Activity;
import android.app.usage.StorageStatsManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
@@ -33,7 +32,6 @@ import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.preference.PreferenceFrameLayout; import android.preference.PreferenceFrameLayout;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
@@ -564,7 +562,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment
private void startAppInfoFragment(Class<?> fragment, int titleRes) { private void startAppInfoFragment(Class<?> fragment, int titleRes) {
AppInfoBase.startAppInfoFragment(fragment, titleRes, mCurrentPkgName, mCurrentUid, this, AppInfoBase.startAppInfoFragment(fragment, titleRes, mCurrentPkgName, mCurrentUid, this,
INSTALLED_APP_DETAILS); INSTALLED_APP_DETAILS, getMetricsCategory());
} }
@Override @Override
@@ -631,11 +629,11 @@ public class ManageApplications extends InstrumentedPreferenceFragment
return true; return true;
case R.id.advanced: case R.id.advanced:
if (mListType == LIST_TYPE_NOTIFICATION) { if (mListType == LIST_TYPE_NOTIFICATION) {
((SettingsActivity) getActivity()).startPreferencePanel( ((SettingsActivity) getActivity()).startPreferencePanel(this,
ConfigureNotificationSettings.class.getName(), null, ConfigureNotificationSettings.class.getName(), null,
R.string.configure_notification_settings, null, this, ADVANCED_SETTINGS); R.string.configure_notification_settings, null, this, ADVANCED_SETTINGS);
} else { } else {
((SettingsActivity) getActivity()).startPreferencePanel( ((SettingsActivity) getActivity()).startPreferencePanel(this,
AdvancedAppSettings.class.getName(), null, R.string.configure_apps, AdvancedAppSettings.class.getName(), null, R.string.configure_apps,
null, this, ADVANCED_SETTINGS); null, this, ADVANCED_SETTINGS);
} }

View File

@@ -206,7 +206,7 @@ public class ManageDomainUrls extends SettingsPreferenceFragment
ApplicationsState.AppEntry entry = ((DomainAppPreference) preference).mEntry; ApplicationsState.AppEntry entry = ((DomainAppPreference) preference).mEntry;
AppInfoBase.startAppInfoFragment(AppLaunchSettings.class, R.string.auto_launch_label, AppInfoBase.startAppInfoFragment(AppLaunchSettings.class, R.string.auto_launch_label,
entry.info.packageName, entry.info.uid, this, entry.info.packageName, entry.info.uid, this,
INSTALLED_APP_DETAILS); INSTALLED_APP_DETAILS, getMetricsCategory());
return true; return true;
} }
return false; return false;

View File

@@ -139,7 +139,7 @@ public abstract class ProcessStatsBase extends SettingsPreferenceFragment
memInfo.usedWeight * memInfo.weightToRam); memInfo.usedWeight * memInfo.weightToRam);
args.putDouble(ProcessStatsDetail.EXTRA_TOTAL_SCALE, memInfo.totalScale); args.putDouble(ProcessStatsDetail.EXTRA_TOTAL_SCALE, memInfo.totalScale);
args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, !includeAppInfo); args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, !includeAppInfo);
activity.startPreferencePanel(ProcessStatsDetail.class.getName(), args, activity.startPreferencePanel(null, ProcessStatsDetail.class.getName(), args,
R.string.memory_usage, null, null, 0); R.string.memory_usage, null, null, 0);
} }
} }

View File

@@ -411,7 +411,7 @@ public class RunningProcessesView extends FrameLayout
args.putBoolean(RunningServiceDetails.KEY_BACKGROUND, mAdapter.mShowBackground); args.putBoolean(RunningServiceDetails.KEY_BACKGROUND, mAdapter.mShowBackground);
SettingsActivity sa = (SettingsActivity) mOwner.getActivity(); SettingsActivity sa = (SettingsActivity) mOwner.getActivity();
sa.startPreferencePanel(RunningServiceDetails.class.getName(), args, sa.startPreferencePanel(null, RunningServiceDetails.class.getName(), args,
R.string.runningservicedetails_settings_title, null, null, 0); R.string.runningservicedetails_settings_title, null, null, 0);
} }
} }

View File

@@ -17,6 +17,8 @@ package com.android.settings.applications;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.Utils; import com.android.settings.Utils;
@@ -42,6 +44,6 @@ public class ShortcutPreference extends Preference {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, mPrefKey); bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, mPrefKey);
Utils.startWithFragment(getContext(), mTarget.getName(), bundle, null, 0, Utils.startWithFragment(getContext(), mTarget.getName(), bundle, null, 0,
mTitle, null); mTitle, null, MetricsProto.MetricsEvent.VIEW_UNKNOWN);
} }
} }

View File

@@ -423,7 +423,8 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem
public void onClick() { public void onClick() {
final SettingsActivity activity = final SettingsActivity activity =
(SettingsActivity) BluetoothSettings.this.getActivity(); (SettingsActivity) BluetoothSettings.this.getActivity();
activity.startPreferencePanel(ScanningSettings.class.getName(), null, activity.startPreferencePanel(BluetoothSettings.this,
ScanningSettings.class.getName(), null,
R.string.location_scanning_screen_title, null, null, 0); R.string.location_scanning_screen_title, null, null, 0);
} }
}); });

View File

@@ -30,8 +30,8 @@ import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.core.instrumentation.VisibilityLoggerMixin; import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.core.lifecycle.ObservablePreferenceFragment; import com.android.settings.core.lifecycle.ObservablePreferenceFragment;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.PreferenceDividerDecoration;
import com.android.settings.survey.SurveyMixin; import com.android.settings.survey.SurveyMixin;
import com.android.settings.widget.PreferenceDividerDecoration;
/** /**
* Instrumented fragment that logs visibility state. * Instrumented fragment that logs visibility state.
@@ -47,9 +47,12 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc
private final PreferenceDividerDecoration mDividerDecoration = private final PreferenceDividerDecoration mDividerDecoration =
new PreferenceDividerDecoration(); new PreferenceDividerDecoration();
private final VisibilityLoggerMixin mVisibilityLoggerMixin;
public InstrumentedPreferenceFragment() { public InstrumentedPreferenceFragment() {
// Mixin that logs visibility change for activity. // Mixin that logs visibility change for activity.
getLifecycle().addObserver(new VisibilityLoggerMixin(getMetricsCategory())); mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory());
getLifecycle().addObserver(mVisibilityLoggerMixin);
getLifecycle().addObserver(new SurveyMixin(this, getClass().getSimpleName())); getLifecycle().addObserver(new SurveyMixin(this, getClass().getSimpleName()));
} }
@@ -67,6 +70,12 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc
return view; return view;
} }
@Override
public void onResume() {
mVisibilityLoggerMixin.setSourceMetricsCategory(getActivity());
super.onResume();
}
@Override @Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
} }

View File

@@ -27,8 +27,11 @@ import com.android.internal.logging.nano.MetricsProto;
*/ */
public class EventLogWriter implements LogWriter { public class EventLogWriter implements LogWriter {
public void visible(Context context, int category) { public void visible(Context context, int source, int category) {
MetricsLogger.visible(context, category); final LogMaker logMaker = new LogMaker(category)
.setType(MetricsProto.MetricsEvent.TYPE_OPEN)
.addTaggedData(MetricsProto.MetricsEvent.FIELD_CONTEXT, source);
MetricsLogger.action(logMaker);
} }
public void hidden(Context context, int category) { public void hidden(Context context, int category) {

View File

@@ -25,7 +25,7 @@ public interface LogWriter {
/** /**
* Logs a visibility event when view becomes visible. * Logs a visibility event when view becomes visible.
*/ */
void visible(Context context, int category); void visible(Context context, int source, int category);
/** /**
* Logs a visibility event when view becomes hidden. * Logs a visibility event when view becomes hidden.

View File

@@ -16,7 +16,8 @@
package com.android.settings.core.instrumentation; package com.android.settings.core.instrumentation;
import android.content.Context; import android.content.Context;
import android.metrics.LogMaker;
import com.android.internal.logging.nano.MetricsProto;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -37,9 +38,9 @@ public class MetricsFeatureProvider {
mLoggerWriters.add(new SettingSuggestionsLogWriter()); mLoggerWriters.add(new SettingSuggestionsLogWriter());
} }
public void visible(Context context, int category) { public void visible(Context context, int source, int category) {
for (LogWriter writer : mLoggerWriters) { for (LogWriter writer : mLoggerWriters) {
writer.visible(context, category); writer.visible(context, source, category);
} }
} }
@@ -90,4 +91,11 @@ public class MetricsFeatureProvider {
writer.histogram(context, name, bucket); writer.histogram(context, name, bucket);
} }
} }
public int getMetricsCategory(Object object) {
if (object == null || !(object instanceof Instrumentable)) {
return MetricsProto.MetricsEvent.VIEW_UNKNOWN;
}
return ((Instrumentable) object).getMetricsCategory();
}
} }

View File

@@ -31,7 +31,7 @@ public class SettingSuggestionsLogWriter implements LogWriter {
private EventStore mEventStore; private EventStore mEventStore;
@Override @Override
public void visible(Context context, int category) { public void visible(Context context, int source, int category) {
} }
@Override @Override

View File

@@ -16,8 +16,12 @@
package com.android.settings.core.instrumentation; package com.android.settings.core.instrumentation;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.SettingsActivity;
import com.android.settings.core.lifecycle.LifecycleObserver; import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.core.lifecycle.events.OnAttach; import com.android.settings.core.lifecycle.events.OnAttach;
import com.android.settings.core.lifecycle.events.OnPause; import com.android.settings.core.lifecycle.events.OnPause;
@@ -31,9 +35,12 @@ import static com.android.settings.core.instrumentation.Instrumentable.METRICS_C
*/ */
public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPause, OnAttach { public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPause, OnAttach {
private static final String TAG = "VisibilityLoggerMixin";
private final int mMetricsCategory; private final int mMetricsCategory;
private MetricsFeatureProvider mMetricsFeature; private MetricsFeatureProvider mMetricsFeature;
private int mSourceMetricsCategory = MetricsProto.MetricsEvent.VIEW_UNKNOWN;
public VisibilityLoggerMixin(int metricsCategory) { public VisibilityLoggerMixin(int metricsCategory) {
// MetricsFeature will be set during onAttach. // MetricsFeature will be set during onAttach.
@@ -53,7 +60,7 @@ public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPau
@Override @Override
public void onResume() { public void onResume() {
if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) { if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
mMetricsFeature.visible(null /* context */, mMetricsCategory); mMetricsFeature.visible(null /* context */, mSourceMetricsCategory, mMetricsCategory);
} }
} }
@@ -63,4 +70,19 @@ public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPau
mMetricsFeature.hidden(null /* context */, mMetricsCategory); mMetricsFeature.hidden(null /* context */, mMetricsCategory);
} }
} }
/**
* Sets source metrics category for this logger. Source is the caller that opened this UI.
*/
public void setSourceMetricsCategory(Activity activity) {
if (mSourceMetricsCategory != MetricsProto.MetricsEvent.VIEW_UNKNOWN || activity == null) {
return;
}
final Intent intent = activity.getIntent();
if (intent == null) {
return;
}
mSourceMetricsCategory = intent.getIntExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY,
MetricsProto.MetricsEvent.VIEW_UNKNOWN);
}
} }

View File

@@ -16,6 +16,7 @@
package com.android.settings.dashboard; package com.android.settings.dashboard;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
@@ -44,26 +45,21 @@ public interface DashboardFeatureProvider {
* *
* @param activity Activity hosting the preference * @param activity Activity hosting the preference
* @param context UI context to inflate preference * @param context UI context to inflate preference
* @param sourceMetricsCategory The context (source) from which an action is performed
* @param key Value from CategoryKey * @param key Value from CategoryKey
* @deprecated Pages implementing {@code DashboardFragment} should use * @deprecated Pages implementing {@code DashboardFragment} should use
* {@link #getTilesForCategory(String)} instead. Using this method will not get the benefit * {@link #getTilesForCategory(String)} instead. Using this method will not get the benefit
* of auto-ordering, progressive disclosure, auto-refreshing summary text etc. * of auto-ordering, progressive disclosure, auto-refreshing summary text etc.
*/ */
@Deprecated @Deprecated
List<Preference> getPreferencesForCategory(Activity activity, Context context, String key); List<Preference> getPreferencesForCategory(Activity activity, Context context,
int sourceMetricsCategory, String key);
/** /**
* Get all tiles, grouped by category. * Get all tiles, grouped by category.
*/ */
List<DashboardCategory> getAllCategories(); List<DashboardCategory> getAllCategories();
/**
* Returns a priority group for tile. priority level is grouped into hundreds. tiles with
* priority 100 - 199 belongs to priority level 100, tiles with priority 200 - 299 is in
* group 200, and so on.
*/
int getPriorityGroup(Preference preference);
/** /**
* Returns an unique string key for the tile. * Returns an unique string key for the tile.
*/ */
@@ -73,14 +69,15 @@ public interface DashboardFeatureProvider {
* Binds preference to data provided by tile. * Binds preference to data provided by tile.
* *
* @param activity If tile contains intent to launch, it will be launched from this activity * @param activity If tile contains intent to launch, it will be launched from this activity
* @param sourceMetricsCategory The context (source) from which an action is performed
* @param pref The preference to bind data * @param pref The preference to bind data
* @param tile The binding data * @param tile The binding data
* @param key They key for preference. If null, we will generate one from tile data * @param key They key for preference. If null, we will generate one from tile data
* @param baseOrder The order offset value. When binding, pref's order is determined by * @param baseOrder The order offset value. When binding, pref's order is determined by
* both this value and tile's own priority. * both this value and tile's own priority.
*/ */
void bindPreferenceToTile(Activity activity, Preference pref, Tile tile, String key, void bindPreferenceToTile(Activity activity, int sourceMetricsCategory, Preference pref,
int baseOrder); Tile tile, String key, int baseOrder);
/** /**
* Returns a {@link ProgressiveDisclosureMixin} for specified fragment. * Returns a {@link ProgressiveDisclosureMixin} for specified fragment.

View File

@@ -80,7 +80,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
@Override @Override
public List<Preference> getPreferencesForCategory(Activity activity, Context context, public List<Preference> getPreferencesForCategory(Activity activity, Context context,
String key) { int sourceMetricsCategory, String key) {
if (!isEnabled()) { if (!isEnabled()) {
return null; return null;
} }
@@ -97,7 +97,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
final List<Preference> preferences = new ArrayList<>(); final List<Preference> preferences = new ArrayList<>();
for (Tile tile : tiles) { for (Tile tile : tiles) {
final Preference pref = new Preference(context); final Preference pref = new Preference(context);
bindPreferenceToTile(activity, pref, tile, null /* key */, bindPreferenceToTile(activity, sourceMetricsCategory, pref, tile, null /* key */,
Preference.DEFAULT_ORDER /* baseOrder */); Preference.DEFAULT_ORDER /* baseOrder */);
preferences.add(pref); preferences.add(pref);
} }
@@ -109,11 +109,6 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
return mCategoryManager.getCategories(mContext); return mCategoryManager.getCategories(mContext);
} }
@Override
public int getPriorityGroup(Preference preference) {
return preference.getOrder() / 100;
}
@Override @Override
public String getDashboardKeyForTile(Tile tile) { public String getDashboardKeyForTile(Tile tile) {
if (tile == null || tile.intent == null) { if (tile == null || tile.intent == null) {
@@ -129,8 +124,8 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
} }
@Override @Override
public void bindPreferenceToTile(Activity activity, Preference pref, Tile tile, String key, public void bindPreferenceToTile(Activity activity, int sourceMetricsCategory, Preference pref,
int baseOrder) { Tile tile, String key, int baseOrder) {
pref.setTitle(tile.title); pref.setTitle(tile.title);
if (!TextUtils.isEmpty(key)) { if (!TextUtils.isEmpty(key)) {
pref.setKey(key); pref.setKey(key);
@@ -152,6 +147,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
pref.setFragment(clsName); pref.setFragment(clsName);
} else if (tile.intent != null) { } else if (tile.intent != null) {
final Intent intent = new Intent(tile.intent); final Intent intent = new Intent(tile.intent);
intent.putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory);
if (action != null) { if (action != null) {
intent.setAction(action); intent.setAction(action);
} }

View File

@@ -330,13 +330,13 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
// Have the key already, will rebind. // Have the key already, will rebind.
final Preference preference = mProgressiveDisclosureMixin.findPreference( final Preference preference = mProgressiveDisclosureMixin.findPreference(
screen, key); screen, key);
mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), preference, tile, key, mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), getMetricsCategory(),
mPlaceholderPreferenceController.getOrder()); preference, tile, key, mPlaceholderPreferenceController.getOrder());
} else { } else {
// Don't have this key, add it. // Don't have this key, add it.
final Preference pref = new Preference(getPrefContext()); final Preference pref = new Preference(getPrefContext());
mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), pref, tile, key, mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), getMetricsCategory(),
mPlaceholderPreferenceController.getOrder()); pref, tile, key, mPlaceholderPreferenceController.getOrder());
mProgressiveDisclosureMixin.addPreference(screen, pref); mProgressiveDisclosureMixin.addPreference(screen, pref);
mDashboardTilePrefKeys.add(key); mDashboardTilePrefKeys.add(key);
} }

View File

@@ -134,9 +134,11 @@ public class DashboardSummary extends InstrumentedFragment
((SettingsDrawerActivity) getActivity()).addCategoryListener(this); ((SettingsDrawerActivity) getActivity()).addCategoryListener(this);
mSummaryLoader.setListening(true); mSummaryLoader.setListening(true);
final int metricsCategory = getMetricsCategory();
for (Condition c : mConditionManager.getConditions()) { for (Condition c : mConditionManager.getConditions()) {
if (c.shouldShow()) { if (c.shouldShow()) {
mMetricsFeatureProvider.visible(getContext(), c.getMetricsConstant()); mMetricsFeatureProvider.visible(getContext(), metricsCategory,
c.getMetricsConstant());
} }
} }
if (DEBUG_TIMING) { if (DEBUG_TIMING) {

View File

@@ -194,7 +194,8 @@ public class SearchResultsSummary extends InstrumentedPreferenceFragment {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key); args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key);
Utils.startWithFragment(sa, className, args, null, 0, -1, screenTitle); Utils.startWithFragment(sa, className, args, null, 0, -1, screenTitle,
getMetricsCategory());
} else { } else {
final Intent intent = new Intent(action); final Intent intent = new Intent(action);

View File

@@ -56,7 +56,7 @@ public class BatterySaverCondition extends Condition {
@Override @Override
public void onPrimaryClick() { public void onPrimaryClick() {
Utils.startWithFragment(mManager.getContext(), BatterySaverSettings.class.getName(), null, Utils.startWithFragment(mManager.getContext(), BatterySaverSettings.class.getName(), null,
null, 0, R.string.battery_saver, null); null, 0, R.string.battery_saver, null, MetricsEvent.DASHBOARD_SUMMARY);
} }
@Override @Override

View File

@@ -91,7 +91,7 @@ public class HotspotCondition extends Condition {
@Override @Override
public void onPrimaryClick() { public void onPrimaryClick() {
Utils.startWithFragment(mManager.getContext(), TetherSettings.class.getName(), null, null, Utils.startWithFragment(mManager.getContext(), TetherSettings.class.getName(), null, null,
0, R.string.tether_settings_title_all, null); 0, R.string.tether_settings_title_all, null, MetricsEvent.DASHBOARD_SUMMARY);
} }
@Override @Override

View File

@@ -63,7 +63,7 @@ public final class NightDisplayCondition extends Condition
@Override @Override
public void onPrimaryClick() { public void onPrimaryClick() {
Utils.startWithFragment(mManager.getContext(), NightDisplaySettings.class.getName(), null, Utils.startWithFragment(mManager.getContext(), NightDisplaySettings.class.getName(), null,
null, 0, R.string.night_display_title, null); null, 0, R.string.night_display_title, null, MetricsEvent.DASHBOARD_SUMMARY);
} }
@Override @Override

View File

@@ -22,6 +22,8 @@ import android.os.Bundle;
import android.os.RemoteException; import android.os.RemoteException;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.util.AttributeSet; import android.util.AttributeSet;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.datausage.CellDataPreference.DataStateListener; import com.android.settings.datausage.CellDataPreference.DataStateListener;
@@ -76,7 +78,7 @@ public class BillingCyclePreference extends Preference implements TemplatePrefer
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
return Utils.onBuildStartFragmentIntent(getContext(), BillingCycleSettings.class.getName(), return Utils.onBuildStartFragmentIntent(getContext(), BillingCycleSettings.class.getName(),
args, null, 0, getTitle(), false); args, null, 0, getTitle(), false, MetricsProto.MetricsEvent.VIEW_UNKNOWN);
} }
private final DataStateListener mListener = new DataStateListener() { private final DataStateListener mListener = new DataStateListener() {

View File

@@ -22,6 +22,8 @@ import android.support.v7.preference.Preference;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.text.format.Formatter; import android.text.format.Formatter;
import android.util.AttributeSet; import android.util.AttributeSet;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settingslib.net.DataUsageController; import com.android.settingslib.net.DataUsageController;
import com.android.settings.R; import com.android.settings.R;
@@ -53,6 +55,7 @@ public class DataUsagePreference extends Preference implements TemplatePreferenc
args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
args.putInt(DataUsageList.EXTRA_SUB_ID, mSubId); args.putInt(DataUsageList.EXTRA_SUB_ID, mSubId);
return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(), args, return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(), args,
getContext().getPackageName(), 0, getTitle(), false); getContext().getPackageName(), 0, getTitle(), false,
MetricsProto.MetricsEvent.VIEW_UNKNOWN);
} }
} }

View File

@@ -479,7 +479,7 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment {
args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription()); args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription());
intent = Utils.onBuildStartFragmentIntent(getActivity(), intent = Utils.onBuildStartFragmentIntent(getActivity(),
ManageApplications.class.getName(), args, null, R.string.apps_storage, null, ManageApplications.class.getName(), args, null, R.string.apps_storage, null,
false); false, getMetricsCategory());
} break; } break;
case R.string.storage_detail_images: { case R.string.storage_detail_images: {

View File

@@ -235,8 +235,8 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index
final Bundle args = new Bundle(); final Bundle args = new Bundle();
args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL); args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL);
Intent intent = Utils.onBuildStartFragmentIntent(getActivity(), Intent intent = Utils.onBuildStartFragmentIntent(getActivity(),
StorageDashboardFragment.class.getName(), args, null, R.string.apps_storage, null, StorageDashboardFragment.class.getName(), args, null, R.string.apps_storage,
false); null, false, getMetricsCategory());
intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true); intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
getActivity().startActivity(intent); getActivity().startActivity(intent);
finish(); finish();

View File

@@ -38,6 +38,8 @@ import com.android.settings.Utils;
import com.android.settings.applications.ManageApplications; import com.android.settings.applications.ManageApplications;
import com.android.settings.applications.PackageManagerWrapperImpl; import com.android.settings.applications.PackageManagerWrapperImpl;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.deviceinfo.StorageMeasurement; import com.android.settingslib.deviceinfo.StorageMeasurement;
import com.android.settingslib.deviceinfo.StorageVolumeProvider; import com.android.settingslib.deviceinfo.StorageVolumeProvider;
@@ -67,6 +69,7 @@ public class StorageItemPreferenceController extends PreferenceController
static final String FILES_KEY = "pref_files"; static final String FILES_KEY = "pref_files";
private final Fragment mFragment; private final Fragment mFragment;
private final MetricsFeatureProvider mMetricsFeatureProvider;
private final StorageVolumeProvider mSvp; private final StorageVolumeProvider mSvp;
private VolumeInfo mVolume; private VolumeInfo mVolume;
private final int mUserId; private final int mUserId;
@@ -87,7 +90,7 @@ public class StorageItemPreferenceController extends PreferenceController
mFragment = hostFragment; mFragment = hostFragment;
mVolume = volume; mVolume = volume;
mSvp = svp; mSvp = svp;
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
UserManager um = mContext.getSystemService(UserManager.class); UserManager um = mContext.getSystemService(UserManager.class);
mUserId = um.getUserHandle(); mUserId = um.getUserHandle();
} }
@@ -213,7 +216,7 @@ public class StorageItemPreferenceController extends PreferenceController
args.putInt(ManageApplications.EXTRA_STORAGE_TYPE, ManageApplications.STORAGE_TYPE_MUSIC); args.putInt(ManageApplications.EXTRA_STORAGE_TYPE, ManageApplications.STORAGE_TYPE_MUSIC);
return Utils.onBuildStartFragmentIntent(mContext, return Utils.onBuildStartFragmentIntent(mContext,
ManageApplications.class.getName(), args, null, R.string.audio_storage_title, null, ManageApplications.class.getName(), args, null, R.string.audio_storage_title, null,
false); false, mMetricsFeatureProvider.getMetricsCategory(mFragment));
} }
private Intent getAppsIntent() { private Intent getAppsIntent() {
@@ -224,7 +227,7 @@ public class StorageItemPreferenceController extends PreferenceController
args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription()); args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription());
return Utils.onBuildStartFragmentIntent(mContext, return Utils.onBuildStartFragmentIntent(mContext,
ManageApplications.class.getName(), args, null, R.string.apps_storage, null, ManageApplications.class.getName(), args, null, R.string.apps_storage, null,
false); false, mMetricsFeatureProvider.getMetricsCategory(mFragment));
} }
private Intent getGamesIntent() { private Intent getGamesIntent() {
@@ -233,7 +236,7 @@ public class StorageItemPreferenceController extends PreferenceController
Settings.GamesStorageActivity.class.getName()); Settings.GamesStorageActivity.class.getName());
return Utils.onBuildStartFragmentIntent(mContext, return Utils.onBuildStartFragmentIntent(mContext,
ManageApplications.class.getName(), args, null, R.string.game_storage_settings, ManageApplications.class.getName(), args, null, R.string.game_storage_settings,
null, false); null, false, mMetricsFeatureProvider.getMetricsCategory(mFragment));
} }
private Intent getFilesIntent() { private Intent getFilesIntent() {

View File

@@ -35,6 +35,7 @@ import android.os.Bundle;
import android.os.Process; import android.os.Process;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.support.v14.preference.PreferenceFragment;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceCategory;
@@ -88,9 +89,9 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi
R.string.battery_desc_camera, R.string.battery_desc_camera,
}; };
public static void startBatteryDetailPage( public static void startBatteryDetailPage(SettingsActivity caller,
SettingsActivity caller, BatteryStatsHelper helper, int statsType, BatteryEntry entry, PreferenceFragment fragment, BatteryStatsHelper helper, int statsType,
boolean showLocationButton, boolean includeAppInfo) { BatteryEntry entry, boolean showLocationButton, boolean includeAppInfo) {
// Initialize mStats if necessary. // Initialize mStats if necessary.
helper.getStats(); helper.getStats();
@@ -283,7 +284,7 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi
args.putIntArray(PowerUsageDetail.EXTRA_DETAIL_TYPES, types); args.putIntArray(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
args.putDoubleArray(PowerUsageDetail.EXTRA_DETAIL_VALUES, values); args.putDoubleArray(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
caller.startPreferencePanelAsUser(PowerUsageDetail.class.getName(), args, caller.startPreferencePanelAsUser(fragment, PowerUsageDetail.class.getName(), args,
R.string.details_title, null, new UserHandle(userId)); R.string.details_title, null, new UserHandle(userId));
} }
@@ -550,7 +551,7 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi
args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackages[0]); args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackages[0]);
SettingsActivity sa = (SettingsActivity) getActivity(); SettingsActivity sa = (SettingsActivity) getActivity();
sa.startPreferencePanel(InstalledAppDetails.class.getName(), args, sa.startPreferencePanel(this, InstalledAppDetails.class.getName(), args,
R.string.application_info_label, null, null, 0); R.string.application_info_label, null, null, 0);
} }
@@ -558,26 +559,26 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi
SettingsActivity sa = (SettingsActivity)getActivity(); SettingsActivity sa = (SettingsActivity)getActivity();
switch (action) { switch (action) {
case ACTION_DISPLAY_SETTINGS: case ACTION_DISPLAY_SETTINGS:
sa.startPreferencePanel(DisplaySettings.class.getName(), null, sa.startPreferencePanel(this, DisplaySettings.class.getName(), null,
R.string.display_settings_title, null, null, 0); R.string.display_settings_title, null, null, 0);
break; break;
case ACTION_WIFI_SETTINGS: case ACTION_WIFI_SETTINGS:
sa.startPreferencePanel(WifiSettings.class.getName(), null, sa.startPreferencePanel(this, WifiSettings.class.getName(), null,
R.string.wifi_settings, null, null, 0); R.string.wifi_settings, null, null, 0);
break; break;
case ACTION_BLUETOOTH_SETTINGS: case ACTION_BLUETOOTH_SETTINGS:
sa.startPreferencePanel(BluetoothSettings.class.getName(), null, sa.startPreferencePanel(this, BluetoothSettings.class.getName(), null,
R.string.bluetooth_settings, null, null, 0); R.string.bluetooth_settings, null, null, 0);
break; break;
case ACTION_WIRELESS_SETTINGS: case ACTION_WIRELESS_SETTINGS:
sa.startPreferencePanel(WirelessSettings.class.getName(), null, sa.startPreferencePanel(this, WirelessSettings.class.getName(), null,
R.string.radio_controls_title, null, null, 0); R.string.radio_controls_title, null, null, 0);
break; break;
case ACTION_APP_DETAILS: case ACTION_APP_DETAILS:
startApplicationDetailsActivity(); startApplicationDetailsActivity();
break; break;
case ACTION_LOCATION_SETTINGS: case ACTION_LOCATION_SETTINGS:
sa.startPreferencePanel(LocationSettings.class.getName(), null, sa.startPreferencePanel(this, LocationSettings.class.getName(), null,
R.string.location_settings_title, null, null, 0); R.string.location_settings_title, null, null, 0);
break; break;
case ACTION_FORCE_STOP: case ACTION_FORCE_STOP:

View File

@@ -40,7 +40,7 @@ import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.os.BatterySipper; import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatterySipper.DrainType; import com.android.internal.os.BatterySipper.DrainType;
@@ -141,8 +141,8 @@ public class PowerUsageSummary extends PowerUsageBase {
} }
PowerGaugePreference pgp = (PowerGaugePreference) preference; PowerGaugePreference pgp = (PowerGaugePreference) preference;
BatteryEntry entry = pgp.getInfo(); BatteryEntry entry = pgp.getInfo();
PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), mStatsHelper, PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this,
mStatsType, entry, true, true); mStatsHelper, mStatsType, entry, true, true);
return super.onPreferenceTreeClick(preference); return super.onPreferenceTreeClick(preference);
} }
@@ -206,7 +206,7 @@ public class PowerUsageSummary extends PowerUsageBase {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(ManageApplications.EXTRA_CLASSNAME, args.putString(ManageApplications.EXTRA_CLASSNAME,
HighPowerApplicationsActivity.class.getName()); HighPowerApplicationsActivity.class.getName());
sa.startPreferencePanel(ManageApplications.class.getName(), args, sa.startPreferencePanel(this, ManageApplications.class.getName(), args,
R.string.high_power_apps, null, null, 0); R.string.high_power_apps, null, null, 0);
return true; return true;
case MENU_ADDITIONAL_BATTERY_INFO: case MENU_ADDITIONAL_BATTERY_INFO:
@@ -237,7 +237,7 @@ public class PowerUsageSummary extends PowerUsageBase {
if (featureProvider.isAdvancedUiEnabled()) { if (featureProvider.isAdvancedUiEnabled()) {
Utils.startWithFragment(getContext(), PowerUsageAdvanced.class.getName(), null, Utils.startWithFragment(getContext(), PowerUsageAdvanced.class.getName(), null,
null, 0, R.string.advanced_battery_title, null); null, 0, R.string.advanced_battery_title, null, getMetricsCategory());
} else { } else {
mStatsHelper.storeStatsHistoryInFile(BatteryHistoryDetail.BATTERY_HISTORY_FILE); mStatsHelper.storeStatsHistoryInFile(BatteryHistoryDetail.BATTERY_HISTORY_FILE);
Bundle args = new Bundle(2); Bundle args = new Bundle(2);
@@ -246,7 +246,7 @@ public class PowerUsageSummary extends PowerUsageBase {
args.putParcelable(BatteryHistoryDetail.EXTRA_BROADCAST, args.putParcelable(BatteryHistoryDetail.EXTRA_BROADCAST,
mStatsHelper.getBatteryBroadcast()); mStatsHelper.getBatteryBroadcast());
Utils.startWithFragment(getContext(), BatteryHistoryDetail.class.getName(), args, Utils.startWithFragment(getContext(), BatteryHistoryDetail.class.getName(), args,
null, 0, R.string.history_details_title, null); null, 0, R.string.history_details_title, null, getMetricsCategory());
} }
} }

View File

@@ -194,6 +194,7 @@ public class LocationSettings extends LocationSettingsBase
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
activity.startPreferencePanel( activity.startPreferencePanel(
LocationSettings.this,
LocationMode.class.getName(), null, LocationMode.class.getName(), null,
R.string.location_mode_screen_title, null, LocationSettings.this, R.string.location_mode_screen_title, null, LocationSettings.this,
0); 0);
@@ -348,6 +349,7 @@ public class LocationSettings extends LocationSettingsBase
switch (item.getItemId()) { switch (item.getItemId()) {
case MENU_SCANNING: case MENU_SCANNING:
activity.startPreferencePanel( activity.startPreferencePanel(
this,
ScanningSettings.class.getName(), null, ScanningSettings.class.getName(), null,
R.string.location_scanning_screen_title, null, LocationSettings.this, R.string.location_scanning_screen_title, null, LocationSettings.this,
0); 0);
@@ -467,6 +469,7 @@ public class LocationSettings extends LocationSettingsBase
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackage); args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackage);
((SettingsActivity) getActivity()).startPreferencePanelAsUser( ((SettingsActivity) getActivity()).startPreferencePanelAsUser(
LocationSettings.this,
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;

View File

@@ -23,6 +23,7 @@ import android.support.annotation.VisibleForTesting;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.ResetNetwork; import com.android.settings.ResetNetwork;
import com.android.settings.Utils; import com.android.settings.Utils;
@@ -45,7 +46,8 @@ public class NetworkResetActionMenuController {
if (item != null) { if (item != null) {
item.setOnMenuItemClickListener(target -> { item.setOnMenuItemClickListener(target -> {
Utils.startWithFragment(mContext, ResetNetwork.class.getName(), null, null, Utils.startWithFragment(mContext, ResetNetwork.class.getName(), null, null,
0, R.string.reset_network_title, null); 0, R.string.reset_network_title, null,
MetricsProto.MetricsEvent.SETTINGS_NETWORK_CATEGORY);
return true; return true;
}); });
} }

View File

@@ -198,7 +198,7 @@ public class AppNotificationSettings extends NotificationSettingsBase {
channelArgs.putString(Settings.EXTRA_CHANNEL_ID, channel.getId()); channelArgs.putString(Settings.EXTRA_CHANNEL_ID, channel.getId());
Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(), Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(),
ChannelNotificationSettings.class.getName(), ChannelNotificationSettings.class.getName(),
channelArgs, null, 0, null, false); channelArgs, null, 0, null, false, getMetricsCategory());
channelPref.setIntent(channelIntent); channelPref.setIntent(channelIntent);
channelPref.setOnPreferenceChangeListener( channelPref.setOnPreferenceChangeListener(

View File

@@ -29,6 +29,7 @@ import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.dashboard.SiteMapManager; import com.android.settings.dashboard.SiteMapManager;
@@ -187,7 +188,8 @@ class CursorToSearchResultConverter {
final Bundle args = new Bundle(); final Bundle args = new Bundle();
args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key); args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key);
final Intent intent = Utils.onBuildStartFragmentIntent(mContext, final Intent intent = Utils.onBuildStartFragmentIntent(mContext,
className, args, null, 0, screenTitle, false); className, args, null, 0, screenTitle, false,
MetricsProto.MetricsEvent.DASHBOARD_SEARCH_RESULTS);
payload = new IntentPayload(intent); payload = new IntentPayload(intent);
} else { } else {
final Intent intent = new Intent(action); final Intent intent = new Intent(action);

View File

@@ -439,7 +439,7 @@ public class UserSettings extends SettingsPreferenceFragment
if (userId == UserPreference.USERID_GUEST_DEFAULTS) { if (userId == UserPreference.USERID_GUEST_DEFAULTS) {
Bundle extras = new Bundle(); Bundle extras = new Bundle();
extras.putBoolean(UserDetailsSettings.EXTRA_USER_GUEST, true); extras.putBoolean(UserDetailsSettings.EXTRA_USER_GUEST, true);
((SettingsActivity) getActivity()).startPreferencePanel( ((SettingsActivity) getActivity()).startPreferencePanel(this,
UserDetailsSettings.class.getName(), UserDetailsSettings.class.getName(),
extras, R.string.user_guest, null, null, 0); extras, R.string.user_guest, null, null, 0);
return; return;
@@ -449,7 +449,7 @@ public class UserSettings extends SettingsPreferenceFragment
Bundle extras = new Bundle(); Bundle extras = new Bundle();
extras.putInt(RestrictedProfileSettings.EXTRA_USER_ID, userId); extras.putInt(RestrictedProfileSettings.EXTRA_USER_ID, userId);
extras.putBoolean(RestrictedProfileSettings.EXTRA_NEW_USER, newUser); extras.putBoolean(RestrictedProfileSettings.EXTRA_NEW_USER, newUser);
((SettingsActivity) getActivity()).startPreferencePanel( ((SettingsActivity) getActivity()).startPreferencePanel(this,
RestrictedProfileSettings.class.getName(), RestrictedProfileSettings.class.getName(),
extras, R.string.user_restrictions_title, null, extras, R.string.user_restrictions_title, null,
null, 0); null, 0);
@@ -459,7 +459,7 @@ public class UserSettings extends SettingsPreferenceFragment
} else if (mUserCaps.mIsAdmin) { } else if (mUserCaps.mIsAdmin) {
Bundle extras = new Bundle(); Bundle extras = new Bundle();
extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userId); extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userId);
((SettingsActivity) getActivity()).startPreferencePanel( ((SettingsActivity) getActivity()).startPreferencePanel(this,
UserDetailsSettings.class.getName(), UserDetailsSettings.class.getName(),
extras, extras,
-1, /* No title res id */ -1, /* No title res id */

View File

@@ -100,11 +100,11 @@ public class AppManagementFragment extends SettingsPreferenceFragment
} }
}; };
public static void show(Context context, AppPreference pref) { public static void show(Context context, AppPreference pref, int sourceMetricsCategory) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(ARG_PACKAGE_NAME, pref.getPackageName()); args.putString(ARG_PACKAGE_NAME, pref.getPackageName());
Utils.startWithFragmentAsUser(context, AppManagementFragment.class.getName(), args, -1, Utils.startWithFragmentAsUser(context, AppManagementFragment.class.getName(), args, -1,
pref.getLabel(), false, new UserHandle(pref.getUserId())); pref.getLabel(), false, sourceMetricsCategory, new UserHandle(pref.getUserId()));
} }
@Override @Override

View File

@@ -405,8 +405,8 @@ public class VpnSettings extends RestrictedSettingsFragment implements
ConfigDialogFragment.show(VpnSettings.this, pref.getProfile(), true /* editing */, ConfigDialogFragment.show(VpnSettings.this, pref.getProfile(), true /* editing */,
true /* exists */); true /* exists */);
} else if (p instanceof AppPreference) { } else if (p instanceof AppPreference) {
AppPreference pref = (AppPreference) p;; AppPreference pref = (AppPreference) p;
AppManagementFragment.show(getPrefContext(), pref); AppManagementFragment.show(getPrefContext(), pref, getMetricsCategory());
} }
} }
}; };

View File

@@ -850,8 +850,9 @@ public class WifiSettings extends RestrictedSettingsFragment
@Override @Override
public void onClick() { public void onClick() {
final SettingsActivity activity = (SettingsActivity) getActivity(); final SettingsActivity activity = (SettingsActivity) getActivity();
activity.startPreferencePanel(ScanningSettings.class.getName(), null, activity.startPreferencePanel(WifiSettings.this,
R.string.location_scanning_screen_title, null, null, 0); ScanningSettings.class.getName(),
null, R.string.location_scanning_screen_title, null, null, 0);
} }
}; };
mStatusMessagePreference.setText( mStatusMessagePreference.setText(

View File

@@ -79,7 +79,8 @@ public class DevelopmentSettingsTest {
doReturn(mActivity).when(mSettings).getActivity(); doReturn(mActivity).when(mSettings).getActivity();
when(mPreferenceManager.getContext()).thenReturn(mContext); when(mPreferenceManager.getContext()).thenReturn(mContext);
when(mFeatureFactory.dashboardFeatureProvider.getPreferencesForCategory( when(mFeatureFactory.dashboardFeatureProvider.getPreferencesForCategory(
mActivity, mContext, CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT)) mActivity, mContext, mSettings.getMetricsCategory(),
CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT))
.thenReturn(preferences); .thenReturn(preferences);
mSettings.onAttach(mContext); mSettings.onAttach(mContext);

View File

@@ -24,6 +24,7 @@ import android.content.pm.PackageManager;
import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.PreferenceScreen;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
@@ -57,18 +58,20 @@ public class AppInfoWithHeaderTest {
FakeFeatureFactory.setupForTest(mContext); FakeFeatureFactory.setupForTest(mContext);
mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
when(mFactory.metricsFeatureProvider.getMetricsCategory(any(Object.class)))
.thenReturn(MetricsProto.MetricsEvent.SETTINGS_APP_NOTIF_CATEGORY);
mAppInfoWithHeader = new TestFragment(); mAppInfoWithHeader = new TestFragment();
} }
@Test @Test
public void testAppHeaderIsAdded() { public void testAppHeaderIsAdded() {
final AppHeaderController appHeaderController = new AppHeaderController(
ShadowApplication.getInstance().getApplicationContext(),
mAppInfoWithHeader,
null);
when(mFactory.dashboardFeatureProvider.isEnabled()).thenReturn(true); when(mFactory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
when(mFactory.applicationFeatureProvider.newAppHeaderController(mAppInfoWithHeader, null)) when(mFactory.applicationFeatureProvider.newAppHeaderController(mAppInfoWithHeader, null))
.thenReturn(new AppHeaderController( .thenReturn(appHeaderController);
ShadowApplication.getInstance().getApplicationContext(),
mAppInfoWithHeader,
null));
mAppInfoWithHeader.onActivityCreated(null); mAppInfoWithHeader.onActivityCreated(null);
verify(mAppInfoWithHeader.mScreen).addPreference(any(LayoutPreference.class)); verify(mAppInfoWithHeader.mScreen).addPreference(any(LayoutPreference.class));

View File

@@ -21,9 +21,11 @@ import android.os.UserManager;
import com.android.settings.Settings; import com.android.settings.Settings;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor; import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.SettingsShadowResources.SettingsShadowTheme; import com.android.settings.testutils.shadow.SettingsShadowResources.SettingsShadowTheme;
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -46,7 +48,8 @@ import static org.mockito.Mockito.when;
shadows = { shadows = {
SettingsShadowResources.class, SettingsShadowResources.class,
SettingsShadowTheme.class, SettingsShadowTheme.class,
ShadowDynamicIndexableContentMonitor.class ShadowDynamicIndexableContentMonitor.class,
ShadowEventLogWriter.class
}) })
public class ManageApplicationsTest { public class ManageApplicationsTest {
@@ -55,8 +58,8 @@ public class ManageApplicationsTest {
@Mock private UserManager mUserManager; @Mock private UserManager mUserManager;
private Looper mBgLooper; private Looper mBgLooper;
private ManageApplications mFragment; private ManageApplications mFragment;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
@@ -67,6 +70,7 @@ public class ManageApplicationsTest {
when(mState.getBackgroundLooper()).thenReturn(mBgLooper); when(mState.getBackgroundLooper()).thenReturn(mBgLooper);
mFragment = new ManageApplications(); mFragment = new ManageApplications();
ReflectionHelpers.setField(mFragment, "mLifecycle", new Lifecycle());
} }
@Test @Test

View File

@@ -15,9 +15,15 @@
*/ */
package com.android.settings.core.instrumentation; package com.android.settings.core.instrumentation;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import com.android.internal.logging.nano.MetricsProto;
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;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -29,9 +35,11 @@ import static com.android.settings.core.instrumentation.Instrumentable.METRICS_C
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@@ -54,7 +62,23 @@ public class VisibilityLoggerMixinTest {
mMixin.onResume(); mMixin.onResume();
verify(mMetricsFeature, times(1)) verify(mMetricsFeature, times(1))
.visible(any(Context.class), eq(TestInstrumentable.TEST_METRIC)); .visible(any(Context.class), eq(MetricsProto.MetricsEvent.VIEW_UNKNOWN),
eq(TestInstrumentable.TEST_METRIC));
}
@Test
public void shouldLogVisibleWithSource() {
final Intent sourceIntent = new Intent()
.putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY,
MetricsProto.MetricsEvent.SETTINGS_GESTURES);
final Activity activity = mock(Activity.class);
when(activity.getIntent()).thenReturn(sourceIntent);
mMixin.setSourceMetricsCategory(activity);
mMixin.onResume();
verify(mMetricsFeature, times(1))
.visible(any(Context.class), eq(MetricsProto.MetricsEvent.SETTINGS_GESTURES),
eq(TestInstrumentable.TEST_METRIC));
} }
@Test @Test

View File

@@ -98,7 +98,8 @@ public class DashboardFeatureProviderImplTest {
tile.metaData = new Bundle(); tile.metaData = new Bundle();
tile.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI"); tile.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI");
tile.priority = 10; tile.priority = 10;
mImpl.bindPreferenceToTile(mActivity, preference, tile, "123", Preference.DEFAULT_ORDER); mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
preference, tile, "123", Preference.DEFAULT_ORDER);
assertThat(preference.getTitle()).isEqualTo(tile.title); assertThat(preference.getTitle()).isEqualTo(tile.title);
assertThat(preference.getSummary()).isEqualTo(tile.summary); assertThat(preference.getSummary()).isEqualTo(tile.summary);
@@ -118,7 +119,8 @@ public class DashboardFeatureProviderImplTest {
tile.intent = new Intent(); tile.intent = new Intent();
tile.intent.setComponent(new ComponentName("pkg", "class")); tile.intent.setComponent(new ComponentName("pkg", "class"));
mImpl.bindPreferenceToTile(mActivity, preference, tile, "123", Preference.DEFAULT_ORDER); mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
preference, tile, "123", Preference.DEFAULT_ORDER);
assertThat(preference.getFragment()).isNull(); assertThat(preference.getFragment()).isNull();
assertThat(preference.getOnPreferenceClickListener()).isNotNull(); assertThat(preference.getOnPreferenceClickListener()).isNotNull();
@@ -140,7 +142,8 @@ public class DashboardFeatureProviderImplTest {
when(mActivity.getSystemService(Context.USER_SERVICE)) when(mActivity.getSystemService(Context.USER_SERVICE))
.thenReturn(mUserManager); .thenReturn(mUserManager);
mImpl.bindPreferenceToTile(mActivity, preference, tile, "123", Preference.DEFAULT_ORDER); mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
preference, tile, "123", Preference.DEFAULT_ORDER);
preference.getOnPreferenceClickListener().onPreferenceClick(null); preference.getOnPreferenceClickListener().onPreferenceClick(null);
verify(mActivity).getFragmentManager(); verify(mActivity).getFragmentManager();
@@ -160,7 +163,8 @@ public class DashboardFeatureProviderImplTest {
when(mActivity.getSystemService(Context.USER_SERVICE)) when(mActivity.getSystemService(Context.USER_SERVICE))
.thenReturn(mUserManager); .thenReturn(mUserManager);
mImpl.bindPreferenceToTile(mActivity, preference, tile, "123", Preference.DEFAULT_ORDER); mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
preference, tile, "123", Preference.DEFAULT_ORDER);
preference.getOnPreferenceClickListener().onPreferenceClick(null); preference.getOnPreferenceClickListener().onPreferenceClick(null);
verify(mFeatureFactory.metricsFeatureProvider).action( verify(mFeatureFactory.metricsFeatureProvider).action(
any(Context.class), any(Context.class),
@@ -177,8 +181,8 @@ public class DashboardFeatureProviderImplTest {
final Tile tile = new Tile(); final Tile tile = new Tile();
tile.intent = new Intent(); tile.intent = new Intent();
tile.intent.setComponent(new ComponentName("pkg", "class")); tile.intent.setComponent(new ComponentName("pkg", "class"));
mImpl.bindPreferenceToTile(mActivity, preference, tile, null /* key */ mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
, Preference.DEFAULT_ORDER); preference, tile, null /*key */, Preference.DEFAULT_ORDER);
assertThat(preference.getKey()).isNotNull(); assertThat(preference.getKey()).isNotNull();
assertThat(preference.getOrder()).isEqualTo(Preference.DEFAULT_ORDER); assertThat(preference.getOrder()).isEqualTo(Preference.DEFAULT_ORDER);
@@ -192,8 +196,8 @@ public class DashboardFeatureProviderImplTest {
tile.key = "key"; tile.key = "key";
tile.intent = new Intent(); tile.intent = new Intent();
tile.intent.setComponent(new ComponentName("pkg", "class")); tile.intent.setComponent(new ComponentName("pkg", "class"));
mImpl.bindPreferenceToTile(mActivity, preference, tile, null /* key */ mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
, Preference.DEFAULT_ORDER); preference, tile, null /* key */, Preference.DEFAULT_ORDER);
assertThat(preference.getKey()).isEqualTo(tile.key); assertThat(preference.getKey()).isEqualTo(tile.key);
} }
@@ -206,7 +210,8 @@ public class DashboardFeatureProviderImplTest {
final Tile tile = new Tile(); final Tile tile = new Tile();
tile.metaData = new Bundle(); tile.metaData = new Bundle();
tile.priority = 10; tile.priority = 10;
mImpl.bindPreferenceToTile(mActivity, preference, tile, "123", baseOrder); mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
preference, tile, "123", baseOrder);
assertThat(preference.getOrder()).isEqualTo(-tile.priority + baseOrder); assertThat(preference.getOrder()).isEqualTo(-tile.priority + baseOrder);
} }
@@ -223,12 +228,16 @@ public class DashboardFeatureProviderImplTest {
tile.metaData = new Bundle(); tile.metaData = new Bundle();
tile.metaData.putString("com.android.settings.intent.action", "TestAction"); tile.metaData.putString("com.android.settings.intent.action", "TestAction");
tile.userHandle = null; tile.userHandle = null;
mImpl.bindPreferenceToTile(activity, preference, tile, "123", Preference.DEFAULT_ORDER); mImpl.bindPreferenceToTile(activity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
preference, tile, "123", Preference.DEFAULT_ORDER);
preference.performClick(); preference.performClick();
ShadowActivity shadowActivity = shadowOf(activity); ShadowActivity shadowActivity = shadowOf(activity);
assertThat(shadowActivity.getNextStartedActivityForResult().intent.getAction()) final Intent launchIntent = shadowActivity.getNextStartedActivityForResult().intent;
assertThat(launchIntent.getAction())
.isEqualTo("TestAction"); .isEqualTo("TestAction");
assertThat(launchIntent.getIntExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, 0))
.isEqualTo(MetricsProto.MetricsEvent.SETTINGS_GESTURES);
} }
@Test @Test
@@ -236,7 +245,8 @@ public class DashboardFeatureProviderImplTest {
final DashboardFeatureProviderImpl mSpy = spy(mImpl); final DashboardFeatureProviderImpl mSpy = spy(mImpl);
when(mSpy.isEnabled()).thenReturn(false); when(mSpy.isEnabled()).thenReturn(false);
assertThat(mSpy.getPreferencesForCategory(null, null, CategoryKey.CATEGORY_HOMEPAGE)) assertThat(mSpy.getPreferencesForCategory(null, null,
MetricsProto.MetricsEvent.SETTINGS_GESTURES, CategoryKey.CATEGORY_HOMEPAGE))
.isNull(); .isNull();
} }
@@ -248,7 +258,8 @@ public class DashboardFeatureProviderImplTest {
when(mCategoryManager.getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE)) when(mCategoryManager.getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE))
.thenReturn(null); .thenReturn(null);
assertThat(mSpy.getPreferencesForCategory(null, null, CategoryKey.CATEGORY_HOMEPAGE)) assertThat(mSpy.getPreferencesForCategory(null, null,
MetricsProto.MetricsEvent.SETTINGS_GESTURES, CategoryKey.CATEGORY_HOMEPAGE))
.isNull(); .isNull();
} }
@@ -260,7 +271,8 @@ public class DashboardFeatureProviderImplTest {
when(mCategoryManager.getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE)) when(mCategoryManager.getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE))
.thenReturn(new DashboardCategory()); .thenReturn(new DashboardCategory());
assertThat(mSpy.getPreferencesForCategory(null, null, CategoryKey.CATEGORY_HOMEPAGE)) assertThat(mSpy.getPreferencesForCategory(null, null,
MetricsProto.MetricsEvent.SETTINGS_GESTURES, CategoryKey.CATEGORY_HOMEPAGE))
.isNull(); .isNull();
} }
@@ -277,6 +289,7 @@ public class DashboardFeatureProviderImplTest {
assertThat(mSpy.getPreferencesForCategory(mActivity, assertThat(mSpy.getPreferencesForCategory(mActivity,
ShadowApplication.getInstance().getApplicationContext(), ShadowApplication.getInstance().getApplicationContext(),
MetricsProto.MetricsEvent.SETTINGS_GESTURES,
CategoryKey.CATEGORY_HOMEPAGE).isEmpty()) CategoryKey.CATEGORY_HOMEPAGE).isEmpty())
.isFalse(); .isFalse();
} }

View File

@@ -24,6 +24,7 @@ import android.support.v7.preference.PreferenceScreen;
import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
@@ -37,6 +38,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowApplication;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -186,6 +188,8 @@ public class DashboardFragmentTest {
mControllers = new ArrayList<>(); mControllers = new ArrayList<>();
when(mPreferenceManager.getContext()).thenReturn(mContext); when(mPreferenceManager.getContext()).thenReturn(mContext);
ReflectionHelpers.setField(
this, "mVisibilityLoggerMixin", mock(VisibilityLoggerMixin.class));
} }
@Override @Override

View File

@@ -0,0 +1,33 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.testutils.shadow;
import android.content.Context;
import com.android.settings.core.instrumentation.EventLogWriter;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@Implements(value = EventLogWriter.class, callThroughByDefault = false)
public class ShadowEventLogWriter {
@Implementation
public void visible(Context context, int source, int category) {
}
}