OSDN Git Service

Log source with visibility change
authorFan Zhang <zhfan@google.com>
Tue, 14 Feb 2017 23:02:35 +0000 (15:02 -0800)
committerFan Zhang <zhfan@google.com>
Thu, 16 Feb 2017 01:17:19 +0000 (17:17 -0800)
- Add a method in VisibilityLoggerMixin to log visible event using
  LogMaker, which allows logging additional FIELD_CONTEXT field.
- In Utils.startFragment, add current page's metricsCategory as an extra
  to next page.
- In next page's onResume(), extract the previous page's metricsCategory
  and send it to VisibilityLoggerMixin.visible()
- Update all caller with additional paramters

Change-Id: I8e1f2597fa465b7d3aa16fa1d21c052a3219694a
Fix: 35359289
Test: RunSettingsRoboTests

64 files changed:
res/xml/development_prefs.xml
src/com/android/settings/AppHeader.java
src/com/android/settings/DevelopmentSettings.java
src/com/android/settings/MasterClear.java
src/com/android/settings/ResetNetwork.java
src/com/android/settings/SecuritySettings.java
src/com/android/settings/SettingsActivity.java
src/com/android/settings/SettingsPreferenceFragment.java
src/com/android/settings/UserDictionarySettings.java
src/com/android/settings/Utils.java
src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
src/com/android/settings/accounts/AccountPreferenceController.java
src/com/android/settings/accounts/AccountSyncPreferenceController.java
src/com/android/settings/accounts/AccountTypePreference.java
src/com/android/settings/accounts/AccountTypePreferenceLoader.java
src/com/android/settings/accounts/ManageAccountsSettings.java
src/com/android/settings/applications/AppHeaderController.java
src/com/android/settings/applications/AppInfoBase.java
src/com/android/settings/applications/AppOpsCategory.java
src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
src/com/android/settings/applications/ConvertToFbe.java
src/com/android/settings/applications/InstalledAppDetails.java
src/com/android/settings/applications/ManageApplications.java
src/com/android/settings/applications/ManageDomainUrls.java
src/com/android/settings/applications/ProcessStatsBase.java
src/com/android/settings/applications/RunningProcessesView.java
src/com/android/settings/applications/ShortcutPreference.java
src/com/android/settings/bluetooth/BluetoothSettings.java
src/com/android/settings/core/InstrumentedPreferenceFragment.java
src/com/android/settings/core/instrumentation/EventLogWriter.java
src/com/android/settings/core/instrumentation/LogWriter.java
src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java
src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java
src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java
src/com/android/settings/dashboard/DashboardFeatureProvider.java
src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
src/com/android/settings/dashboard/DashboardFragment.java
src/com/android/settings/dashboard/DashboardSummary.java
src/com/android/settings/dashboard/SearchResultsSummary.java
src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
src/com/android/settings/dashboard/conditional/HotspotCondition.java
src/com/android/settings/dashboard/conditional/NightDisplayCondition.java
src/com/android/settings/datausage/BillingCyclePreference.java
src/com/android/settings/datausage/DataUsagePreference.java
src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
src/com/android/settings/deviceinfo/StorageSettings.java
src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
src/com/android/settings/fuelgauge/PowerUsageDetail.java
src/com/android/settings/fuelgauge/PowerUsageSummary.java
src/com/android/settings/location/LocationSettings.java
src/com/android/settings/network/NetworkResetActionMenuController.java
src/com/android/settings/notification/AppNotificationSettings.java
src/com/android/settings/search2/CursorToSearchResultConverter.java
src/com/android/settings/users/UserSettings.java
src/com/android/settings/vpn2/AppManagementFragment.java
src/com/android/settings/vpn2/VpnSettings.java
src/com/android/settings/wifi/WifiSettings.java
tests/robotests/src/com/android/settings/DevelopmentSettingsTest.java
tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
tests/robotests/src/com/android/settings/applications/ManageApplicationsTest.java
tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
tests/robotests/src/com/android/settings/testutils/shadow/ShadowEventLogWriter.java [new file with mode: 0644]

index 41ec0fa..8f3f74e 100644 (file)
         <!-- hiding for now.
         <Preference
                 android:key="background_check"
+                android:fragment="com.android.settings.applications.BackgroundCheckSummary"
                 android:title="@string/background_check_pref" />
         -->
 
 
         <Preference
                 android:key="inactive_apps"
