log visibility of views

Depends-On: I5b1dccb5d103ece3112acf38889bae16273b092f
Change-Id: I116aed2bb805f723a5bf2ec9eb94257de0b4a7b5
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index f587b60..f8db3d8 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -38,9 +38,10 @@
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
+import com.android.internal.logging.MetricsLogger;
 
 
-public class ApnEditor extends PreferenceActivity
+public class ApnEditor extends InstrumentedPreferenceActivity
         implements SharedPreferences.OnSharedPreferenceChangeListener,
                     Preference.OnPreferenceChangeListener {
 
@@ -228,6 +229,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APN_EDITOR;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         getPreferenceScreen().getSharedPreferences()
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
index 79a3825..68cfb60 100644
--- a/src/com/android/settings/ApnSettings.java
+++ b/src/com/android/settings/ApnSettings.java
@@ -47,6 +47,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.TelephonyIntents;
 import android.telephony.TelephonyManager;
@@ -125,6 +126,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APN;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         final Activity activity = getActivity();
diff --git a/src/com/android/settings/ApplicationSettings.java b/src/com/android/settings/ApplicationSettings.java
index 6a17049..9e010b6 100644
--- a/src/com/android/settings/ApplicationSettings.java
+++ b/src/com/android/settings/ApplicationSettings.java
@@ -24,6 +24,7 @@
 import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceScreen;
 import android.provider.Settings;
+import com.android.internal.logging.MetricsLogger;
 
 public class ApplicationSettings extends SettingsPreferenceFragment {
     
@@ -43,6 +44,11 @@
     private ListPreference mInstallLocation;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATION;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index b6f907e..6d31e60 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -42,6 +42,7 @@
 import android.view.accessibility.AccessibilityManager;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 
 import java.util.List;
@@ -113,6 +114,11 @@
         };
 
         @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.CHOOSE_LOCK_GENERIC;
+        }
+
+        @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
 
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 0a0aebd..6d7b71d 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.PasswordEntryKeyboardHelper;
 import com.android.internal.widget.PasswordEntryKeyboardView;
@@ -96,7 +97,7 @@
         setTitle(msg);
     }
 
-    public static class ChooseLockPasswordFragment extends Fragment
+    public static class ChooseLockPasswordFragment extends InstrumentedFragment
             implements OnClickListener, OnEditorActionListener,  TextWatcher {
         private static final String KEY_FIRST_PIN = "first_pin";
         private static final String KEY_UI_STAGE = "ui_stage";
@@ -263,6 +264,11 @@
         }
 
         @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.CHOOSE_LOCK_PASSWORD;
+        }
+
+        @Override
         public void onResume() {
             super.onResume();
             updateStage(mUiStage);
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 6343468..1865a6b 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.google.android.collect.Lists;
 import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
 import com.android.internal.widget.LockPatternUtils;
@@ -101,7 +102,7 @@
         return super.onKeyDown(keyCode, event);
     }
 
-    public static class ChooseLockPatternFragment extends Fragment
+    public static class ChooseLockPatternFragment extends InstrumentedFragment
             implements View.OnClickListener {
 
         public static final int CONFIRM_EXISTING_REQUEST = 55;
@@ -205,6 +206,11 @@
                 }
          };
 
+        @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.CHOOSE_LOCK_PATTERN;
+        }
+
 
         /**
          * The states of the left footer button.
diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java
index c74e861..b49dc6e 100644
--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -17,6 +17,7 @@
 package com.android.settings;
 
 import android.text.TextUtils;
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.PasswordEntryKeyboardHelper;
 import com.android.internal.widget.PasswordEntryKeyboardView;
@@ -74,8 +75,8 @@
         setTitle(msg);
     }
 
-    public static class ConfirmLockPasswordFragment extends Fragment implements OnClickListener,
-            OnEditorActionListener, TextWatcher {
+    public static class ConfirmLockPasswordFragment extends InstrumentedFragment
+            implements OnClickListener, OnEditorActionListener, TextWatcher {
         private static final String KEY_NUM_WRONG_CONFIRM_ATTEMPTS
                 = "confirm_lock_password_fragment.key_num_wrong_confirm_attempts";
         private static final long ERROR_MESSAGE_TIMEOUT = 3000;
@@ -174,6 +175,11 @@
         }
 
         @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.CONFIRM_LOCK_PASSWORD;
+        }
+
+        @Override
         public void onResume() {
             // TODO Auto-generated method stub
             super.onResume();
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index 87d401c..b5d444b 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockPatternView;
 import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
@@ -84,7 +85,7 @@
         return false;
     }
 
-    public static class ConfirmLockPatternFragment extends Fragment {
+    public static class ConfirmLockPatternFragment extends InstrumentedFragment {
 
         // how long we wait to clear a wrong pattern
         private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
@@ -172,6 +173,11 @@
         }
 
         @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.CONFIRM_LOCK_PATTERN;
+        }
+
+        @Override
         public void onResume() {
             super.onResume();
 
diff --git a/src/com/android/settings/CryptKeeperConfirm.java b/src/com/android/settings/CryptKeeperConfirm.java
index 4d6f26b..77a1c45 100644
--- a/src/com/android/settings/CryptKeeperConfirm.java
+++ b/src/com/android/settings/CryptKeeperConfirm.java
@@ -33,14 +33,20 @@
 import android.view.ViewGroup;
 import android.widget.Button;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 
 import java.util.Locale;
 
-public class CryptKeeperConfirm extends Fragment {
+public class CryptKeeperConfirm extends InstrumentedFragment {
 
     private static final String TAG = "CryptKeeperConfirm";
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.CRYPT_KEEPER_CONFIRM;
+    }
+
     public static class Blank extends Activity {
         private Handler mHandler = new Handler();
 
diff --git a/src/com/android/settings/CryptKeeperSettings.java b/src/com/android/settings/CryptKeeperSettings.java
index d962446..3fb60e3 100644
--- a/src/com/android/settings/CryptKeeperSettings.java
+++ b/src/com/android/settings/CryptKeeperSettings.java
@@ -34,8 +34,9 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
+import com.android.internal.logging.MetricsLogger;
 
-public class CryptKeeperSettings extends Fragment {
+public class CryptKeeperSettings extends InstrumentedFragment {
     private static final String TAG = "CryptKeeper";
 
     private static final int KEYGUARD_REQUEST = 55;
@@ -111,6 +112,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.CRYPT_KEEPER;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         getActivity().registerReceiver(mIntentReceiver, mIntentFilter);
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 0d21066..6e72ef7 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -127,6 +127,7 @@
 import android.widget.TabWidget;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.settings.drawable.InsetBoundsDrawable;
 import com.android.settings.net.ChartData;
@@ -291,6 +292,11 @@
     private final Map<String, Boolean> mMobileDataEnabled = new HashMap<String, Boolean>();
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DATA_USAGE_SUMMARY;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         final Context context = getActivity();
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java
index be24ffe..a3926a3 100644
--- a/src/com/android/settings/DateTimeSettings.java
+++ b/src/com/android/settings/DateTimeSettings.java
@@ -41,6 +41,8 @@
 import android.view.View;
 import android.widget.DatePicker;
 import android.widget.TimePicker;
+import com.android.internal.logging.MetricsLogger;
+
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -75,6 +77,11 @@
     private Preference mDatePref;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DATE_TIME;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 192bd5c..e0091e1 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -68,6 +68,7 @@
 import android.widget.Switch;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.widget.SwitchBar;
@@ -260,6 +261,11 @@
     private boolean mUnavailable;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DEVELOPMENT;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index 648615a..061b133 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -37,6 +37,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
@@ -84,6 +85,11 @@
     Toast mDevHitToast;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DEVICEINFO;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 3358124..47cbcde 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.view.RotationPolicy;
 import com.android.settings.DropDownPreference.Callback;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -86,6 +87,11 @@
     private SwitchPreference mAutoBrightnessPreference;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DISPLAY;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         final Activity activity = getActivity();
diff --git a/src/com/android/settings/DreamSettings.java b/src/com/android/settings/DreamSettings.java
index 38cba7a..8137cd4 100644
--- a/src/com/android/settings/DreamSettings.java
+++ b/src/com/android/settings/DreamSettings.java
@@ -43,6 +43,7 @@
 import android.widget.Switch;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.DreamBackend.DreamInfo;
 import com.android.settings.widget.SwitchBar;
 
@@ -77,6 +78,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DREAM;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         logd("onCreate(%s)", icicle);
         super.onCreate(icicle);
diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java
index dfbed77..9b6444c 100644
--- a/src/com/android/settings/EncryptionInterstitial.java
+++ b/src/com/android/settings/EncryptionInterstitial.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
@@ -78,6 +79,11 @@
         private boolean mPasswordRequired;
 
         @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.ENCRYPTION;
+        }
+
+        @Override
         public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 Bundle savedInstanceState) {
             final int layoutId = R.layout.encryption_interstitial;
diff --git a/src/com/android/settings/FingerprintEnroll.java b/src/com/android/settings/FingerprintEnroll.java
index 931fb9c..c54272f 100644
--- a/src/com/android/settings/FingerprintEnroll.java
+++ b/src/com/android/settings/FingerprintEnroll.java
@@ -43,6 +43,7 @@
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 
 /**
@@ -81,7 +82,8 @@
         setTitle(msg);
     }
 
-    public static class FingerprintEnrollFragment extends Fragment implements View.OnClickListener {
+    public static class FingerprintEnrollFragment extends InstrumentedFragment
+            implements View.OnClickListener {
         private static final String EXTRA_PROGRESS = "progress";
         private static final String EXTRA_STAGE = "stage";
         private static final int PROGRESS_BAR_MAX = 10000;
@@ -171,6 +173,11 @@
         };
         private static final boolean ALWAYS_SHOW_FIND_SCREEN = true;
 
+        @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.FINGERPRINT_ENROLL;
+        }
+
         private enum Stage {
             EnrollingOnboard(R.string.security_settings_fingerprint_enroll_onboard_title,
                     R.string.security_settings_fingerprint_enroll_onboard_message,
diff --git a/src/com/android/settings/FingerprintSettings.java b/src/com/android/settings/FingerprintSettings.java
index 857ef1f..d086ff7 100644
--- a/src/com/android/settings/FingerprintSettings.java
+++ b/src/com/android/settings/FingerprintSettings.java
@@ -40,6 +40,7 @@
 import android.widget.EditText;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.search.Indexable;
 
 import java.util.List;
@@ -148,6 +149,11 @@
         };
 
         @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.FINGERPRINT;
+        }
+
+        @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             mFingerprintManager = (FingerprintManager) getActivity().getSystemService(
diff --git a/src/com/android/settings/HighlightingFragment.java b/src/com/android/settings/HighlightingFragment.java
index 4a233b4..ef2fbf3 100644
--- a/src/com/android/settings/HighlightingFragment.java
+++ b/src/com/android/settings/HighlightingFragment.java
@@ -23,7 +23,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-public class HighlightingFragment extends Fragment {
+public abstract class HighlightingFragment extends InstrumentedFragment {
 
     private static final String TAG = "HighlightSettingsFragment";
 
diff --git a/src/com/android/settings/HomeSettings.java b/src/com/android/settings/HomeSettings.java
index 6da1848..22d4cdc 100644
--- a/src/com/android/settings/HomeSettings.java
+++ b/src/com/android/settings/HomeSettings.java
@@ -51,6 +51,7 @@
 import android.view.View.OnClickListener;
 import android.widget.ImageView;
 import android.widget.RadioButton;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
@@ -253,6 +254,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.HOME;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.home_selection);
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index efc5a3c..0e47afb 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -42,6 +42,7 @@
 import android.widget.TabWidget;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyIntents;
@@ -55,7 +56,7 @@
  * these operations.
  *
  */
