diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml index 41ec0fa4d63..8f3f74ed915 100644 --- a/res/xml/development_prefs.xml +++ b/res/xml/development_prefs.xml @@ -400,6 +400,7 @@ @@ -410,7 +411,8 @@ + android:title="@string/inactive_apps_title" + android:fragment="com.android.settings.fuelgauge.InactiveApps"/> tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory( - getActivity(), getPrefContext(), CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT); + getActivity(), getPrefContext(), getMetricsCategory(), + CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT); if (tilePrefs != null) { for (Preference preference : tilePrefs) { screen.addPreference(preference); @@ -2469,10 +2470,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment writeUSBAudioOptions(); } else if (preference == mForceResizable) { writeForceResizableOptions(); - } else if (INACTIVE_APPS_KEY.equals(preference.getKey())) { - startInactiveAppsFragment(); - } else if (BACKGROUND_CHECK_KEY.equals(preference.getKey())) { - startBackgroundCheckFragment(); } else if (preference == mBluetoothDisableAbsVolume) { writeBluetoothDisableAbsVolumeOptions(); } else if (preference == mWebViewMultiprocess) { @@ -2486,18 +2483,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment 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) { return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity( requestCode, resources.getString(R.string.oem_unlock_enable)); diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java index 5fd4f46a3aa..fa9410d2db8 100644 --- a/src/com/android/settings/MasterClear.java +++ b/src/com/android/settings/MasterClear.java @@ -118,7 +118,8 @@ public class MasterClear extends OptionsMenuFragment private void showFinalConfirmation() { Bundle args = new Bundle(); 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); } diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java index 8ac11cd4eaf..45490ab7b31 100644 --- a/src/com/android/settings/ResetNetwork.java +++ b/src/com/android/settings/ResetNetwork.java @@ -98,7 +98,8 @@ public class ResetNetwork extends OptionsMenuFragment { SubscriptionInfo subscription = mSubscriptions.get(selectedIndex); 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); } diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index b66f2f52dfb..04b2413b02c 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -414,7 +414,8 @@ public class SecuritySettings extends SettingsPreferenceFragment (PreferenceGroup) root.findPreference(KEY_SECURITY_STATUS); if (mDashboardFeatureProvider.isEnabled()) { final List tilePrefs = mDashboardFeatureProvider.getPreferencesForCategory( - getActivity(), getPrefContext(), CategoryKey.CATEGORY_SECURITY); + getActivity(), getPrefContext(), getMetricsCategory(), + CategoryKey.CATEGORY_SECURITY); int numSecurityStatusPrefs = 0; if (tilePrefs != null && !tilePrefs.isEmpty()) { for (Preference preference : tilePrefs) { diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 9168ead3b94..0435d03fe03 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -56,6 +56,7 @@ import com.android.internal.util.ArrayUtils; import com.android.settings.Settings.WifiSettingsActivity; import com.android.settings.backup.BackupSettingsActivity; 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.dashboard.DashboardContainerFragment; 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"; + /** + * 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}, * 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 SearchResultsSummary mSearchResultsFragment; private SearchFeatureProvider mSearchFeatureProvider; + private MetricsFeatureProvider mMetricsFeatureProvider; // Categories private ArrayList mCategories = new ArrayList<>(); @@ -239,7 +246,7 @@ public class SettingsActivity extends SettingsDrawerActivity @Override 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); return true; } @@ -350,6 +357,7 @@ public class SettingsActivity extends SettingsDrawerActivity mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this); mSearchFeatureProvider = factory.getSearchFeatureProvider(); + mMetricsFeatureProvider = factory.getMetricsFeatureProvider(); // Should happen before any call to getIntent() getMetaData(); @@ -748,8 +756,8 @@ public class SettingsActivity extends SettingsDrawerActivity * @param resultRequestCode If resultTo is non-null, this is the caller's * request code to be received with the result. */ - public void startPreferencePanel(String fragmentClass, Bundle args, int titleRes, - CharSequence titleText, Fragment resultTo, int resultRequestCode) { + public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args, + int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) { String title = null; if (titleRes < 0) { if (titleText != null) { @@ -760,7 +768,7 @@ public class SettingsActivity extends SettingsDrawerActivity } } 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 userHandle The user for which the panel has to be started. */ - public void startPreferencePanelAsUser(String fragmentClass, Bundle args, int titleRes, - CharSequence titleText, UserHandle userHandle) { + public void startPreferencePanelAsUser(Fragment caller, String fragmentClass, + Bundle args, int titleRes, CharSequence titleText, UserHandle userHandle) { // This is a workaround. // // 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() // when we're calling it as the same user. if (userHandle.getIdentifier() == UserHandle.myUserId()) { - startPreferencePanel(fragmentClass, args, titleRes, titleText, null, 0); + startPreferencePanel(caller, fragmentClass, args, titleRes, titleText, null, 0); } else { String title = null; if (titleRes < 0) { @@ -799,8 +807,8 @@ public class SettingsActivity extends SettingsDrawerActivity title = ""; } } - Utils.startWithFragmentAsUser(this, fragmentClass, args, - titleRes, title, mIsShortcut, userHandle); + Utils.startWithFragmentAsUser(this, fragmentClass, args, titleRes, title, + mIsShortcut, mMetricsFeatureProvider.getMetricsCategory(caller), userHandle); } } diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 3bad5f31cf6..70743e2a98f 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -732,7 +732,8 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF final Activity activity = getActivity(); if (activity instanceof SettingsActivity) { SettingsActivity sa = (SettingsActivity) activity; - sa.startPreferencePanel(fragmentClass, extras, titleRes, null, caller, requestCode); + sa.startPreferencePanel( + caller, fragmentClass, extras, titleRes, null, caller, requestCode); return true; } else { Log.w(TAG, diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java index 313e737cbaf..5571c2d7180 100644 --- a/src/com/android/settings/UserDictionarySettings.java +++ b/src/com/android/settings/UserDictionarySettings.java @@ -215,7 +215,7 @@ public class UserDictionarySettings extends ListFragment implements Instrumentab args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut); args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale); SettingsActivity sa = (SettingsActivity) getActivity(); - sa.startPreferencePanel( + sa.startPreferencePanel(this, com.android.settings.inputmethod.UserDictionaryAddWordFragment.class.getName(), args, R.string.user_dict_settings_add_dialog_title, null, null, 0); } diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index b1c3ab36175..0ac5c6aead2 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -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 * addresses. - * @param context the application context * @return the formatted and newline-separated IP addresses, or null if none. */ 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 * 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, Fragment resultTo, int resultRequestCode, int titleResId, - CharSequence title) { + CharSequence title, int metricsCategory) { 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 * 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, Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId, - CharSequence title) { + CharSequence title, int metricsCategory) { 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, Fragment resultTo, int resultRequestCode, int titleResId, - CharSequence title, boolean isShortcut) { + CharSequence title, boolean isShortcut, int metricsCategory) { Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, - null /* titleResPackageName */, titleResId, title, isShortcut); + null /* titleResPackageName */, titleResId, title, isShortcut, metricsCategory); if (resultTo == null) { context.startActivity(intent); } else { @@ -541,9 +544,9 @@ public final class Utils extends com.android.settingslib.Utils { public static void startWithFragment(Context context, String fragmentName, Bundle args, 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, - titleResId, title, isShortcut); + titleResId, title, isShortcut, metricsCategory); if (resultTo == null) { context.startActivity(intent); } else { @@ -552,30 +555,15 @@ public final class Utils extends com.android.settingslib.Utils { } 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) { // workaround to avoid crash in b/17523189 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 { Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, - null /* titleResPackageName */, titleResId, title, isShortcut); - 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); + null /* titleResPackageName */, titleResId, title, isShortcut, metricsCategory); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 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 title Optional title to show for this item. * @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 * fragment. */ public static Intent onBuildStartFragmentIntent(Context context, String fragmentName, Bundle args, String titleResPackageName, int titleResId, CharSequence title, - boolean isShortcut) { + boolean isShortcut, int sourceMetricsCategory) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.setClass(context, SubSettings.class); 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, title); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut); + intent.putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory); return intent; } @@ -1197,15 +1187,6 @@ public final class Utils extends com.android.settingslib.Utils { 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) { try { final ApplicationInfo ai = context.getPackageManager().getApplicationInfo( diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java index 0ccf6d8547f..cf723834386 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java +++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java @@ -85,8 +85,8 @@ public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivit } @Override - public void startPreferencePanel(String fragmentClass, Bundle args, int titleRes, - CharSequence titleText, Fragment resultTo, int resultRequestCode) { + public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args, + int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) { // Set the title. if (!TextUtils.isEmpty(titleText)) { setTitle(titleText); diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java index c08c924cbdd..635f4401b5a 100644 --- a/src/com/android/settings/accounts/AccountPreferenceController.java +++ b/src/com/android/settings/accounts/AccountPreferenceController.java @@ -45,6 +45,7 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.Utils; 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.events.OnPause; import com.android.settings.core.lifecycle.events.OnResume; @@ -89,6 +90,7 @@ public class AccountPreferenceController extends PreferenceController private int mAccountProfileOrder = ORDER_ACCOUNT_PROFILES; private AccountRestrictionHelper mHelper; private DashboardFeatureProvider mDashboardFeatureProvider; + private MetricsFeatureProvider mMetricsFeatureProvider; /** * Holds data related to the accounts belonging to one profile. @@ -135,8 +137,9 @@ public class AccountPreferenceController extends PreferenceController if (mAuthorities != null) { mAuthoritiesCount = mAuthorities.length; } - mDashboardFeatureProvider = - FeatureFactory.getFactory(mContext).getDashboardFeatureProvider(mContext); + final FeatureFactory featureFactory = FeatureFactory.getFactory(mContext); + mDashboardFeatureProvider = featureFactory.getDashboardFeatureProvider(mContext); + mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider(); mIAEnabled = mDashboardFeatureProvider.isEnabled(); mHelper = helper; } @@ -235,7 +238,7 @@ public class AccountPreferenceController extends PreferenceController if (preference == profileData.managedProfilePreference) { Bundle arguments = new Bundle(); arguments.putParcelable(Intent.EXTRA_USER, profileData.userInfo.getUserHandle()); - ((SettingsActivity) mParent.getActivity()).startPreferencePanel( + ((SettingsActivity) mParent.getActivity()).startPreferencePanel(mParent, ManagedProfileSettings.class.getName(), arguments, R.string.managed_profile_settings_title, null, null, 0); return true; @@ -446,7 +449,7 @@ public class AccountPreferenceController extends PreferenceController UserHandle userHandle) { final String[] accountTypes = helper.getEnabledAccountTypes(); final ArrayList accountTypePreferences = - new ArrayList(accountTypes.length); + new ArrayList<>(accountTypes.length); for (int i = 0; i < accountTypes.length; i++) { final String accountType = accountTypes[i]; @@ -489,7 +492,8 @@ public class AccountPreferenceController extends PreferenceController titleResId); fragmentArguments.putParcelable(EXTRA_USER, userHandle); accountTypePreferences.add(new AccountTypePreference( - prefContext, account.name, titleResPackageName, titleResId, label, + prefContext, mMetricsFeatureProvider.getMetricsCategory(mParent), + account.name, titleResPackageName, titleResId, label, AccountDetailDashboardFragment.class.getName(), fragmentArguments, icon)); } } else if (skipToAccount) { @@ -499,8 +503,9 @@ public class AccountPreferenceController extends PreferenceController fragmentArguments.putParcelable(EXTRA_USER, userHandle); accountTypePreferences.add(new AccountTypePreference( - prefContext, label, titleResPackageName, - titleResId, AccountSyncSettings.class.getName(), fragmentArguments, icon)); + prefContext, mMetricsFeatureProvider.getMetricsCategory(mParent), + label, titleResPackageName, titleResId, AccountSyncSettings.class.getName(), + fragmentArguments, icon)); } else { final Bundle fragmentArguments = new Bundle(); fragmentArguments.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE, accountType); @@ -509,9 +514,9 @@ public class AccountPreferenceController extends PreferenceController fragmentArguments.putParcelable(EXTRA_USER, userHandle); accountTypePreferences.add(new AccountTypePreference( - - prefContext, label, titleResPackageName, - titleResId, ManageAccountsSettings.class.getName(), fragmentArguments, icon)); + prefContext, mMetricsFeatureProvider.getMetricsCategory(mParent), label, + titleResPackageName, titleResId, ManageAccountsSettings.class.getName(), + fragmentArguments, icon)); } helper.preloadDrawableForType(mContext, accountType); } diff --git a/src/com/android/settings/accounts/AccountSyncPreferenceController.java b/src/com/android/settings/accounts/AccountSyncPreferenceController.java index 76750b39036..57d317b1d3f 100644 --- a/src/com/android/settings/accounts/AccountSyncPreferenceController.java +++ b/src/com/android/settings/accounts/AccountSyncPreferenceController.java @@ -24,6 +24,7 @@ import android.os.Bundle; import android.os.UserHandle; import android.support.v7.preference.Preference; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.Utils; import com.android.settings.core.PreferenceController; @@ -53,7 +54,7 @@ public class AccountSyncPreferenceController extends PreferenceController { args.putParcelable(AccountSyncSettings.ACCOUNT_KEY, mAccount); args.putParcelable(EXTRA_USER, mUserHandle); Utils.startWithFragment(mContext, AccountSyncSettings.class.getName(), args, null, 0, -1, - mAccount.name); + mAccount.name, MetricsProto.MetricsEvent.ACCOUNT); return true; } diff --git a/src/com/android/settings/accounts/AccountTypePreference.java b/src/com/android/settings/accounts/AccountTypePreference.java index bf3b9f509d2..0abfb5003b4 100644 --- a/src/com/android/settings/accounts/AccountTypePreference.java +++ b/src/com/android/settings/accounts/AccountTypePreference.java @@ -65,15 +65,18 @@ public class AccountTypePreference extends Preference implements OnPreferenceCli */ private final Bundle mFragmentArguments; - public AccountTypePreference(Context context, CharSequence title, String titleResPackageName, - int titleResId, String fragment, Bundle fragmentArguments, Drawable icon) { - this(context, title, titleResPackageName, titleResId, null, fragment, fragmentArguments, - icon); + private final int mMetricsCategory; + + public AccountTypePreference(Context context, int metricsCategory, CharSequence title, + 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, - int titleResId, CharSequence summary, String fragment, Bundle fragmentArguments, - Drawable icon) { + public AccountTypePreference(Context context, int metricsCategory, CharSequence title, + String titleResPackageName, int titleResId, CharSequence summary, String fragment, + Bundle fragmentArguments, Drawable icon) { super(context); mTitle = title; mTitleResPackageName = titleResPackageName; @@ -81,6 +84,7 @@ public class AccountTypePreference extends Preference implements OnPreferenceCli mSummary = summary; mFragment = fragment; mFragmentArguments = fragmentArguments; + mMetricsCategory = metricsCategory; setWidgetLayoutResource(R.layout.account_type_preference); setTitle(title); @@ -105,7 +109,7 @@ public class AccountTypePreference extends Preference implements OnPreferenceCli } Utils.startWithFragment(getContext(), mFragment, mFragmentArguments, null /* resultTo */, 0 /* resultRequestCode */, mTitleResPackageName, - mTitleResId, null /* title */); + mTitleResId, null /* title */, mMetricsCategory); return true; } return false; diff --git a/src/com/android/settings/accounts/AccountTypePreferenceLoader.java b/src/com/android/settings/accounts/AccountTypePreferenceLoader.java index 87f9c77373a..87aec14597f 100644 --- a/src/com/android/settings/accounts/AccountTypePreferenceLoader.java +++ b/src/com/android/settings/accounts/AccountTypePreferenceLoader.java @@ -229,7 +229,7 @@ public class AccountTypePreferenceLoader { @Override public boolean onPreferenceClick(Preference preference) { - ((SettingsActivity) mFragment.getActivity()).startPreferencePanel( + ((SettingsActivity) mFragment.getActivity()).startPreferencePanel(mFragment, mClass, null, mTitleRes, null, null, 0); // Hack: announce that the Google account preferences page is launching the location // settings diff --git a/src/com/android/settings/accounts/ManageAccountsSettings.java b/src/com/android/settings/accounts/ManageAccountsSettings.java index 7c5ee003179..f93fe092c32 100644 --- a/src/com/android/settings/accounts/ManageAccountsSettings.java +++ b/src/com/android/settings/accounts/ManageAccountsSettings.java @@ -158,7 +158,7 @@ public class ManageAccountsSettings extends AccountPreferenceBase Bundle args = new Bundle(); args.putParcelable(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount()); args.putParcelable(EXTRA_USER, mUserHandle); - ((SettingsActivity) getActivity()).startPreferencePanel( + ((SettingsActivity) getActivity()).startPreferencePanel(this, AccountSyncSettings.class.getCanonicalName(), args, R.string.account_sync_settings_title, acctPref.getAccount().name, this, REQUEST_SHOW_SYNC_SETTINGS); diff --git a/src/com/android/settings/applications/AppHeaderController.java b/src/com/android/settings/applications/AppHeaderController.java index daafc186fda..01d5fc74d73 100644 --- a/src/com/android/settings/applications/AppHeaderController.java +++ b/src/com/android/settings/applications/AppHeaderController.java @@ -38,6 +38,7 @@ import com.android.settings.AppHeader; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.applications.instantapps.InstantAppDetails; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState; import java.lang.annotation.Retention; @@ -65,6 +66,7 @@ public class AppHeaderController { private final Context mContext; private final Fragment mFragment; + private final int mMetricsCategory; private final View mAppHeader; private Drawable mIcon; @@ -84,6 +86,8 @@ public class AppHeaderController { public AppHeaderController(Context context, Fragment fragment, View appHeader) { mContext = context; mFragment = fragment; + mMetricsCategory = FeatureFactory.getFactory(context).getMetricsFeatureProvider() + .getMetricsCategory(fragment); if (appHeader != null) { mAppHeader = appHeader; } else { @@ -266,7 +270,7 @@ public class AppHeaderController { button.setImageResource(com.android.settings.R.drawable.ic_info); button.setOnClickListener(v -> AppInfoBase.startAppInfoFragment( InstalledAppDetails.class, R.string.application_info_label, - mPackageName, mUid, mFragment, 0)); + mPackageName, mUid, mFragment, 0 /* request */, mMetricsCategory)); button.setVisibility(View.VISIBLE); } return; diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 015347dc058..b86f2f49477 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -215,18 +215,19 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment } public static void startAppInfoFragment(Class fragment, int titleRes, - String pkg, int uid, Fragment source, int request) { - startAppInfoFragment(fragment, titleRes, pkg, uid, source.getActivity(), request); + String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) { + startAppInfoFragment(fragment, titleRes, pkg, uid, source.getActivity(), request, + sourceMetricsCategory); } 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(); args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg); args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid); Intent intent = Utils.onBuildStartFragmentIntent(source, fragment.getName(), - args, null, titleRes, null, false); + args, null, titleRes, null, false, sourceMetricsCategory); source.startActivityForResultAsUser(intent, request, new UserHandle(UserHandle.getUserId(uid))); } diff --git a/src/com/android/settings/applications/AppOpsCategory.java b/src/com/android/settings/applications/AppOpsCategory.java index 4b548912f5b..e27e05bef48 100644 --- a/src/com/android/settings/applications/AppOpsCategory.java +++ b/src/com/android/settings/applications/AppOpsCategory.java @@ -358,10 +358,10 @@ public class AppOpsCategory extends ListFragment implements args.putString(AppOpsDetails.ARG_PACKAGE_NAME, mCurrentPkgName); 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); } - + @Override public void onListItemClick(ListView l, View v, int position, long id) { AppOpEntry entry = mAdapter.getItem(position); if (entry != null) { diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java index 2d2bce060c1..31d26ed9eee 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -19,11 +19,8 @@ package com.android.settings.applications; import android.app.Fragment; import android.content.Context; import android.content.Intent; -import android.content.pm.ActivityInfo; import android.content.pm.ComponentInfo; -import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; import android.os.RemoteException; import android.os.UserHandle; diff --git a/src/com/android/settings/applications/ConvertToFbe.java b/src/com/android/settings/applications/ConvertToFbe.java index da5f90d1043..be3c371ccb9 100644 --- a/src/com/android/settings/applications/ConvertToFbe.java +++ b/src/com/android/settings/applications/ConvertToFbe.java @@ -79,7 +79,7 @@ public class ConvertToFbe extends SettingsPreferenceFragment { private void convert() { 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); } diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index 73164e4cfe0..4d27bb64d77 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -811,7 +811,8 @@ public class InstalledAppDetails extends AppInfoBase args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); 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)); } else if (preference == mBatteryPreference) { 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); } else { return false; diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index d5f7f78c50d..22f1627bc2a 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -17,7 +17,6 @@ package com.android.settings.applications; import android.app.Activity; -import android.app.usage.StorageStatsManager; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -33,7 +32,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.preference.PreferenceFrameLayout; import android.text.TextUtils; -import android.text.format.Formatter; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -564,7 +562,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment private void startAppInfoFragment(Class fragment, int titleRes) { AppInfoBase.startAppInfoFragment(fragment, titleRes, mCurrentPkgName, mCurrentUid, this, - INSTALLED_APP_DETAILS); + INSTALLED_APP_DETAILS, getMetricsCategory()); } @Override @@ -631,11 +629,11 @@ public class ManageApplications extends InstrumentedPreferenceFragment return true; case R.id.advanced: if (mListType == LIST_TYPE_NOTIFICATION) { - ((SettingsActivity) getActivity()).startPreferencePanel( + ((SettingsActivity) getActivity()).startPreferencePanel(this, ConfigureNotificationSettings.class.getName(), null, R.string.configure_notification_settings, null, this, ADVANCED_SETTINGS); } else { - ((SettingsActivity) getActivity()).startPreferencePanel( + ((SettingsActivity) getActivity()).startPreferencePanel(this, AdvancedAppSettings.class.getName(), null, R.string.configure_apps, null, this, ADVANCED_SETTINGS); } diff --git a/src/com/android/settings/applications/ManageDomainUrls.java b/src/com/android/settings/applications/ManageDomainUrls.java index 4a64900e1ac..b09a089ae4d 100644 --- a/src/com/android/settings/applications/ManageDomainUrls.java +++ b/src/com/android/settings/applications/ManageDomainUrls.java @@ -206,7 +206,7 @@ public class ManageDomainUrls extends SettingsPreferenceFragment ApplicationsState.AppEntry entry = ((DomainAppPreference) preference).mEntry; AppInfoBase.startAppInfoFragment(AppLaunchSettings.class, R.string.auto_launch_label, entry.info.packageName, entry.info.uid, this, - INSTALLED_APP_DETAILS); + INSTALLED_APP_DETAILS, getMetricsCategory()); return true; } return false; diff --git a/src/com/android/settings/applications/ProcessStatsBase.java b/src/com/android/settings/applications/ProcessStatsBase.java index 6b219166275..7aa3cc7565e 100644 --- a/src/com/android/settings/applications/ProcessStatsBase.java +++ b/src/com/android/settings/applications/ProcessStatsBase.java @@ -139,7 +139,7 @@ public abstract class ProcessStatsBase extends SettingsPreferenceFragment memInfo.usedWeight * memInfo.weightToRam); args.putDouble(ProcessStatsDetail.EXTRA_TOTAL_SCALE, memInfo.totalScale); 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); } } diff --git a/src/com/android/settings/applications/RunningProcessesView.java b/src/com/android/settings/applications/RunningProcessesView.java index 917d3ab1e2c..dcb6f9e95aa 100644 --- a/src/com/android/settings/applications/RunningProcessesView.java +++ b/src/com/android/settings/applications/RunningProcessesView.java @@ -411,7 +411,7 @@ public class RunningProcessesView extends FrameLayout args.putBoolean(RunningServiceDetails.KEY_BACKGROUND, mAdapter.mShowBackground); 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); } } diff --git a/src/com/android/settings/applications/ShortcutPreference.java b/src/com/android/settings/applications/ShortcutPreference.java index e3db57a9444..91b41b79c98 100644 --- a/src/com/android/settings/applications/ShortcutPreference.java +++ b/src/com/android/settings/applications/ShortcutPreference.java @@ -17,6 +17,8 @@ package com.android.settings.applications; import android.content.Context; import android.os.Bundle; import android.support.v7.preference.Preference; + +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsActivity; import com.android.settings.Utils; @@ -42,6 +44,6 @@ public class ShortcutPreference extends Preference { Bundle bundle = new Bundle(); bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, mPrefKey); Utils.startWithFragment(getContext(), mTarget.getName(), bundle, null, 0, - mTitle, null); + mTitle, null, MetricsProto.MetricsEvent.VIEW_UNKNOWN); } } diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java index 6e7ae479605..7a8ff4cc43c 100644 --- a/src/com/android/settings/bluetooth/BluetoothSettings.java +++ b/src/com/android/settings/bluetooth/BluetoothSettings.java @@ -423,7 +423,8 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment implem public void onClick() { final SettingsActivity activity = (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); } }); diff --git a/src/com/android/settings/core/InstrumentedPreferenceFragment.java b/src/com/android/settings/core/InstrumentedPreferenceFragment.java index ce0daa971ed..91ef3f17e29 100644 --- a/src/com/android/settings/core/InstrumentedPreferenceFragment.java +++ b/src/com/android/settings/core/InstrumentedPreferenceFragment.java @@ -30,8 +30,8 @@ import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.core.instrumentation.VisibilityLoggerMixin; import com.android.settings.core.lifecycle.ObservablePreferenceFragment; import com.android.settings.overlay.FeatureFactory; -import com.android.settings.widget.PreferenceDividerDecoration; import com.android.settings.survey.SurveyMixin; +import com.android.settings.widget.PreferenceDividerDecoration; /** * Instrumented fragment that logs visibility state. @@ -47,9 +47,12 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc private final PreferenceDividerDecoration mDividerDecoration = new PreferenceDividerDecoration(); + private final VisibilityLoggerMixin mVisibilityLoggerMixin; + public InstrumentedPreferenceFragment() { // 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())); } @@ -67,6 +70,12 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc return view; } + @Override + public void onResume() { + mVisibilityLoggerMixin.setSourceMetricsCategory(getActivity()); + super.onResume(); + } + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { } diff --git a/src/com/android/settings/core/instrumentation/EventLogWriter.java b/src/com/android/settings/core/instrumentation/EventLogWriter.java index 930451207ed..0a85649a8e7 100644 --- a/src/com/android/settings/core/instrumentation/EventLogWriter.java +++ b/src/com/android/settings/core/instrumentation/EventLogWriter.java @@ -27,8 +27,11 @@ import com.android.internal.logging.nano.MetricsProto; */ public class EventLogWriter implements LogWriter { - public void visible(Context context, int category) { - MetricsLogger.visible(context, category); + public void visible(Context context, int source, int 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) { diff --git a/src/com/android/settings/core/instrumentation/LogWriter.java b/src/com/android/settings/core/instrumentation/LogWriter.java index 4a2fc6caf8c..88dd4df78d0 100644 --- a/src/com/android/settings/core/instrumentation/LogWriter.java +++ b/src/com/android/settings/core/instrumentation/LogWriter.java @@ -25,7 +25,7 @@ public interface LogWriter { /** * 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. diff --git a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java index 13a4d7e50a8..24c5e8cd107 100644 --- a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java +++ b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java @@ -16,7 +16,8 @@ package com.android.settings.core.instrumentation; import android.content.Context; -import android.metrics.LogMaker; + +import com.android.internal.logging.nano.MetricsProto; import java.util.ArrayList; import java.util.List; @@ -37,9 +38,9 @@ public class MetricsFeatureProvider { mLoggerWriters.add(new SettingSuggestionsLogWriter()); } - public void visible(Context context, int category) { + public void visible(Context context, int source, int category) { 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); } } + + public int getMetricsCategory(Object object) { + if (object == null || !(object instanceof Instrumentable)) { + return MetricsProto.MetricsEvent.VIEW_UNKNOWN; + } + return ((Instrumentable) object).getMetricsCategory(); + } } diff --git a/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java b/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java index 3b94fe7b794..44d2554501e 100644 --- a/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java +++ b/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java @@ -31,7 +31,7 @@ public class SettingSuggestionsLogWriter implements LogWriter { private EventStore mEventStore; @Override - public void visible(Context context, int category) { + public void visible(Context context, int source, int category) { } @Override diff --git a/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java b/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java index 54183a2ede8..fcd32d1cb3b 100644 --- a/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java +++ b/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java @@ -16,8 +16,12 @@ package com.android.settings.core.instrumentation; +import android.app.Activity; 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.events.OnAttach; 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 { + private static final String TAG = "VisibilityLoggerMixin"; + private final int mMetricsCategory; private MetricsFeatureProvider mMetricsFeature; + private int mSourceMetricsCategory = MetricsProto.MetricsEvent.VIEW_UNKNOWN; public VisibilityLoggerMixin(int metricsCategory) { // MetricsFeature will be set during onAttach. @@ -53,7 +60,7 @@ public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPau @Override public void onResume() { 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); } } + + /** + * 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); + } } diff --git a/src/com/android/settings/dashboard/DashboardFeatureProvider.java b/src/com/android/settings/dashboard/DashboardFeatureProvider.java index 7f91d16c1da..78458295e1f 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProvider.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProvider.java @@ -16,6 +16,7 @@ package com.android.settings.dashboard; import android.app.Activity; +import android.app.Fragment; import android.content.Context; import android.support.v7.preference.Preference; @@ -44,26 +45,21 @@ public interface DashboardFeatureProvider { * * @param activity Activity hosting the preference * @param context UI context to inflate preference + * @param sourceMetricsCategory The context (source) from which an action is performed * @param key Value from CategoryKey * @deprecated Pages implementing {@code DashboardFragment} should use * {@link #getTilesForCategory(String)} instead. Using this method will not get the benefit * of auto-ordering, progressive disclosure, auto-refreshing summary text etc. */ @Deprecated - List getPreferencesForCategory(Activity activity, Context context, String key); + List getPreferencesForCategory(Activity activity, Context context, + int sourceMetricsCategory, String key); /** * Get all tiles, grouped by category. */ List 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. */ @@ -73,14 +69,15 @@ public interface DashboardFeatureProvider { * Binds preference to data provided by tile. * * @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 tile The binding 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 * both this value and tile's own priority. */ - void bindPreferenceToTile(Activity activity, Preference pref, Tile tile, String key, - int baseOrder); + void bindPreferenceToTile(Activity activity, int sourceMetricsCategory, Preference pref, + Tile tile, String key, int baseOrder); /** * Returns a {@link ProgressiveDisclosureMixin} for specified fragment. diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 395a8bdf1fc..69105b5df6f 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -80,7 +80,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { @Override public List getPreferencesForCategory(Activity activity, Context context, - String key) { + int sourceMetricsCategory, String key) { if (!isEnabled()) { return null; } @@ -97,7 +97,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { final List preferences = new ArrayList<>(); for (Tile tile : tiles) { final Preference pref = new Preference(context); - bindPreferenceToTile(activity, pref, tile, null /* key */, + bindPreferenceToTile(activity, sourceMetricsCategory, pref, tile, null /* key */, Preference.DEFAULT_ORDER /* baseOrder */); preferences.add(pref); } @@ -109,11 +109,6 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { return mCategoryManager.getCategories(mContext); } - @Override - public int getPriorityGroup(Preference preference) { - return preference.getOrder() / 100; - } - @Override public String getDashboardKeyForTile(Tile tile) { if (tile == null || tile.intent == null) { @@ -129,8 +124,8 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { } @Override - public void bindPreferenceToTile(Activity activity, Preference pref, Tile tile, String key, - int baseOrder) { + public void bindPreferenceToTile(Activity activity, int sourceMetricsCategory, Preference pref, + Tile tile, String key, int baseOrder) { pref.setTitle(tile.title); if (!TextUtils.isEmpty(key)) { pref.setKey(key); @@ -152,6 +147,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { pref.setFragment(clsName); } else if (tile.intent != null) { final Intent intent = new Intent(tile.intent); + intent.putExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory); if (action != null) { intent.setAction(action); } diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index f8a27e0df9e..d650fc703fd 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -330,13 +330,13 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment // Have the key already, will rebind. final Preference preference = mProgressiveDisclosureMixin.findPreference( screen, key); - mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), preference, tile, key, - mPlaceholderPreferenceController.getOrder()); + mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), getMetricsCategory(), + preference, tile, key, mPlaceholderPreferenceController.getOrder()); } else { // Don't have this key, add it. final Preference pref = new Preference(getPrefContext()); - mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), pref, tile, key, - mPlaceholderPreferenceController.getOrder()); + mDashboardFeatureProvider.bindPreferenceToTile(getActivity(), getMetricsCategory(), + pref, tile, key, mPlaceholderPreferenceController.getOrder()); mProgressiveDisclosureMixin.addPreference(screen, pref); mDashboardTilePrefKeys.add(key); } diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java index a5a4f4308a6..ce1cf650173 100644 --- a/src/com/android/settings/dashboard/DashboardSummary.java +++ b/src/com/android/settings/dashboard/DashboardSummary.java @@ -134,9 +134,11 @@ public class DashboardSummary extends InstrumentedFragment ((SettingsDrawerActivity) getActivity()).addCategoryListener(this); mSummaryLoader.setListening(true); + final int metricsCategory = getMetricsCategory(); for (Condition c : mConditionManager.getConditions()) { if (c.shouldShow()) { - mMetricsFeatureProvider.visible(getContext(), c.getMetricsConstant()); + mMetricsFeatureProvider.visible(getContext(), metricsCategory, + c.getMetricsConstant()); } } if (DEBUG_TIMING) { diff --git a/src/com/android/settings/dashboard/SearchResultsSummary.java b/src/com/android/settings/dashboard/SearchResultsSummary.java index ef84f8befcc..06b71d69646 100644 --- a/src/com/android/settings/dashboard/SearchResultsSummary.java +++ b/src/com/android/settings/dashboard/SearchResultsSummary.java @@ -194,7 +194,8 @@ public class SearchResultsSummary extends InstrumentedPreferenceFragment { Bundle args = new Bundle(); 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 { final Intent intent = new Intent(action); diff --git a/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java b/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java index b3e3504d00d..7feac237084 100644 --- a/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java +++ b/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java @@ -56,7 +56,7 @@ public class BatterySaverCondition extends Condition { @Override public void onPrimaryClick() { 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 diff --git a/src/com/android/settings/dashboard/conditional/HotspotCondition.java b/src/com/android/settings/dashboard/conditional/HotspotCondition.java index 2f25da54b23..19e0e85f825 100644 --- a/src/com/android/settings/dashboard/conditional/HotspotCondition.java +++ b/src/com/android/settings/dashboard/conditional/HotspotCondition.java @@ -91,7 +91,7 @@ public class HotspotCondition extends Condition { @Override public void onPrimaryClick() { 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 diff --git a/src/com/android/settings/dashboard/conditional/NightDisplayCondition.java b/src/com/android/settings/dashboard/conditional/NightDisplayCondition.java index 11d6c0fc0d8..bfcab7f9264 100644 --- a/src/com/android/settings/dashboard/conditional/NightDisplayCondition.java +++ b/src/com/android/settings/dashboard/conditional/NightDisplayCondition.java @@ -63,7 +63,7 @@ public final class NightDisplayCondition extends Condition @Override public void onPrimaryClick() { 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 diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java index 44312b785d4..8e450df810e 100644 --- a/src/com/android/settings/datausage/BillingCyclePreference.java +++ b/src/com/android/settings/datausage/BillingCyclePreference.java @@ -22,6 +22,8 @@ import android.os.Bundle; import android.os.RemoteException; import android.support.v7.preference.Preference; import android.util.AttributeSet; + +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.datausage.CellDataPreference.DataStateListener; @@ -76,7 +78,7 @@ public class BillingCyclePreference extends Preference implements TemplatePrefer Bundle args = new Bundle(); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); 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() { diff --git a/src/com/android/settings/datausage/DataUsagePreference.java b/src/com/android/settings/datausage/DataUsagePreference.java index bd865b5cc37..0c7b33f38a8 100644 --- a/src/com/android/settings/datausage/DataUsagePreference.java +++ b/src/com/android/settings/datausage/DataUsagePreference.java @@ -22,6 +22,8 @@ import android.support.v7.preference.Preference; import android.telephony.SubscriptionManager; import android.text.format.Formatter; import android.util.AttributeSet; + +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.Utils; import com.android.settingslib.net.DataUsageController; import com.android.settings.R; @@ -53,6 +55,7 @@ public class DataUsagePreference extends Preference implements TemplatePreferenc args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); args.putInt(DataUsageList.EXTRA_SUB_ID, mSubId); return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(), args, - getContext().getPackageName(), 0, getTitle(), false); + getContext().getPackageName(), 0, getTitle(), false, + MetricsProto.MetricsEvent.VIEW_UNKNOWN); } } diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java index ce26c0fea21..6c3b9e62450 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java @@ -479,7 +479,7 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment { args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription()); intent = Utils.onBuildStartFragmentIntent(getActivity(), ManageApplications.class.getName(), args, null, R.string.apps_storage, null, - false); + false, getMetricsCategory()); } break; case R.string.storage_detail_images: { diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index cf704295c7e..31bcc4eb13a 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -235,8 +235,8 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index final Bundle args = new Bundle(); args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL); Intent intent = Utils.onBuildStartFragmentIntent(getActivity(), - StorageDashboardFragment.class.getName(), args, null, R.string.apps_storage, null, - false); + StorageDashboardFragment.class.getName(), args, null, R.string.apps_storage, + null, false, getMetricsCategory()); intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true); getActivity().startActivity(intent); finish(); diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java index 627b8774749..63c37d8205c 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java @@ -38,6 +38,8 @@ import com.android.settings.Utils; import com.android.settings.applications.ManageApplications; import com.android.settings.applications.PackageManagerWrapperImpl; 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.StorageVolumeProvider; @@ -67,6 +69,7 @@ public class StorageItemPreferenceController extends PreferenceController static final String FILES_KEY = "pref_files"; private final Fragment mFragment; + private final MetricsFeatureProvider mMetricsFeatureProvider; private final StorageVolumeProvider mSvp; private VolumeInfo mVolume; private final int mUserId; @@ -87,7 +90,7 @@ public class StorageItemPreferenceController extends PreferenceController mFragment = hostFragment; mVolume = volume; mSvp = svp; - + mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); UserManager um = mContext.getSystemService(UserManager.class); mUserId = um.getUserHandle(); } @@ -213,7 +216,7 @@ public class StorageItemPreferenceController extends PreferenceController args.putInt(ManageApplications.EXTRA_STORAGE_TYPE, ManageApplications.STORAGE_TYPE_MUSIC); return Utils.onBuildStartFragmentIntent(mContext, ManageApplications.class.getName(), args, null, R.string.audio_storage_title, null, - false); + false, mMetricsFeatureProvider.getMetricsCategory(mFragment)); } private Intent getAppsIntent() { @@ -224,7 +227,7 @@ public class StorageItemPreferenceController extends PreferenceController args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription()); return Utils.onBuildStartFragmentIntent(mContext, ManageApplications.class.getName(), args, null, R.string.apps_storage, null, - false); + false, mMetricsFeatureProvider.getMetricsCategory(mFragment)); } private Intent getGamesIntent() { @@ -233,7 +236,7 @@ public class StorageItemPreferenceController extends PreferenceController Settings.GamesStorageActivity.class.getName()); return Utils.onBuildStartFragmentIntent(mContext, ManageApplications.class.getName(), args, null, R.string.game_storage_settings, - null, false); + null, false, mMetricsFeatureProvider.getMetricsCategory(mFragment)); } private Intent getFilesIntent() { diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java index dace4da3376..154a9016159 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java @@ -35,6 +35,7 @@ import android.os.Bundle; import android.os.Process; import android.os.UserHandle; import android.provider.SearchIndexableResource; +import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.PreferenceCategory; @@ -88,9 +89,9 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi R.string.battery_desc_camera, }; - public static void startBatteryDetailPage( - SettingsActivity caller, BatteryStatsHelper helper, int statsType, BatteryEntry entry, - boolean showLocationButton, boolean includeAppInfo) { + public static void startBatteryDetailPage(SettingsActivity caller, + PreferenceFragment fragment, BatteryStatsHelper helper, int statsType, + BatteryEntry entry, boolean showLocationButton, boolean includeAppInfo) { // Initialize mStats if necessary. helper.getStats(); @@ -283,7 +284,7 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi args.putIntArray(PowerUsageDetail.EXTRA_DETAIL_TYPES, types); 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)); } @@ -550,7 +551,7 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackages[0]); 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); } @@ -558,26 +559,26 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi SettingsActivity sa = (SettingsActivity)getActivity(); switch (action) { 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); break; case ACTION_WIFI_SETTINGS: - sa.startPreferencePanel(WifiSettings.class.getName(), null, + sa.startPreferencePanel(this, WifiSettings.class.getName(), null, R.string.wifi_settings, null, null, 0); break; case ACTION_BLUETOOTH_SETTINGS: - sa.startPreferencePanel(BluetoothSettings.class.getName(), null, + sa.startPreferencePanel(this, BluetoothSettings.class.getName(), null, R.string.bluetooth_settings, null, null, 0); break; 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); break; case ACTION_APP_DETAILS: startApplicationDetailsActivity(); break; 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); break; case ACTION_FORCE_STOP: diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index 7b64ddfa570..75787d5d592 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -40,7 +40,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.TextView; -import android.widget.Toast; + import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatterySipper.DrainType; @@ -141,8 +141,8 @@ public class PowerUsageSummary extends PowerUsageBase { } PowerGaugePreference pgp = (PowerGaugePreference) preference; BatteryEntry entry = pgp.getInfo(); - PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), mStatsHelper, - mStatsType, entry, true, true); + PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), this, + mStatsHelper, mStatsType, entry, true, true); return super.onPreferenceTreeClick(preference); } @@ -206,7 +206,7 @@ public class PowerUsageSummary extends PowerUsageBase { Bundle args = new Bundle(); args.putString(ManageApplications.EXTRA_CLASSNAME, HighPowerApplicationsActivity.class.getName()); - sa.startPreferencePanel(ManageApplications.class.getName(), args, + sa.startPreferencePanel(this, ManageApplications.class.getName(), args, R.string.high_power_apps, null, null, 0); return true; case MENU_ADDITIONAL_BATTERY_INFO: @@ -237,7 +237,7 @@ public class PowerUsageSummary extends PowerUsageBase { if (featureProvider.isAdvancedUiEnabled()) { 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 { mStatsHelper.storeStatsHistoryInFile(BatteryHistoryDetail.BATTERY_HISTORY_FILE); Bundle args = new Bundle(2); @@ -246,7 +246,7 @@ public class PowerUsageSummary extends PowerUsageBase { args.putParcelable(BatteryHistoryDetail.EXTRA_BROADCAST, mStatsHelper.getBatteryBroadcast()); Utils.startWithFragment(getContext(), BatteryHistoryDetail.class.getName(), args, - null, 0, R.string.history_details_title, null); + null, 0, R.string.history_details_title, null, getMetricsCategory()); } } diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java index 4177afbae3e..72d54b88320 100644 --- a/src/com/android/settings/location/LocationSettings.java +++ b/src/com/android/settings/location/LocationSettings.java @@ -194,6 +194,7 @@ public class LocationSettings extends LocationSettingsBase @Override public boolean onPreferenceClick(Preference preference) { activity.startPreferencePanel( + LocationSettings.this, LocationMode.class.getName(), null, R.string.location_mode_screen_title, null, LocationSettings.this, 0); @@ -348,6 +349,7 @@ public class LocationSettings extends LocationSettingsBase switch (item.getItemId()) { case MENU_SCANNING: activity.startPreferencePanel( + this, ScanningSettings.class.getName(), null, R.string.location_scanning_screen_title, null, LocationSettings.this, 0); @@ -467,6 +469,7 @@ public class LocationSettings extends LocationSettingsBase Bundle args = new Bundle(); args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackage); ((SettingsActivity) getActivity()).startPreferencePanelAsUser( + LocationSettings.this, InstalledAppDetails.class.getName(), args, R.string.application_info_label, null, mUserHandle); return true; diff --git a/src/com/android/settings/network/NetworkResetActionMenuController.java b/src/com/android/settings/network/NetworkResetActionMenuController.java index 67c37a42edd..d5065d1b89a 100644 --- a/src/com/android/settings/network/NetworkResetActionMenuController.java +++ b/src/com/android/settings/network/NetworkResetActionMenuController.java @@ -23,6 +23,7 @@ import android.support.annotation.VisibleForTesting; import android.view.Menu; import android.view.MenuItem; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.ResetNetwork; import com.android.settings.Utils; @@ -45,7 +46,8 @@ public class NetworkResetActionMenuController { if (item != null) { item.setOnMenuItemClickListener(target -> { 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; }); } diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java index 0d7fb93b998..d0f6f2eb4bd 100644 --- a/src/com/android/settings/notification/AppNotificationSettings.java +++ b/src/com/android/settings/notification/AppNotificationSettings.java @@ -198,7 +198,7 @@ public class AppNotificationSettings extends NotificationSettingsBase { channelArgs.putString(Settings.EXTRA_CHANNEL_ID, channel.getId()); Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(), ChannelNotificationSettings.class.getName(), - channelArgs, null, 0, null, false); + channelArgs, null, 0, null, false, getMetricsCategory()); channelPref.setIntent(channelIntent); channelPref.setOnPreferenceChangeListener( diff --git a/src/com/android/settings/search2/CursorToSearchResultConverter.java b/src/com/android/settings/search2/CursorToSearchResultConverter.java index 6549c183140..bcb2e9da261 100644 --- a/src/com/android/settings/search2/CursorToSearchResultConverter.java +++ b/src/com/android/settings/search2/CursorToSearchResultConverter.java @@ -29,6 +29,7 @@ import android.os.Bundle; import android.text.TextUtils; import android.util.Log; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsActivity; import com.android.settings.Utils; import com.android.settings.dashboard.SiteMapManager; @@ -187,7 +188,8 @@ class CursorToSearchResultConverter { final Bundle args = new Bundle(); args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key); 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); } else { final Intent intent = new Intent(action); diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index c49aa1d1af8..000ccf5cbdc 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -439,7 +439,7 @@ public class UserSettings extends SettingsPreferenceFragment if (userId == UserPreference.USERID_GUEST_DEFAULTS) { Bundle extras = new Bundle(); extras.putBoolean(UserDetailsSettings.EXTRA_USER_GUEST, true); - ((SettingsActivity) getActivity()).startPreferencePanel( + ((SettingsActivity) getActivity()).startPreferencePanel(this, UserDetailsSettings.class.getName(), extras, R.string.user_guest, null, null, 0); return; @@ -449,7 +449,7 @@ public class UserSettings extends SettingsPreferenceFragment Bundle extras = new Bundle(); extras.putInt(RestrictedProfileSettings.EXTRA_USER_ID, userId); extras.putBoolean(RestrictedProfileSettings.EXTRA_NEW_USER, newUser); - ((SettingsActivity) getActivity()).startPreferencePanel( + ((SettingsActivity) getActivity()).startPreferencePanel(this, RestrictedProfileSettings.class.getName(), extras, R.string.user_restrictions_title, null, null, 0); @@ -459,7 +459,7 @@ public class UserSettings extends SettingsPreferenceFragment } else if (mUserCaps.mIsAdmin) { Bundle extras = new Bundle(); extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userId); - ((SettingsActivity) getActivity()).startPreferencePanel( + ((SettingsActivity) getActivity()).startPreferencePanel(this, UserDetailsSettings.class.getName(), extras, -1, /* No title res id */ diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java index f86e6777a9b..9ef087b3df3 100644 --- a/src/com/android/settings/vpn2/AppManagementFragment.java +++ b/src/com/android/settings/vpn2/AppManagementFragment.java @@ -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(); args.putString(ARG_PACKAGE_NAME, pref.getPackageName()); Utils.startWithFragmentAsUser(context, AppManagementFragment.class.getName(), args, -1, - pref.getLabel(), false, new UserHandle(pref.getUserId())); + pref.getLabel(), false, sourceMetricsCategory, new UserHandle(pref.getUserId())); } @Override diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java index 2998319bee8..ead2143bd6e 100644 --- a/src/com/android/settings/vpn2/VpnSettings.java +++ b/src/com/android/settings/vpn2/VpnSettings.java @@ -405,8 +405,8 @@ public class VpnSettings extends RestrictedSettingsFragment implements ConfigDialogFragment.show(VpnSettings.this, pref.getProfile(), true /* editing */, true /* exists */); } else if (p instanceof AppPreference) { - AppPreference pref = (AppPreference) p;; - AppManagementFragment.show(getPrefContext(), pref); + AppPreference pref = (AppPreference) p; + AppManagementFragment.show(getPrefContext(), pref, getMetricsCategory()); } } }; diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index c4b90c78054..a903c09ad1b 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -850,8 +850,9 @@ public class WifiSettings extends RestrictedSettingsFragment @Override public void onClick() { final SettingsActivity activity = (SettingsActivity) getActivity(); - activity.startPreferencePanel(ScanningSettings.class.getName(), null, - R.string.location_scanning_screen_title, null, null, 0); + activity.startPreferencePanel(WifiSettings.this, + ScanningSettings.class.getName(), + null, R.string.location_scanning_screen_title, null, null, 0); } }; mStatusMessagePreference.setText( diff --git a/tests/robotests/src/com/android/settings/DevelopmentSettingsTest.java b/tests/robotests/src/com/android/settings/DevelopmentSettingsTest.java index e51862092bf..3e7d4acfddd 100644 --- a/tests/robotests/src/com/android/settings/DevelopmentSettingsTest.java +++ b/tests/robotests/src/com/android/settings/DevelopmentSettingsTest.java @@ -79,7 +79,8 @@ public class DevelopmentSettingsTest { doReturn(mActivity).when(mSettings).getActivity(); when(mPreferenceManager.getContext()).thenReturn(mContext); when(mFeatureFactory.dashboardFeatureProvider.getPreferencesForCategory( - mActivity, mContext, CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT)) + mActivity, mContext, mSettings.getMetricsCategory(), + CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT)) .thenReturn(preferences); mSettings.onAttach(mContext); diff --git a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java index 744bc0f395c..4cc39fb40c2 100644 --- a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java @@ -24,6 +24,7 @@ import android.content.pm.PackageManager; import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceScreen; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; @@ -57,18 +58,20 @@ public class AppInfoWithHeaderTest { FakeFeatureFactory.setupForTest(mContext); mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); - + when(mFactory.metricsFeatureProvider.getMetricsCategory(any(Object.class))) + .thenReturn(MetricsProto.MetricsEvent.SETTINGS_APP_NOTIF_CATEGORY); mAppInfoWithHeader = new TestFragment(); } @Test public void testAppHeaderIsAdded() { + final AppHeaderController appHeaderController = new AppHeaderController( + ShadowApplication.getInstance().getApplicationContext(), + mAppInfoWithHeader, + null); when(mFactory.dashboardFeatureProvider.isEnabled()).thenReturn(true); when(mFactory.applicationFeatureProvider.newAppHeaderController(mAppInfoWithHeader, null)) - .thenReturn(new AppHeaderController( - ShadowApplication.getInstance().getApplicationContext(), - mAppInfoWithHeader, - null)); + .thenReturn(appHeaderController); mAppInfoWithHeader.onActivityCreated(null); verify(mAppInfoWithHeader.mScreen).addPreference(any(LayoutPreference.class)); diff --git a/tests/robotests/src/com/android/settings/applications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/ManageApplicationsTest.java index bf1fbb8a4db..8729d8409eb 100644 --- a/tests/robotests/src/com/android/settings/applications/ManageApplicationsTest.java +++ b/tests/robotests/src/com/android/settings/applications/ManageApplicationsTest.java @@ -21,9 +21,11 @@ import android.os.UserManager; import com.android.settings.Settings; import com.android.settings.SettingsRobolectricTestRunner; 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.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources.SettingsShadowTheme; +import com.android.settings.testutils.shadow.ShadowEventLogWriter; import com.android.settingslib.applications.ApplicationsState; import org.junit.Before; import org.junit.Test; @@ -46,7 +48,8 @@ import static org.mockito.Mockito.when; shadows = { SettingsShadowResources.class, SettingsShadowTheme.class, - ShadowDynamicIndexableContentMonitor.class + ShadowDynamicIndexableContentMonitor.class, + ShadowEventLogWriter.class }) public class ManageApplicationsTest { @@ -55,8 +58,8 @@ public class ManageApplicationsTest { @Mock private UserManager mUserManager; private Looper mBgLooper; - private ManageApplications mFragment; + @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -67,6 +70,7 @@ public class ManageApplicationsTest { when(mState.getBackgroundLooper()).thenReturn(mBgLooper); mFragment = new ManageApplications(); + ReflectionHelpers.setField(mFragment, "mLifecycle", new Lifecycle()); } @Test diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java index 56fa786cb5d..8a555a8dc81 100644 --- a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java +++ b/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java @@ -15,9 +15,15 @@ */ package com.android.settings.core.instrumentation; +import android.app.Activity; 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.TestConfig; + import org.junit.Before; import org.junit.Test; 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.anyInt; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) @@ -54,7 +62,23 @@ public class VisibilityLoggerMixinTest { mMixin.onResume(); 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 diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index af720cb8440..834b2ad0af9 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -98,7 +98,8 @@ public class DashboardFeatureProviderImplTest { tile.metaData = new Bundle(); tile.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI"); 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.getSummary()).isEqualTo(tile.summary); @@ -118,7 +119,8 @@ public class DashboardFeatureProviderImplTest { tile.intent = new Intent(); 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.getOnPreferenceClickListener()).isNotNull(); @@ -140,7 +142,8 @@ public class DashboardFeatureProviderImplTest { when(mActivity.getSystemService(Context.USER_SERVICE)) .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); verify(mActivity).getFragmentManager(); @@ -160,7 +163,8 @@ public class DashboardFeatureProviderImplTest { when(mActivity.getSystemService(Context.USER_SERVICE)) .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); verify(mFeatureFactory.metricsFeatureProvider).action( any(Context.class), @@ -177,8 +181,8 @@ public class DashboardFeatureProviderImplTest { final Tile tile = new Tile(); tile.intent = new Intent(); tile.intent.setComponent(new ComponentName("pkg", "class")); - mImpl.bindPreferenceToTile(mActivity, preference, tile, null /* key */ - , Preference.DEFAULT_ORDER); + mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN, + preference, tile, null /*key */, Preference.DEFAULT_ORDER); assertThat(preference.getKey()).isNotNull(); assertThat(preference.getOrder()).isEqualTo(Preference.DEFAULT_ORDER); @@ -192,8 +196,8 @@ public class DashboardFeatureProviderImplTest { tile.key = "key"; tile.intent = new Intent(); tile.intent.setComponent(new ComponentName("pkg", "class")); - mImpl.bindPreferenceToTile(mActivity, preference, tile, null /* key */ - , Preference.DEFAULT_ORDER); + mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN, + preference, tile, null /* key */, Preference.DEFAULT_ORDER); assertThat(preference.getKey()).isEqualTo(tile.key); } @@ -206,7 +210,8 @@ public class DashboardFeatureProviderImplTest { final Tile tile = new Tile(); tile.metaData = new Bundle(); 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); } @@ -223,12 +228,16 @@ public class DashboardFeatureProviderImplTest { tile.metaData = new Bundle(); tile.metaData.putString("com.android.settings.intent.action", "TestAction"); 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(); ShadowActivity shadowActivity = shadowOf(activity); - assertThat(shadowActivity.getNextStartedActivityForResult().intent.getAction()) + final Intent launchIntent = shadowActivity.getNextStartedActivityForResult().intent; + assertThat(launchIntent.getAction()) .isEqualTo("TestAction"); + assertThat(launchIntent.getIntExtra(SettingsActivity.EXTRA_SOURCE_METRICS_CATEGORY, 0)) + .isEqualTo(MetricsProto.MetricsEvent.SETTINGS_GESTURES); } @Test @@ -236,7 +245,8 @@ public class DashboardFeatureProviderImplTest { final DashboardFeatureProviderImpl mSpy = spy(mImpl); 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(); } @@ -248,7 +258,8 @@ public class DashboardFeatureProviderImplTest { when(mCategoryManager.getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE)) .thenReturn(null); - assertThat(mSpy.getPreferencesForCategory(null, null, CategoryKey.CATEGORY_HOMEPAGE)) + assertThat(mSpy.getPreferencesForCategory(null, null, + MetricsProto.MetricsEvent.SETTINGS_GESTURES, CategoryKey.CATEGORY_HOMEPAGE)) .isNull(); } @@ -260,7 +271,8 @@ public class DashboardFeatureProviderImplTest { when(mCategoryManager.getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE)) .thenReturn(new DashboardCategory()); - assertThat(mSpy.getPreferencesForCategory(null, null, CategoryKey.CATEGORY_HOMEPAGE)) + assertThat(mSpy.getPreferencesForCategory(null, null, + MetricsProto.MetricsEvent.SETTINGS_GESTURES, CategoryKey.CATEGORY_HOMEPAGE)) .isNull(); } @@ -277,6 +289,7 @@ public class DashboardFeatureProviderImplTest { assertThat(mSpy.getPreferencesForCategory(mActivity, ShadowApplication.getInstance().getApplicationContext(), + MetricsProto.MetricsEvent.SETTINGS_GESTURES, CategoryKey.CATEGORY_HOMEPAGE).isEmpty()) .isFalse(); } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index 327575e7303..31ffad0289f 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -24,6 +24,7 @@ import android.support.v7.preference.PreferenceScreen; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.core.PreferenceController; +import com.android.settings.core.instrumentation.VisibilityLoggerMixin; import com.android.settings.overlay.FeatureFactory; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.drawer.DashboardCategory; @@ -37,6 +38,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; @@ -186,6 +188,8 @@ public class DashboardFragmentTest { mControllers = new ArrayList<>(); when(mPreferenceManager.getContext()).thenReturn(mContext); + ReflectionHelpers.setField( + this, "mVisibilityLoggerMixin", mock(VisibilityLoggerMixin.class)); } @Override diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEventLogWriter.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEventLogWriter.java new file mode 100644 index 00000000000..dcced4e40d0 --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEventLogWriter.java @@ -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) { + + } +}