-                android:title="@string/inactive_apps_title" />
+                android:title="@string/inactive_apps_title"
+                android:fragment="com.android.settings.fuelgauge.InactiveApps"/>
 
         <SwitchPreference
             android:key="force_allow_on_external"
index 2b3e6c4..f5700b5 100644 (file)
@@ -28,6 +28,7 @@ import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.applications.AppInfoBase;
 import com.android.settings.applications.InstalledAppDetails;
 
@@ -88,7 +89,7 @@ public class AppHeader {
                     if (includeAppInfo) {
                         AppInfoBase.startAppInfoFragment(InstalledAppDetails.class,
                                 R.string.application_info_label, pkgName, uid, activity,
-                                INSTALLED_APP_DETAILS);
+                                INSTALLED_APP_DETAILS, MetricsProto.MetricsEvent.VIEW_UNKNOWN);
                     } else {
                         activity.finish();
                     }
index b90466e..f8870ca 100644 (file)
@@ -567,7 +567,8 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
     void addDashboardCategoryPreferences() {
         final PreferenceScreen screen = getPreferenceScreen();
         final List<Preference> 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));
index 5fd4f46..fa9410d 100644 (file)
@@ -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);
     }
 
index 8ac11cd..45490ab 100644 (file)
@@ -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);
     }
 
index b66f2f5..04b2413 100644 (file)
@@ -414,7 +414,8 @@ public class SecuritySettings extends SettingsPreferenceFragment
                 (PreferenceGroup) root.findPreference(KEY_SECURITY_STATUS);
         if (mDashboardFeatureProvider.isEnabled()) {
             final List<Preference> 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) {
index 9168ead..0435d03 100644 (file)
@@ -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;
@@ -101,6 +102,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
      * to that fragment when it is instantiated during the initial creation
@@ -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<DashboardCategory> 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);
         }
     }
 
index 3bad5f3..70743e2 100644 (file)
@@ -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,
index 313e737..5571c2d 100644 (file)
@@ -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);
     }
index b1c3ab3..0ac5c6a 100644 (file)
@@ -252,7 +252,6 @@ public final class Utils extends com.android.settingslib.Utils {
     /**
      * Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6 style
      * 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,
-            UserHandle userHandle) {
-        // workaround to avoid crash in b/17523189
-        if (userHandle.getIdentifier() == UserHandle.myUserId()) {
-            startWithFragment(context, fragmentName, args, null, 0, titleResId, title, isShortcut);
-        } 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,
+            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, titleResPackageName, titleResId,
-                    title, isShortcut);
+            startWithFragment(context, fragmentName, args, null, 0, titleResId, title, isShortcut,
+                    metricsCategory);
         } 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(
index 0ccf6d8..cf72383 100644 (file)
@@ -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);
index c08c924..635f440 100644 (file)
@@ -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<AccountTypePreference> accountTypePreferences =
-                new ArrayList<AccountTypePreference>(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);
         }
index 76750b3..57d317b 100644 (file)
@@ -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;
     }
 
index bf3b9f5..0abfb50 100644 (file)
@@ -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;
index 87f9c77..87aec14 100644 (file)
@@ -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
index 7c5ee00..f93fe09 100644 (file)
@@ -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);
index daafc18..01d5fc7 100644 (file)
@@ -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;
index 015347d..b86f2f4 100644 (file)
@@ -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)));
     }
index 4b54891..e27e05b 100644 (file)
@@ -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) {
index 2d2bce0..31d26ed 100644 (file)
@@ -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;
index da5f90d..be3c371 100644 (file)
@@ -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);
     }
 
index 73164e4..4d27bb6 100755 (executable)
@@ -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;
index d5f7f78..22f1627 100644 (file)
@@ -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);
                 }
index 4a64900..b09a089 100644 (file)
@@ -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;
index 6b21916..7aa3cc7 100644 (file)
@@ -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);
     }
 }
index 917d3ab..dcb6f9e 100644 (file)
@@ -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);
         }
     }
index e3db57a..91b41b7 100644 (file)
@@ -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);
     }
 }
index 6e7ae47..7a8ff4c 100644 (file)
@@ -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);
                 }
             });
index ce0daa9..91ef3f1 100644 (file)
@@ -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()));
     }
 
@@ -68,6 +71,12 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc
     }
 
     @Override
+    public void onResume() {
+        mVisibilityLoggerMixin.setSourceMetricsCategory(getActivity());
+        super.onResume();
+    }
+
+    @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
     }
 
index 9304512..0a85649 100644 (file)
@@ -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) {
index 4a2fc6c..88dd4df 100644 (file)
@@ -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.
index 13a4d7e..24c5e8c 100644 (file)
@@ -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();
+    }
 }
index 3b94fe7..44d2554 100644 (file)
@@ -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
index 54183a2..fcd32d1 100644 (file)
 
 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);
+    }
 }
index 7f91d16..7845829 100644 (file)
@@ -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,13 +45,15 @@ 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<Preference> getPreferencesForCategory(Activity activity, Context context, String key);
+    List<Preference> getPreferencesForCategory(Activity activity, Context context,
+            int sourceMetricsCategory, String key);
 
     /**
      * Get all tiles, grouped by category.
@@ -58,13 +61,6 @@ public interface DashboardFeatureProvider {
     List<DashboardCategory> getAllCategories();
 
     /**
-     * Returns a priority group for tile. priority level is grouped into hundreds. tiles with
-     * priority 100 - 199 belongs to priority level 100, tiles with priority 200 - 299 is in
-     * group 200, and so on.
-     */
-    int getPriorityGroup(Preference preference);
-
-    /**
      * Returns an unique string key for the tile.
      */
     String getDashboardKeyForTile(Tile 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.
index 395a8bd..69105b5 100644 (file)
@@ -80,7 +80,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
 
     @Override
     public List<Preference> 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<Preference> 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);
         }