-public class IccLockSettings extends PreferenceActivity
+public class IccLockSettings extends InstrumentedPreferenceActivity
         implements EditPinPreference.OnPinEnteredListener {
     private static final String TAG = "IccLockSettings";
     private static final boolean DBG = true;
@@ -239,6 +240,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ICC_LOCK;
+    }
+
+    @Override
     protected void onResume() {
         super.onResume();
 
diff --git a/src/com/android/settings/InstrumentedFragment.java b/src/com/android/settings/InstrumentedFragment.java
new file mode 100644
index 0000000..96b7296
--- /dev/null
+++ b/src/com/android/settings/InstrumentedFragment.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.preference.PreferenceFragment;
+import com.android.internal.logging.MetricsLogger;
+
+/**
+ * Instrumented fragment that logs visibility state.
+ */
+public abstract class InstrumentedFragment extends PreferenceFragment {
+    protected abstract int getMetricsCategory();
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        MetricsLogger.visible(getActivity(), getMetricsCategory());
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        MetricsLogger.hidden(getActivity(), getMetricsCategory());
+    }
+}
diff --git a/src/com/android/settings/InstrumentedPreferenceActivity.java b/src/com/android/settings/InstrumentedPreferenceActivity.java
new file mode 100644
index 0000000..8ad88b0
--- /dev/null
+++ b/src/com/android/settings/InstrumentedPreferenceActivity.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.preference.PreferenceActivity;
+import com.android.internal.logging.MetricsLogger;
+
+/**
+ * Instrumented activity that logs visibility state.
+ */
+public abstract class InstrumentedPreferenceActivity extends PreferenceActivity {
+    protected abstract int getMetricsCategory();
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        MetricsLogger.visible(this, getMetricsCategory());
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        MetricsLogger.hidden(this, getMetricsCategory());
+    }
+}
diff --git a/src/com/android/settings/InstrumentedPreferenceFragment.java b/src/com/android/settings/InstrumentedPreferenceFragment.java
new file mode 100644
index 0000000..1d86102
--- /dev/null
+++ b/src/com/android/settings/InstrumentedPreferenceFragment.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.preference.PreferenceFragment;
+import com.android.internal.logging.MetricsLogger;
+
+/**
+ * Instrumented preference fragment that logs visibility state.
+ */
+public abstract class InstrumentedPreferenceFragment extends PreferenceFragment {
+    protected abstract int getMetricsCategory();
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        MetricsLogger.visible(getActivity(), getMetricsCategory());
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        MetricsLogger.hidden(getActivity(), getMetricsCategory());
+    }
+}
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 9480f67..1b6468f 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -41,6 +41,7 @@
 import android.widget.CheckBox;
 import android.widget.LinearLayout;
 import android.widget.TextView;
+import com.android.internal.logging.MetricsLogger;
 
 import java.util.List;
 
@@ -54,7 +55,7 @@
  *
  * This is the initial screen.
  */
-public class MasterClear extends Fragment {
+public class MasterClear extends InstrumentedFragment {
     private static final String TAG = "MasterClear";
 
     private static final int KEYGUARD_REQUEST = 55;
@@ -270,4 +271,9 @@
         establishInitialState();
         return mContentView;
     }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.MASTER_CLEAR;
+    }
 }
diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java
index 3521aa3..bc3656a 100644
--- a/src/com/android/settings/MasterClearConfirm.java
+++ b/src/com/android/settings/MasterClearConfirm.java
@@ -21,6 +21,7 @@
 import android.content.pm.ActivityInfo;
 import android.os.AsyncTask;
 import android.service.persistentdata.PersistentDataBlockManager;
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.os.storage.ExternalStorageFormatter;
 
 import android.app.Fragment;
@@ -42,7 +43,7 @@
  *
  * This is the confirmation screen.
  */
-public class MasterClearConfirm extends Fragment {
+public class MasterClearConfirm extends InstrumentedFragment {
 
     private View mContentView;
     private boolean mEraseSdCard;
@@ -144,4 +145,9 @@
         Bundle args = getArguments();
         mEraseSdCard = args != null && args.getBoolean(MasterClear.ERASE_EXTERNAL_EXTRA);
     }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.MASTER_CLEAR_CONFIRM;
+    }
 }
diff --git a/src/com/android/settings/OwnerInfoSettings.java b/src/com/android/settings/OwnerInfoSettings.java
index c1cacb9..54b7cab 100644
--- a/src/com/android/settings/OwnerInfoSettings.java
+++ b/src/com/android/settings/OwnerInfoSettings.java
@@ -29,9 +29,10 @@
 import android.widget.EditText;
 import android.widget.CompoundButton.OnCheckedChangeListener;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 