@@ -110,11 +110,6 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
     }
 
     @Override
-    public int getPriorityGroup(Preference preference) {
-        return preference.getOrder() / 100;
-    }
-
-    @Override
     public String getDashboardKeyForTile(Tile tile) {
         if (tile == null || tile.intent == null) {
             return 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);
             }
index f8a27e0..d650fc7 100644 (file)
@@ -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);
             }
index a5a4f43..ce1cf65 100644 (file)
@@ -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) {
index ef84f8b..06b71d6 100644 (file)
@@ -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);
 
index b3e3504..7feac23 100644 (file)
@@ -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
index 2f25da5..19e0e85 100644 (file)
@@ -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
index 11d6c0f..bfcab7f 100644 (file)
@@ -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
index 44312b7..8e450df 100644 (file)
@@ -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() {
index bd865b5..0c7b33f 100644 (file)
@@ -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);
     }
 }
index ce26c0f..6c3b9e6 100644 (file)
@@ -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: {
index cf70429..31bcc4e 100644 (file)
@@ -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();
index 627b877..63c37d8 100644 (file)
@@ -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() {
index dace4da..154a901 100644 (file)
@@ -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:
index 7b64ddf..75787d5 100644 (file)
@@ -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());
         }
     }
 
index 4177afb..72d54b8 100644 (file)
@@ -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;
index 67c37a4..d5065d1 100644 (file)
@@ -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;
             });
         }
index 0d7fb93..d0f6f2e 100644 (file)
@@ -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(
index 6549c18..bcb2e9d 100644 (file)
@@ -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);
index c49aa1d..000ccf5 100644 (file)
@@ -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 */
index f86e677..9ef087b 100644 (file)
@@ -100,11 +100,11 @@ public class AppManagementFragment extends SettingsPreferenceFragment
         }
     };
 
-    public static void show(Context context, AppPreference pref) {
+    public static void show(Context context, AppPreference pref, int sourceMetricsCategory) {
         Bundle args = new Bundle();
         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
index 2998319..ead2143 100644 (file)
@@ -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());
             }
         }
     };
index c4b90c7..a903c09 100644 (file)
@@ -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(
index e518620..3e7d4ac 100644 (file)
@@ -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);
index 744bc0f..4cc39fb 100644 (file)
@@ -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));
index bf1fbb8..8729d84 100644 (file)
@@ -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
index 56fa786..8a555a8 100644 (file)
  */
 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
index af720cb..834b2ad 100644 (file)
@@ -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();
     }
index 327575e..31ffad0 100644 (file)
@@ -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 (file)
index 0000000..dcced4e
--- /dev/null
@@ -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) {
+
+    }
+}