-public class OwnerInfoSettings extends Fragment {
+public class OwnerInfoSettings extends InstrumentedFragment {
 
     public static final String EXTRA_SHOW_NICKNAME = "show_nickname";
 
@@ -99,6 +100,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.OWNER_INFO;
+    }
+
+    @Override
     public void onPause() {
         super.onPause();
         saveChanges();
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index e150298..4eb8a9e 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -37,6 +37,7 @@
 import android.provider.Settings;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import java.util.ArrayList;
@@ -70,6 +71,11 @@
     private int mDialogType;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.PRIVACY;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         // Don't allow any access if this is a secondary user
diff --git a/src/com/android/settings/ProxySelector.java b/src/com/android/settings/ProxySelector.java
index 2c4c473..7e83f66 100644
--- a/src/com/android/settings/ProxySelector.java
+++ b/src/com/android/settings/ProxySelector.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
 
 import android.app.Activity;
@@ -42,7 +43,7 @@
 import android.widget.EditText;
 import android.widget.TextView;
 
-public class ProxySelector extends Fragment implements DialogCreatable {
+public class ProxySelector extends InstrumentedFragment implements DialogCreatable {
     private static final String TAG = "ProxySelector";
 
     EditText    mHostnameField;
@@ -270,4 +271,9 @@
                 }
             }
         };
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.PROXY_SELECTOR;
+    }
 }
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index 990f485..a3376d3 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -43,6 +43,7 @@
 import android.widget.Spinner;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.PhoneConstants;
 
 import java.util.ArrayList;
@@ -57,7 +58,7 @@
  *
  * This is the initial screen.
  */
-public class ResetNetwork extends Fragment {
+public class ResetNetwork extends InstrumentedFragment {
     private static final String TAG = "ResetNetwork";
 
     // Arbitrary to avoid conficts
@@ -195,4 +196,9 @@
         establishInitialState();
         return mContentView;
     }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.RESET_NETWORK;
+    }
 }
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
index a67d2e6..7c2b613 100644
--- a/src/com/android/settings/ResetNetworkConfirm.java
+++ b/src/com/android/settings/ResetNetworkConfirm.java
@@ -39,6 +39,7 @@
 import android.widget.Spinner;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.net.VpnConfig;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
@@ -58,7 +59,7 @@
  *
  * This is the confirmation screen.
  */
-public class ResetNetworkConfirm extends Fragment {
+public class ResetNetworkConfirm extends InstrumentedFragment {
 
     private View mContentView;
     private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -195,4 +196,9 @@
                     SubscriptionManager.INVALID_SUBSCRIPTION_ID);
         }
     }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.RESET_NETWORK_CONFIRM;
+    }
 }
diff --git a/src/com/android/settings/RestrictedSettingsFragment.java b/src/com/android/settings/RestrictedSettingsFragment.java
index 64e1e3f..c78d6e2 100644
--- a/src/com/android/settings/RestrictedSettingsFragment.java
+++ b/src/com/android/settings/RestrictedSettingsFragment.java
@@ -37,7 +37,7 @@
  * {@link RestrictionsManager.hasRestrictionsProvider()} returns true, pass in
  * {@link RESTRICT_IF_OVERRIDABLE} to the constructor instead of a restrictions key.
  */
-public class RestrictedSettingsFragment extends SettingsPreferenceFragment {
+public abstract class RestrictedSettingsFragment extends SettingsPreferenceFragment {
 
     protected static final String RESTRICT_IF_OVERRIDABLE = "restrict_if_overridable";
 
diff --git a/src/com/android/settings/ScreenPinningSettings.java b/src/com/android/settings/ScreenPinningSettings.java
index 3f39088..adda01b 100644
--- a/src/com/android/settings/ScreenPinningSettings.java
+++ b/src/com/android/settings/ScreenPinningSettings.java
@@ -30,6 +30,7 @@
 import android.view.ViewGroup;
 import android.widget.Switch;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -53,6 +54,11 @@
     private LockPatternUtils mLockPatternUtils;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.SCREEN_PINNING;
+    }
+
+    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 4ca2140..df217c8 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -49,6 +49,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.TrustAgentUtils.TrustAgentComponentInfo;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -130,6 +131,11 @@
     private Intent mTrustAgentClickIntent;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.SECURITY;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index eecf7a2..4794608 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -66,6 +66,7 @@
 import android.widget.Button;
 import android.widget.SearchView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.XmlUtils;
 import com.android.settings.accessibility.AccessibilitySettings;
@@ -787,6 +788,9 @@
     @Override
     public void onResume() {
         super.onResume();
+        if (mIsShowingDashboard) {
+            MetricsLogger.visible(this, MetricsLogger.MAIN_SETTINGS);
+        }
 
         final int newHomeActivityCount = getHomeActivitiesCount();
         if (newHomeActivityCount != mHomeActivitiesCount) {
@@ -815,7 +819,9 @@
     @Override
     public void onPause() {
         super.onPause();
-
+        if (mIsShowingDashboard) {
+            MetricsLogger.hidden(this, MetricsLogger.MAIN_SETTINGS);
+        }
         unregisterReceiver(mBatteryInfoReceiver);
         mDynamicIndexableContentMonitor.unregister();
     }
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index e87f676..bf41c80 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -29,7 +29,6 @@
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
-import android.preference.PreferenceFragment;
 import android.preference.PreferenceGroupAdapter;
 import android.text.TextUtils;
 import android.util.Log;
@@ -46,7 +45,8 @@
 /**
  * Base class for Settings fragments, with some helper functions and dialog management.
  */
-public class SettingsPreferenceFragment extends PreferenceFragment implements DialogCreatable {
+public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceFragment
+        implements DialogCreatable {
 
     private static final String TAG = "SettingsPreferenceFragment";
 
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index ca1e8ec..125411a 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -44,6 +44,7 @@
 import android.preference.SwitchPreference;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.wifi.WifiApDialog;
 import com.android.settings.wifi.WifiApEnabler;
 import com.android.settingslib.TetherUtil;
@@ -107,6 +108,11 @@
     private boolean mUnavailable;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.TETHER;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/TrustAgentSettings.java b/src/com/android/settings/TrustAgentSettings.java
index 54fef36..1427d5f 100644
--- a/src/com/android/settings/TrustAgentSettings.java
+++ b/src/com/android/settings/TrustAgentSettings.java
@@ -32,6 +32,7 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 
 public class TrustAgentSettings extends SettingsPreferenceFragment implements
@@ -61,6 +62,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.TRUST_AGENT;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.trust_agent_settings);
diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java
index 753afc7..d3935db 100644
--- a/src/com/android/settings/TrustedCredentialsSettings.java
+++ b/src/com/android/settings/TrustedCredentialsSettings.java
@@ -51,6 +51,7 @@
 import android.widget.TabHost;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.util.ParcelableString;
 
 import java.security.cert.CertificateEncodingException;
@@ -60,7 +61,7 @@
 import java.util.List;
 import java.util.HashMap;
 
-public class TrustedCredentialsSettings extends Fragment {
+public class TrustedCredentialsSettings extends InstrumentedFragment {
 
     private static final String TAG = "TrustedCredentialsSettings";
 
@@ -68,6 +69,11 @@
 
     private static final String USER_ACTION = "com.android.settings.TRUSTED_CREDENTIALS_USER";
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.TRUSTED_CREDENTIALS;
+    }
+
     private enum Tab {
         SYSTEM("system",
                R.string.trusted_credentials_system_tab,
diff --git a/src/com/android/settings/UsageAccessSettings.java b/src/com/android/settings/UsageAccessSettings.java
index 362d27f..704c3c5 100644
--- a/src/com/android/settings/UsageAccessSettings.java
+++ b/src/com/android/settings/UsageAccessSettings.java
@@ -43,6 +43,7 @@
 import android.util.ArrayMap;
 import android.util.Log;
 import android.util.SparseArray;
+import com.android.internal.logging.MetricsLogger;
 
 import java.util.List;
 import java.util.Collections;
@@ -400,6 +401,11 @@
     };
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.USAGE_ACCESS;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/WallpaperTypeSettings.java b/src/com/android/settings/WallpaperTypeSettings.java
index 7b2dcbf..8c8da31 100644
--- a/src/com/android/settings/WallpaperTypeSettings.java
+++ b/src/com/android/settings/WallpaperTypeSettings.java
@@ -24,6 +24,7 @@
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
@@ -34,6 +35,11 @@
 public class WallpaperTypeSettings extends SettingsPreferenceFragment implements Indexable {
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.WALLPAPER_TYPE;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
diff --git a/src/com/android/settings/WifiCallingSettings.java b/src/com/android/settings/WifiCallingSettings.java
index 8e2c7ed..0638c94 100644
--- a/src/com/android/settings/WifiCallingSettings.java
+++ b/src/com/android/settings/WifiCallingSettings.java
@@ -32,6 +32,7 @@
 
 import com.android.ims.ImsConfig;
 import com.android.ims.ImsManager;
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.imsphone.ImsPhone;
 import com.android.settings.widget.SwitchBar;
 
@@ -136,6 +137,11 @@
     };
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.WIFI_CALLING;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index d94b8a7..000aa30 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -48,6 +48,7 @@
 import android.util.Log;
 
 import com.android.ims.ImsManager;
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.SmsApplication;
 import com.android.internal.telephony.SmsApplication.SmsApplicationData;
 import com.android.internal.telephony.TelephonyIntents;
@@ -238,6 +239,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.WIRELESS;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         if (savedInstanceState != null) {
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index f0464ab..c4b3a96 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -43,6 +43,7 @@
 import android.view.KeyEvent;
 import android.view.accessibility.AccessibilityManager;
 import com.android.internal.content.PackageMonitor;
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.view.RotationPolicy;
 import com.android.internal.view.RotationPolicy.RotationPolicyListener;
 import com.android.settings.DialogCreatable;
@@ -198,6 +199,11 @@
     private DevicePolicyManager mDpm;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCESSIBILITY;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.accessibility_settings);
diff --git a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
index 9822fc3..ff9c9eb 100644
--- a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
+++ b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
@@ -35,6 +35,7 @@
 import android.view.accessibility.CaptioningManager;
 import android.view.accessibility.CaptioningManager.CaptionStyle;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.SubtitleView;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
@@ -95,6 +96,11 @@
     private boolean mShowingCustom;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCESSIBILITY_CAPTION_PROPERTIES;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index 5fd2e18..6092532 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -40,6 +40,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.ConfirmDeviceCredentialActivity;
 import com.android.settings.R;
@@ -74,6 +75,11 @@
     private int mShownDialogId;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCESSIBILITY_SERVICE;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mLockPatternUtils = new LockPatternUtils(getActivity());
diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
index 1f7ecf7..c7ed1a1 100644
--- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
@@ -24,6 +24,7 @@
 import android.view.accessibility.AccessibilityManager;
 
 import android.widget.Switch;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.widget.SwitchBar;
 
@@ -36,6 +37,11 @@
     private ListPreference mType;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCESSIBILITY_TOGGLE_DALTONIZER;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
diff --git a/src/com/android/settings/accessibility/ToggleGlobalGesturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleGlobalGesturePreferenceFragment.java
index 7fb1625..740f8c6 100644
--- a/src/com/android/settings/accessibility/ToggleGlobalGesturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleGlobalGesturePreferenceFragment.java
@@ -18,6 +18,7 @@
 
 import android.provider.Settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.widget.ToggleSwitch;
 import com.android.settings.widget.ToggleSwitch.OnBeforeCheckedChangeListener;
 
@@ -42,4 +43,9 @@
             }
         });
     }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCESSIBILITY_TOGGLE_GLOBAL_GESTURE;
+    }
 }
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index 4650c06..44355c6 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -18,6 +18,7 @@
 
 import android.provider.Settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.widget.ToggleSwitch;
 import com.android.settings.widget.ToggleSwitch.OnBeforeCheckedChangeListener;
 
@@ -42,4 +43,9 @@
             }
         });
     }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION;
+    }
 }
diff --git a/src/com/android/settings/accounts/AccountPreferenceBase.java b/src/com/android/settings/accounts/AccountPreferenceBase.java
index bb60871..a34be22 100644
--- a/src/com/android/settings/accounts/AccountPreferenceBase.java
+++ b/src/com/android/settings/accounts/AccountPreferenceBase.java
@@ -41,7 +41,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 
-class AccountPreferenceBase extends SettingsPreferenceFragment
+abstract class AccountPreferenceBase extends SettingsPreferenceFragment
         implements AuthenticatorHelper.OnAccountsUpdateListener {
 
     protected static final String TAG = "AccountSettings";
diff --git a/src/com/android/settings/accounts/AccountSettings.java b/src/com/android/settings/accounts/AccountSettings.java
index 017eb86..1bf83f3 100644
--- a/src/com/android/settings/accounts/AccountSettings.java
+++ b/src/com/android/settings/accounts/AccountSettings.java
@@ -46,6 +46,7 @@
 import android.preference.PreferenceCategory;
 import android.preference.PreferenceScreen;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
@@ -115,6 +116,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCOUNT;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mUm = (UserManager) getSystemService(Context.USER_SERVICE);
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index 382fa33..2de8e4a 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.accounts;
 
+import com.android.internal.logging.MetricsLogger;
 import com.google.android.collect.Lists;
 
 import android.accounts.Account;
@@ -141,6 +142,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCOUNTS_ACCOUNT_SYNC;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/accounts/ChooseAccountActivity.java b/src/com/android/settings/accounts/ChooseAccountActivity.java
index 5e7e81e..c4dace8 100644
--- a/src/com/android/settings/accounts/ChooseAccountActivity.java
+++ b/src/com/android/settings/accounts/ChooseAccountActivity.java
@@ -34,7 +34,9 @@
 import android.preference.PreferenceScreen;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.util.CharSequences;
+import com.android.settings.InstrumentedPreferenceActivity;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
@@ -54,7 +56,7 @@
  * An extra {@link UserHandle} can be specified in the intent as {@link EXTRA_USER}, if the user for
  * which the action needs to be performed is different to the one the Settings App will run in.
  */
-public class ChooseAccountActivity extends PreferenceActivity {
+public class ChooseAccountActivity extends InstrumentedPreferenceActivity {
 
     private static final String TAG = "ChooseAccountActivity";
     private String[] mAuthorities;
@@ -89,6 +91,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCOUNTS_CHOOSE_ACCOUNT_ACTIVITY;
+    }
+
+    @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/accounts/ManageAccountsSettings.java b/src/com/android/settings/accounts/ManageAccountsSettings.java
index 85ecd90..bbb8c14 100644
--- a/src/com/android/settings/accounts/ManageAccountsSettings.java
+++ b/src/com/android/settings/accounts/ManageAccountsSettings.java
@@ -47,6 +47,7 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.AccountPreference;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
@@ -87,6 +88,11 @@
     private Account mFirstAccount;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.ACCOUNTS_MANAGE_ACCOUNTS;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index 9c94525..28ac1d0 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -41,6 +41,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.applications.ApplicationsState.AppEntry;
@@ -127,6 +128,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATIONS_ADVANCED;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         mActivityResumed = true;
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index ac06176..a7dc500 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -35,12 +35,13 @@
 import android.preference.PreferenceFragment;
 import android.util.Log;
 
+import com.android.settings.InstrumentedPreferenceFragment;
 import com.android.settings.SettingsActivity;
 import com.android.settings.applications.ApplicationsState.AppEntry;
 
 import java.util.ArrayList;
 
-public abstract class AppInfoBase extends PreferenceFragment
+public abstract class AppInfoBase extends InstrumentedPreferenceFragment
         implements ApplicationsState.Callbacks {
 
     public static final String ARG_PACKAGE_NAME = "package";
diff --git a/src/com/android/settings/applications/AppLaunchSettings.java b/src/com/android/settings/applications/AppLaunchSettings.java
index c31d8ad..ffb84ef 100644
--- a/src/com/android/settings/applications/AppLaunchSettings.java
+++ b/src/com/android/settings/applications/AppLaunchSettings.java
@@ -37,6 +37,7 @@
 import android.widget.Button;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.applications.ApplicationsState.AppEntry;
@@ -187,4 +188,8 @@
                 : R.string.launch_defaults_none);
     }
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATIONS_APP_LAUNCH;
+    }
 }
diff --git a/src/com/android/settings/applications/AppOpsDetails.java b/src/com/android/settings/applications/AppOpsDetails.java
index d9dec19..88591d7 100644
--- a/src/com/android/settings/applications/AppOpsDetails.java
+++ b/src/com/android/settings/applications/AppOpsDetails.java
@@ -38,13 +38,15 @@
 import android.widget.Switch;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
 
 import java.util.List;
 
-public class AppOpsDetails extends Fragment {
+public class AppOpsDetails extends InstrumentedFragment {
     static final String TAG = "AppOpsDetails";
 
     public static final String ARG_PACKAGE_NAME = "package";
@@ -192,6 +194,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APP_OPS_DETAILS;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         if (!refreshUi()) {
diff --git a/src/com/android/settings/applications/AppOpsSummary.java b/src/com/android/settings/applications/AppOpsSummary.java
index 382caed..782b8fb 100644
--- a/src/com/android/settings/applications/AppOpsSummary.java
+++ b/src/com/android/settings/applications/AppOpsSummary.java
@@ -28,9 +28,11 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 
-public class AppOpsSummary extends Fragment {
+public class AppOpsSummary extends InstrumentedFragment {
     // layout inflater object used to inflate views
     private LayoutInflater mInflater;
     
@@ -49,6 +51,11 @@
 
     int mCurPos;
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APP_OPS_SUMMARY;
+    }
+
     class MyPagerAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener {
 
         public MyPagerAdapter(FragmentManager fm) {
diff --git a/src/com/android/settings/applications/AppPermissionSettings.java b/src/com/android/settings/applications/AppPermissionSettings.java
index 496faf5..1776b3a 100644
--- a/src/com/android/settings/applications/AppPermissionSettings.java
+++ b/src/com/android/settings/applications/AppPermissionSettings.java
@@ -35,6 +35,7 @@
 import android.widget.Spinner;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.ISms;
 import com.android.internal.telephony.SmsUsageMonitor;
 import com.android.settings.R;
@@ -183,6 +184,11 @@
                 count, count);
     }
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATIONS_APP_PERMISSION;
+    }
+
     private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener {
         private final String mPackageName;
         private final ISms mSmsManager;
diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index 2f65a76..4b80fdd 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -37,6 +37,7 @@
 import android.widget.Button;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.applications.ApplicationsState.AppEntry;
@@ -487,6 +488,11 @@
         return Formatter.formatFileSize(context, size);
     }
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATIONS_APP_STORAGE;
+    }
+
     class ClearCacheObserver extends IPackageDataObserver.Stub {
         public void onRemoveCompleted(final String packageName, final boolean succeeded) {
             final Message msg = mHandler.obtainMessage(MSG_CLEAR_CACHE);
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 0fffb7e..9f6c969 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -56,6 +56,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.DataUsageSummary;
 import com.android.settings.DataUsageSummary.AppItem;
 import com.android.settings.R;
@@ -223,6 +224,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATIONS_INSTALLED_APP_DETAILS;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         AppItem app = new AppItem(mAppEntry.info.uid);
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index a034964..84b9763 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -52,6 +52,8 @@
 import android.widget.Spinner;
 
 import com.android.internal.content.PackageHelper;
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.Settings.AllApplicationsActivity;
 import com.android.settings.Settings.NotificationAppListActivity;
@@ -113,8 +115,8 @@
  * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
  * intent.
  */
-public class ManageApplications extends Fragment implements OnItemClickListener,
-        OnItemSelectedListener {
+public class ManageApplications extends InstrumentedFragment
+        implements OnItemClickListener, OnItemSelectedListener {
 
     static final String TAG = "ManageApplications";
     static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -320,6 +322,20 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        switch (mListType) {
+            case LIST_TYPE_MAIN:
+                return MetricsLogger.MANAGE_APPLICATIONS;
+            case LIST_TYPE_ALL:
+                return MetricsLogger.MANAGE_APPLICATIONS_ALL;
+            case LIST_TYPE_NOTIFICATION:
+                return MetricsLogger.MANAGE_APPLICATIONS_NOTIFICATIONS;
+            default:
+                return MetricsLogger.VIEW_UNKNOWN;
+        }
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         updateView();
diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java
index f0e76d4..1e7cf09 100644
--- a/src/com/android/settings/applications/ProcessStatsDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsDetail.java
@@ -17,7 +17,6 @@
 package com.android.settings.applications;
 
 import android.app.ActivityManager;
-import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
@@ -32,6 +31,8 @@
 import android.widget.ImageView;
 import android.widget.ProgressBar;
 import android.widget.TextView;
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
@@ -42,7 +43,7 @@
 
 import static com.android.settings.Utils.prepareCustomPreferencesList;
 
-public class ProcessStatsDetail extends Fragment implements Button.OnClickListener {
+public class ProcessStatsDetail extends InstrumentedFragment implements Button.OnClickListener {
     private static final String TAG = "ProcessStatsDetail";
 
     public static final int ACTION_FORCE_STOP = 1;
@@ -98,6 +99,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATIONS_PROCESS_STATS_DETAIL;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         checkForceStop();
diff --git a/src/com/android/settings/applications/ProcessStatsMemDetail.java b/src/com/android/settings/applications/ProcessStatsMemDetail.java
index ab7dbdb..7ae2824 100644
--- a/src/com/android/settings/applications/ProcessStatsMemDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsMemDetail.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.applications;
 
-import android.app.Fragment;
 import android.os.Bundle;
 import android.text.format.Formatter;
 import android.view.LayoutInflater;
@@ -25,11 +24,13 @@
 import android.widget.ProgressBar;
 import android.widget.TextView;
 import com.android.internal.app.ProcessStats;
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 
 import static com.android.settings.Utils.prepareCustomPreferencesList;
 
-public class ProcessStatsMemDetail extends Fragment {
+public class ProcessStatsMemDetail extends InstrumentedFragment {
     public static final String EXTRA_MEM_TIMES = "mem_times";
     public static final String EXTRA_MEM_STATE_WEIGHTS = "mem_state_weights";
     public static final String EXTRA_MEM_CACHED_WEIGHT = "mem_cached_weight";
@@ -84,6 +85,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATIONS_PROCESS_STATS_MEM_DETAIL;
+    }
+
+    @Override
     public void onPause() {
         super.onPause();
     }
diff --git a/src/com/android/settings/applications/ProcessStatsUi.java b/src/com/android/settings/applications/ProcessStatsUi.java
index bf1f666..45e24dd 100644
--- a/src/com/android/settings/applications/ProcessStatsUi.java
+++ b/src/com/android/settings/applications/ProcessStatsUi.java
@@ -41,7 +41,9 @@
 import com.android.internal.app.IProcessStats;
 import com.android.internal.app.ProcessMap;
 import com.android.internal.app.ProcessStats;
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.util.MemInfoReader;
+import com.android.settings.InstrumentedPreferenceFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
@@ -53,7 +55,7 @@
 import java.util.Comparator;
 import java.util.HashMap;
 
-public class ProcessStatsUi extends PreferenceFragment
+public class ProcessStatsUi extends InstrumentedPreferenceFragment
         implements LinearColorBar.OnRegionTappedListener {
     static final String TAG = "ProcessStatsUi";
     static final boolean DEBUG = false;
@@ -184,14 +186,14 @@
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        refreshStats();
+    protected int getMetricsCategory() {
+        return MetricsLogger.APPLICATIONS_PROCESS_STATS_UI;
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
+    public void onResume() {
+        super.onResume();
+        refreshStats();
     }
 
     @Override
diff --git a/src/com/android/settings/applications/RunningServiceDetails.java b/src/com/android/settings/applications/RunningServiceDetails.java
index 45cad3d..8f074fd 100644
--- a/src/com/android/settings/applications/RunningServiceDetails.java
+++ b/src/com/android/settings/applications/RunningServiceDetails.java
@@ -33,6 +33,8 @@
 import android.widget.Button;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
@@ -43,7 +45,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 
-public class RunningServiceDetails extends Fragment
+public class RunningServiceDetails extends InstrumentedFragment
         implements RunningState.OnRefreshUiListener {
     static final String TAG = "RunningServicesDetails";
 
@@ -533,6 +535,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.RUNNING_SERVICE_DETAILS;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         ensureData();
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index c85e515..b1eed51 100755
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -44,6 +44,7 @@
 import android.widget.EditText;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -123,6 +124,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.BLUETOOTH;
+    }
+
+    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         mInitialScanStarted = (savedInstanceState != null);    // don't auto start scan after rotation
diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java
index 809ca96..9441626 100644
--- a/src/com/android/settings/bluetooth/DevicePickerFragment.java
+++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java
@@ -29,6 +29,7 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 
@@ -84,6 +85,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.BLUETOOTH_DEVICE_PICKER;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         getActivity().setTitle(getString(R.string.device_picker));
diff --git a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
index e563e64..1df6275 100755
--- a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
+++ b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
@@ -30,6 +30,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.EditText;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -69,6 +70,11 @@
     private boolean mProfileGroupIsRemoved;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.BLUETOOTH_DEVICE_PROFILES;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index 8a92860..ae1b6d0 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -34,12 +34,15 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 
 import java.util.List;
 
-public class DashboardSummary extends Fragment {
+public class DashboardSummary extends InstrumentedFragment {
     private static final String LOG_TAG = "DashboardSummary";
 
     private LayoutInflater mLayoutInflater;
@@ -67,6 +70,11 @@
     private HomePackageReceiver mHomePackageReceiver = new HomePackageReceiver();
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DASHBOARD_SUMMARY;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
 
diff --git a/src/com/android/settings/dashboard/SearchResultsSummary.java b/src/com/android/settings/dashboard/SearchResultsSummary.java
index 0a43ce9..af7cf4a 100644
--- a/src/com/android/settings/dashboard/SearchResultsSummary.java
+++ b/src/com/android/settings/dashboard/SearchResultsSummary.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.dashboard;
 
-import android.app.Fragment;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -37,6 +36,8 @@
 import android.widget.ListView;
 import android.widget.SearchView;
 import android.widget.TextView;
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
@@ -44,7 +45,7 @@
 
 import java.util.HashMap;
 
-public class SearchResultsSummary extends Fragment {
+public class SearchResultsSummary extends InstrumentedFragment {
 
     private static final String LOG_TAG = "SearchResultsSummary";
 
@@ -245,6 +246,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DASHBOARD_SEARCH_RESULTS;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
 
diff --git a/src/com/android/settings/deviceinfo/ImeiInformation.java b/src/com/android/settings/deviceinfo/ImeiInformation.java
index 37b6c1d..c4f4bbb 100644
--- a/src/com/android/settings/deviceinfo/ImeiInformation.java
+++ b/src/com/android/settings/deviceinfo/ImeiInformation.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.deviceinfo;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
@@ -27,9 +28,10 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
+import com.android.settings.InstrumentedPreferenceActivity;
 import com.android.settings.R;
 
-public class ImeiInformation extends PreferenceActivity {
+public class ImeiInformation extends InstrumentedPreferenceActivity {
 
     private static final String KEY_PRL_VERSION = "prl_version";
     private static final String KEY_MIN_NUMBER = "min_number";
@@ -151,4 +153,8 @@
         }
     }
 
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DEVICEINFO_IMEI_INFORMATION;
+    }
 }
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java
index 1958f38..a07f7c2 100644
--- a/src/com/android/settings/deviceinfo/Memory.java
+++ b/src/com/android/settings/deviceinfo/Memory.java
@@ -47,6 +47,7 @@
 import android.view.MenuItem;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
@@ -85,6 +86,11 @@
     private ArrayList<StorageVolumePreferenceCategory> mCategories = Lists.newArrayList();
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DEVICEINFO_MEMORY;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/deviceinfo/SimStatus.java b/src/com/android/settings/deviceinfo/SimStatus.java
index e50d0d9..c52f385 100644
--- a/src/com/android/settings/deviceinfo/SimStatus.java
+++ b/src/com/android/settings/deviceinfo/SimStatus.java
@@ -36,9 +36,11 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.DefaultPhoneNotifier;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.settings.InstrumentedPreferenceActivity;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
@@ -65,7 +67,7 @@
  * # Signal Strength
  *
  */
-public class SimStatus extends PreferenceActivity {
+public class SimStatus extends InstrumentedPreferenceActivity {
     private static final String TAG = "SimStatus";
 
     private static final String KEY_DATA_STATE = "data_state";
@@ -170,6 +172,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DEVICEINFO_SIM_STATUS;
+    }
+
+    @Override
     protected void onResume() {
         super.onResume();
         if (mPhone != null) {
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 646792c..a78d06c 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -41,7 +41,9 @@
 import android.widget.ListAdapter;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.util.ArrayUtils;
+import com.android.settings.InstrumentedPreferenceActivity;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
@@ -55,7 +57,7 @@
  * # XMPP/buzz/tickle status : TODO
  *
  */
-public class Status extends PreferenceActivity {
+public class Status extends InstrumentedPreferenceActivity {
 
     private static final String KEY_BATTERY_STATUS = "battery_status";
     private static final String KEY_BATTERY_LEVEL = "battery_level";
@@ -232,6 +234,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DEVICEINFO_STATUS;
+    }
+
+    @Override
     protected void onResume() {
         super.onResume();
         registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter,
diff --git a/src/com/android/settings/deviceinfo/UsbSettings.java b/src/com/android/settings/deviceinfo/UsbSettings.java
index c3b3f96..d8a675c 100644
--- a/src/com/android/settings/deviceinfo/UsbSettings.java
+++ b/src/com/android/settings/deviceinfo/UsbSettings.java
@@ -28,6 +28,7 @@
 import android.preference.PreferenceScreen;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
@@ -82,6 +83,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.DEVICEINFO_USB;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java b/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
index 63e4e13..c977063 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.fuelgauge;
 
-import android.app.Fragment;
 import android.content.Intent;
 import android.os.BatteryStats;
 import android.os.Bundle;
@@ -24,10 +23,12 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.os.BatteryStatsHelper;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 
-public class BatteryHistoryDetail extends Fragment {
+public class BatteryHistoryDetail extends InstrumentedFragment {
     public static final String EXTRA_STATS = "stats";
     public static final String EXTRA_BROADCAST = "broadcast";
 
@@ -50,4 +51,9 @@
         chart.setStats(mStats, mBatteryBroadcast);
         return view;
     }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.FUELGAUGE_BATTERY_HISTORY_DETAIL;
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
index e6b90a7..d8a9ca0 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverSettings.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
@@ -34,6 +34,7 @@
 import android.util.Log;
 import android.widget.Switch;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
@@ -61,6 +62,11 @@
     private PowerManager mPowerManager;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.FUELGAUGE_BATTERY_SAVER;
+    }
+
+    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         if (mCreated) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index e3c8dab..d796570 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -47,10 +47,12 @@
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.internal.util.FastPrintWriter;
 import com.android.settings.DisplaySettings;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
@@ -64,7 +66,7 @@
 import java.io.StringWriter;
 import java.io.Writer;
 
-public class PowerUsageDetail extends Fragment implements Button.OnClickListener {
+public class PowerUsageDetail extends InstrumentedFragment implements Button.OnClickListener {
 
     // Note: Must match the sequence of the DrainType
     private static int[] sDrainTypeDesciptions = new int[] {
@@ -345,6 +347,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.FUELGAUGE_POWER_USAGE_DETAIL;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         mStartTime = android.os.Process.getElapsedCpuTime();
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 5ee4fa0..dbc78c2 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -38,10 +38,12 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.internal.os.PowerProfile;
 import com.android.settings.HelpUtils;
+import com.android.settings.InstrumentedPreferenceFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 
@@ -51,7 +53,7 @@
  * Displays a list of apps and subsystems that consume power, ordered by how much power was
  * consumed since the last time it was unplugged.
  */
-public class PowerUsageSummary extends PreferenceFragment {
+public class PowerUsageSummary extends InstrumentedPreferenceFragment {
 
     private static final boolean DEBUG = false;
 
@@ -120,6 +122,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.FUELGAUGE_POWER_USAGE_SUMMARY;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         BatteryStatsHelper.dropFile(getActivity(), BATTERY_HISTORY_FILE);
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index 20a273f..1b2f567 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -51,6 +51,7 @@
 import android.view.textservice.TextServicesManager;
 
 import com.android.internal.app.LocalePicker;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.Settings.KeyboardLayoutPickerActivity;
 import com.android.settings.SettingsActivity;
@@ -104,6 +105,11 @@
     private DevicePolicyManager mDpm;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.INPUTMETHOD_LANGUAGE;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
index 146f512..c73ccef 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
@@ -31,6 +31,7 @@
 import android.view.inputmethod.InputMethodManager;
 import android.view.inputmethod.InputMethodSubtype;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
@@ -53,6 +54,11 @@
     private Collator mCollator;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.INPUTMETHOD_SUBTYPE_ENABLER;
+    }
+
+    @Override
     public void onCreate(final Bundle icicle) {
         super.onCreate(icicle);
         mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java
index 3562cb4..69586b9 100644
--- a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java
+++ b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.inputmethod;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.SettingsPreferenceFragment;
 
 import android.content.Context;
@@ -49,6 +50,11 @@
     public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.INPUTMETHOD_KEYBOARD;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/inputmethod/SpellCheckersSettings.java b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
index 5a8ccea..729fdc6 100644
--- a/src/com/android/settings/inputmethod/SpellCheckersSettings.java
+++ b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
@@ -30,6 +30,7 @@
 import android.view.textservice.TextServicesManager;
 import android.widget.Switch;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
@@ -54,6 +55,11 @@
     private TextServicesManager mTsm;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.INPUTMETHOD_SPELL_CHECKERS;
+    }
+
+    @Override
     public void onCreate(final Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
index 4f231cb..3eb5dc6 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.inputmethod;
 
-import android.app.Fragment;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -27,6 +26,8 @@
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.inputmethod.UserDictionaryAddWordContents.LocaleRenderer;
@@ -40,7 +41,7 @@
  * As opposed to the UserDictionaryActivity, this is only invoked within Settings
  * from the UserDictionarySettings.
  */
-public class UserDictionaryAddWordFragment extends Fragment
+public class UserDictionaryAddWordFragment extends InstrumentedFragment
         implements AdapterView.OnItemSelectedListener,
         com.android.internal.app.LocalePicker.LocaleSelectionListener {
 
@@ -109,6 +110,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.INPUTMETHOD_USER_DICTIONARY_ADD_WORD;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         // We are being shown: display the word
diff --git a/src/com/android/settings/inputmethod/UserDictionaryList.java b/src/com/android/settings/inputmethod/UserDictionaryList.java
index 7439001..ab23614 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryList.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryList.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.inputmethod;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
@@ -43,6 +44,11 @@
     private String mLocale;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.INPUTMETHOD_USER_DICTIONARY;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity()));
diff --git a/src/com/android/settings/location/LocationMode.java b/src/com/android/settings/location/LocationMode.java
index 7e95cac..d203bc4 100644
--- a/src/com/android/settings/location/LocationMode.java
+++ b/src/com/android/settings/location/LocationMode.java
@@ -19,6 +19,7 @@
 import android.preference.PreferenceScreen;
 import android.provider.Settings;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 
 /**
@@ -42,6 +43,11 @@
     private RadioButtonPreference mSensorsOnly;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.LOCATION_MODE;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         createPreferenceHierarchy();
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index d66f91c..d0dde32 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -34,6 +34,7 @@
 import android.view.MenuItem;
 import android.widget.Switch;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
@@ -84,6 +85,11 @@
     private UserManager mUm;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.LOCATION;
+    }
+
+    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
diff --git a/src/com/android/settings/location/ScanningSettings.java b/src/com/android/settings/location/ScanningSettings.java
index 364ad7b..428701a 100644
--- a/src/com/android/settings/location/ScanningSettings.java
+++ b/src/com/android/settings/location/ScanningSettings.java
@@ -21,6 +21,7 @@
 import android.preference.SwitchPreference;
 import android.provider.Settings.Global;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
@@ -31,6 +32,11 @@
     private static final String KEY_WIFI_SCAN_ALWAYS_AVAILABLE = "wifi_always_scanning";
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.LOCATION_SCANNING;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         createPreferenceHierarchy();
diff --git a/src/com/android/settings/net/DataUsageMeteredSettings.java b/src/com/android/settings/net/DataUsageMeteredSettings.java
index d567c7e..ec1dd38 100644
--- a/src/com/android/settings/net/DataUsageMeteredSettings.java
+++ b/src/com/android/settings/net/DataUsageMeteredSettings.java
@@ -34,6 +34,7 @@
 import android.preference.SwitchPreference;
 import android.telephony.TelephonyManager;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -60,6 +61,11 @@
     private Preference mWifiDisabled;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NET_DATA_USAGE_METERED;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         final Context context = getActivity();
diff --git a/src/com/android/settings/nfc/AndroidBeam.java b/src/com/android/settings/nfc/AndroidBeam.java
index 20201f4..6267570 100644
--- a/src/com/android/settings/nfc/AndroidBeam.java
+++ b/src/com/android/settings/nfc/AndroidBeam.java
@@ -27,11 +27,13 @@
 import android.view.ViewGroup;
 import android.widget.Switch;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.widget.SwitchBar;
 
-public class AndroidBeam extends Fragment
+public class AndroidBeam extends InstrumentedFragment
         implements SwitchBar.OnSwitchChangeListener {
     private View mView;
     private NfcAdapter mNfcAdapter;
@@ -98,4 +100,9 @@
         }
         mSwitchBar.setEnabled(true);
     }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NFC_BEAM;
+    }
 }
diff --git a/src/com/android/settings/nfc/PaymentSettings.java b/src/com/android/settings/nfc/PaymentSettings.java
index 02254dd..4f04d73 100644
--- a/src/com/android/settings/nfc/PaymentSettings.java
+++ b/src/com/android/settings/nfc/PaymentSettings.java
@@ -42,6 +42,7 @@
 import android.widget.TextView;
 
 import com.android.internal.content.PackageMonitor;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.HelpUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -58,6 +59,11 @@
 
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NFC_PAYMENT;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index 375b855..db957a7 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -35,6 +35,7 @@
 import android.util.Log;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.AppHeader;
 import com.android.settings.R;
@@ -87,6 +88,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NOTIFICATION_APP_NOTIFICATION;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mContext = getActivity();
diff --git a/src/com/android/settings/notification/NotificationSettings.java b/src/com/android/settings/notification/NotificationSettings.java
index 123f0ef..ce7ba14 100644
--- a/src/com/android/settings/notification/NotificationSettings.java
+++ b/src/com/android/settings/notification/NotificationSettings.java
@@ -48,6 +48,7 @@
 import android.provider.Settings;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.DropDownPreference;
 import com.android.settings.R;
@@ -105,6 +106,11 @@
     private int mRingerMode = -1;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NOTIFICATION;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mContext = getActivity();
diff --git a/src/com/android/settings/notification/NotificationStation.java b/src/com/android/settings/notification/NotificationStation.java
index 3f4d3df..a54e3dd 100644
--- a/src/com/android/settings/notification/NotificationStation.java
+++ b/src/com/android/settings/notification/NotificationStation.java
@@ -46,6 +46,7 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
@@ -137,6 +138,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NOTIFICATION_STATION;
+    }
+
+    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         logd("onActivityCreated(%s)", savedInstanceState);
         super.onActivityCreated(savedInstanceState);
diff --git a/src/com/android/settings/notification/OtherSoundSettings.java b/src/com/android/settings/notification/OtherSoundSettings.java
index 8528ec7..b765b35 100644
--- a/src/com/android/settings/notification/OtherSoundSettings.java
+++ b/src/com/android/settings/notification/OtherSoundSettings.java
@@ -33,6 +33,7 @@
 import android.provider.Settings.System;
 import android.telephony.TelephonyManager;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
@@ -166,6 +167,11 @@
     private Context mContext;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NOTIFICATION_OTHER_SOUND;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
diff --git a/src/com/android/settings/notification/RedactionInterstitial.java b/src/com/android/settings/notification/RedactionInterstitial.java
index 2bfad1a..a6df6ec 100644
--- a/src/com/android/settings/notification/RedactionInterstitial.java
+++ b/src/com/android/settings/notification/RedactionInterstitial.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.notification;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
@@ -59,6 +60,11 @@
         private RadioButton mHideAllButton;
 
         @Override
+        protected int getMetricsCategory() {
+            return MetricsLogger.NOTIFICATION_REDACTION;
+        }
+
+        @Override
         public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 Bundle savedInstanceState) {
             View view = inflater.inflate(R.layout.redaction_interstitial, container, false);
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 441990b..c2e143a 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -50,6 +50,7 @@
 import android.widget.ScrollView;
 import android.widget.TimePicker;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.DropDownPreference;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -144,6 +145,11 @@
     private AlertDialog mDialog;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.NOTIFICATION_ZEN_MODE;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mContext = getActivity();
diff --git a/src/com/android/settings/print/PrintJobSettingsFragment.java b/src/com/android/settings/print/PrintJobSettingsFragment.java
index 978e4d6..b16c63d 100644
--- a/src/com/android/settings/print/PrintJobSettingsFragment.java
+++ b/src/com/android/settings/print/PrintJobSettingsFragment.java
@@ -32,6 +32,7 @@
 import android.view.MenuItem;
 import android.view.View;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
@@ -68,6 +69,11 @@
     private PrintJob mPrintJob;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.PRINT_JOB_SETTINGS;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java
index e36e92c..e42fddd 100644
--- a/src/com/android/settings/print/PrintServiceSettingsFragment.java
+++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java
@@ -59,6 +59,7 @@
 import android.widget.Switch;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
@@ -140,6 +141,11 @@
     private SearchView mSearchView;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.PRINT_SERVICE_SETTINGS;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         mSettingsContentObserver.register(getContentResolver());
diff --git a/src/com/android/settings/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java
index 7317d79..27ccc59 100644
--- a/src/com/android/settings/print/PrintSettingsFragment.java
+++ b/src/com/android/settings/print/PrintSettingsFragment.java
@@ -57,6 +57,7 @@
 import android.widget.TextView;
 
 import com.android.internal.content.PackageMonitor;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.DialogCreatable;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -123,6 +124,11 @@
     private Spinner mSpinner;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.PRINT_SETTINGS;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.print_settings);
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index 3ebc250..91dadbb 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -46,6 +46,7 @@
 import android.widget.TextView;
 import android.view.ViewGroup;
 import android.widget.AdapterView;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.RestrictedSettingsFragment;
 import com.android.settings.Utils;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -116,6 +117,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.SIM;
+    }
+
+    @Override
     public void onCreate(final Bundle bundle) {
         super.onCreate(bundle);
 
diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java
index fa61aec..c8a4c3d 100644
--- a/src/com/android/settings/tts/TextToSpeechSettings.java
+++ b/src/com/android/settings/tts/TextToSpeechSettings.java
@@ -19,6 +19,7 @@
 import static android.provider.Settings.Secure.TTS_DEFAULT_RATE;
 import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
@@ -143,6 +144,11 @@
     };
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.TTS_TEXT_TO_SPEECH;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.tts_settings);
diff --git a/src/com/android/settings/tts/TtsEngineSettingsFragment.java b/src/com/android/settings/tts/TtsEngineSettingsFragment.java
index 542de41..691e155 100644
--- a/src/com/android/settings/tts/TtsEngineSettingsFragment.java
+++ b/src/com/android/settings/tts/TtsEngineSettingsFragment.java
@@ -33,6 +33,7 @@
 import android.util.Log;
 import android.util.Pair;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
@@ -99,6 +100,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.TTS_ENGINE_SETTINGS;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.tts_engine_settings);
diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java
index 74ee6d9..e09d650 100644
--- a/src/com/android/settings/users/AppRestrictionsFragment.java
+++ b/src/com/android/settings/users/AppRestrictionsFragment.java
@@ -56,6 +56,7 @@
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.Switch;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
@@ -258,6 +259,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.USERS_APP_RESTRICTIONS;
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putInt(EXTRA_USER_ID, mUser.getIdentifier());
diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java
index d738dd6..90e5a43 100644
--- a/src/com/android/settings/users/UserDetailsSettings.java
+++ b/src/com/android/settings/users/UserDetailsSettings.java
@@ -26,6 +26,7 @@
 import android.preference.Preference;
 import android.preference.SwitchPreference;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
@@ -65,6 +66,11 @@
     private Bundle mDefaultGuestRestrictions;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.USER_DETAILS;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index ff06b69..6d0cc5a 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -56,6 +56,7 @@
 import android.view.View.OnClickListener;
 import android.widget.SimpleAdapter;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.ChooseLockGeneric;
 import com.android.settings.OwnerInfoSettings;
@@ -179,6 +180,11 @@
     };
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.USER;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/voice/VoiceInputSettings.java b/src/com/android/settings/voice/VoiceInputSettings.java
index bc299c2..bac297e 100644
--- a/src/com/android/settings/voice/VoiceInputSettings.java
+++ b/src/com/android/settings/voice/VoiceInputSettings.java
@@ -27,6 +27,7 @@
 import android.service.voice.VoiceInteractionService;
 import android.service.voice.VoiceInteractionServiceInfo;
 import android.speech.RecognitionService;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -73,6 +74,11 @@
     private VoiceInputHelper mHelper;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.VOICE_INPUT;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.voice_input_settings);
diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java
index c6c3546..04853f1 100644
--- a/src/com/android/settings/vpn2/VpnSettings.java
+++ b/src/com/android/settings/vpn2/VpnSettings.java
@@ -50,6 +50,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.internal.net.LegacyVpnInfo;
 import com.android.internal.net.VpnConfig;
 import com.android.internal.net.VpnProfile;
@@ -91,6 +92,11 @@
     private boolean mUnavailable;
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.VPN;
+    }
+
+    @Override
     public void onCreate(Bundle savedState) {
         super.onCreate(savedState);
 
diff --git a/src/com/android/settings/wfd/WifiDisplaySettings.java b/src/com/android/settings/wfd/WifiDisplaySettings.java
index 9f3ac82..7c5883a 100755
--- a/src/com/android/settings/wfd/WifiDisplaySettings.java
+++ b/src/com/android/settings/wfd/WifiDisplaySettings.java
@@ -59,6 +59,7 @@
 import android.widget.TextView;
 
 import com.android.internal.app.MediaRouteDialogPresenter;
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
@@ -115,6 +116,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.WFD_WIFI_DISPLAY;
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
diff --git a/src/com/android/settings/wifi/AdvancedWifiSettings.java b/src/com/android/settings/wifi/AdvancedWifiSettings.java
index 17fee88..4f5884e 100644
--- a/src/com/android/settings/wifi/AdvancedWifiSettings.java
+++ b/src/com/android/settings/wifi/AdvancedWifiSettings.java
@@ -42,6 +42,7 @@
 import android.util.Log;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.AppListSwitchPreference;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -81,6 +82,11 @@
     };
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.WIFI_ADVANCED;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.wifi_advanced_settings);
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
index e92bda7..2627bc4 100644
--- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
+++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
@@ -26,6 +26,7 @@
 import android.preference.PreferenceScreen;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -54,6 +55,11 @@
     private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.WIFI_SAVED_ACCESS_POINTS;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.wifi_display_saved_access_points);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 5c66309..0d04622 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -47,6 +47,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.RestrictedSettingsFragment;
 import com.android.settings.SettingsActivity;
@@ -322,6 +323,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.WIFI;
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
 
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index 879ebf8..72dca9e 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -51,6 +51,7 @@
 import android.widget.EditText;
 import android.widget.Toast;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
@@ -477,6 +478,11 @@
     }
 
     @Override
+    protected int getMetricsCategory() {
+        return MetricsLogger.WIFI_P2P;
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         if (mSelectedWifiPeer != null) {
             outState.putParcelable(SAVE_DIALOG_PEER, mSelectedWifiPeer.device);