Log visibility change for DialogCreatable in Settings.

Bug: 30681529
Test: adb logcat -b events | egrep "(sysui_|notification_)"
Test: make RunSettingsRoboTests
Change-Id: I51754d258ba1ddfae24323681f21cd02de4dbb4e
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
index 9865fb2..a32e421 100644
--- a/src/com/android/settings/ApnSettings.java
+++ b/src/com/android/settings/ApnSettings.java
@@ -507,4 +507,12 @@
         }
         return null;
     }
+
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        if (dialogId == DIALOG_RESTORE_DEFAULTAPN) {
+            return MetricsEvent.DIALOG_APN_RESTORE_DEFAULT;
+        }
+        return 0;
+    }
 }
diff --git a/src/com/android/settings/DialogCreatable.java b/src/com/android/settings/DialogCreatable.java
index a0de2e0..ca0d3d1 100644
--- a/src/com/android/settings/DialogCreatable.java
+++ b/src/com/android/settings/DialogCreatable.java
@@ -26,4 +26,6 @@
 public interface DialogCreatable {
 
     Dialog onCreateDialog(int dialogId);
+
+    int getDialogMetricsCategory(int dialogId);
 }
diff --git a/src/com/android/settings/DreamSettings.java b/src/com/android/settings/DreamSettings.java
index 2a7c852..6587097 100644
--- a/src/com/android/settings/DreamSettings.java
+++ b/src/com/android/settings/DreamSettings.java
@@ -183,6 +183,14 @@
         return super.onCreateDialog(dialogId);
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        if (dialogId == DIALOG_WHEN_TO_DREAM) {
+            return MetricsEvent.DIALOG_DREAM_START_DELAY;
+        }
+        return 0;
+    }
+
     private Dialog createWhenToDreamDialog() {
         final CharSequence[] items = {
                 mContext.getString(R.string.screensaver_settings_summary_dock),
diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java
index a26d0dc..81945df 100644
--- a/src/com/android/settings/EncryptionInterstitial.java
+++ b/src/com/android/settings/EncryptionInterstitial.java
@@ -259,6 +259,14 @@
             }
         }
 
+        @Override
+        public int getDialogMetricsCategory(int dialogId) {
+            if (dialogId == ACCESSIBILITY_WARNING_DIALOG) {
+                return MetricsEvent.DIALOG_ENCRYPTION_INTERSTITIAL_ACCESSIBILITY;
+            }
+            return 0;
+        }
+
         private void setRequirePasswordState(boolean required) {
             mPasswordRequired = required;
         }
diff --git a/src/com/android/settings/ProxySelector.java b/src/com/android/settings/ProxySelector.java
index ae5dd8b..80de9da 100644
--- a/src/com/android/settings/ProxySelector.java
+++ b/src/com/android/settings/ProxySelector.java
@@ -108,6 +108,11 @@
         return null;
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        return MetricsEvent.DIALOG_PROXY_SELECTOR_ERROR;
+    }
+
     private void showDialog(int dialogId) {
         if (mDialogFragment != null) {
             Log.e(TAG, "Old dialog fragment not null!");
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index cc87c05..28230a9 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -46,9 +46,11 @@
 
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settingslib.HelpUtils;
 
 import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Base class for Settings fragments, with some helper functions and dialog management.
@@ -501,10 +503,16 @@
         mDialogFragment.show(getChildFragmentManager(), Integer.toString(dialogId));
     }
 
+    @Override
     public Dialog onCreateDialog(int dialogId) {
         return null;
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        return 0;
+    }
+
     protected void removeDialog(int dialogId) {
         // mDialogFragment may not be visible yet in parent fragment's onResume().
         // To be able to dismiss dialog at that time, don't check
@@ -569,12 +577,10 @@
         onDialogShowing();
     }
 
-    public static class SettingsDialogFragment extends DialogFragment {
+    public static class SettingsDialogFragment extends InstrumentedDialogFragment {
         private static final String KEY_DIALOG_ID = "key_dialog_id";
         private static final String KEY_PARENT_FRAGMENT_ID = "key_parent_fragment_id";
 
-        private int mDialogId;
-
         private Fragment mParentFragment;
 
         private DialogInterface.OnCancelListener mOnCancelListener;
@@ -585,7 +591,7 @@
         }
 
         public SettingsDialogFragment(DialogCreatable fragment, int dialogId) {
-            mDialogId = dialogId;
+            super(fragment, dialogId);
             if (!(fragment instanceof Fragment)) {
                 throw new IllegalArgumentException("fragment argument must be an instance of "
                         + Fragment.class.getName());
@@ -593,6 +599,16 @@
             mParentFragment = (Fragment) fragment;
         }
 
+
+        @Override
+        public int getMetricsCategory() {
+            final int metricsCategory = mDialogCreatable.getDialogMetricsCategory(mDialogId);
+            if (metricsCategory <= 0) {
+                throw new IllegalStateException("Dialog must provide a metrics category");
+            }
+            return metricsCategory;
+        }
+
         @Override
         public void onSaveInstanceState(Bundle outState) {
             super.onSaveInstanceState(outState);
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 7485328..40c91ce 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -259,6 +259,14 @@
         return null;
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        if (dialogId == DIALOG_AP_SETTINGS) {
+            return MetricsEvent.DIALOG_AP_SETTINGS;
+        }
+        return 0;
+    }
+
     private class TetherChangeReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context content, Intent intent) {
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index 3168178..8535850 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -202,6 +202,15 @@
         }
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        if (dialogId == DIALOG_ID_ENABLE_WARNING) {
+            return MetricsEvent.DIALOG_ACCESSIBILITY_SERVICE_ENABLE;
+        } else {
+            return MetricsEvent.DIALOG_ACCESSIBILITY_SERVICE_DISABLE;
+        }
+    }
+
     private void updateSwitchBarToggleSwitch() {
         final boolean checked = AccessibilityUtils.getEnabledServicesFromSettings(getActivity())
                 .contains(mComponentName);
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index 6b6791e..ae06f9c 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -52,13 +52,13 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import com.google.android.collect.Lists;
-
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settingslib.RestrictedLockUtils;
 
+import com.google.android.collect.Lists;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Date;
@@ -153,6 +153,20 @@
     }
 
     @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case REALLY_REMOVE_DIALOG:
+                return MetricsEvent.DIALOG_ACCOUNT_SYNC_REMOVE;
+            case FAILED_REMOVAL_DIALOG:
+                return MetricsEvent.DIALOG_ACCOUNT_SYNC_FAILED_REMOVAL;
+            case CANT_DO_ONETIME_SYNC_DIALOG:
+                return MetricsEvent.DIALOG_ACCOUNT_SYNC_CANNOT_ONETIME_SYNC;
+            default:
+                return 0;
+        }
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         setPreferenceScreen(null);
diff --git a/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java b/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java
index 6f97068..f0a3fed 100644
--- a/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java
+++ b/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java
@@ -15,12 +15,25 @@
  */
 package com.android.settings.core.instrumentation;
 
+import com.android.settings.DialogCreatable;
 import com.android.settings.core.lifecycle.ObservableDialogFragment;
 
 public abstract class InstrumentedDialogFragment extends ObservableDialogFragment
         implements Instrumentable {
 
+    protected final DialogCreatable mDialogCreatable;
+    protected int mDialogId;
+
     public InstrumentedDialogFragment() {
+        this(null /* parentFragment */, 0 /* dialogId */);
+    }
+
+    /**
+     * Use this if the dialog is created via {@code DialogCreatable}
+     */
+    public InstrumentedDialogFragment(DialogCreatable dialogCreatable, int dialogId) {
+        mDialogCreatable = dialogCreatable;
+        mDialogId = dialogId;
         mLifecycle.addObserver(new VisibilityLoggerMixin(getMetricsCategory()));
     }
 
diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java
index 98352a7..b37e2e2 100644
--- a/src/com/android/settings/display/NightDisplaySettings.java
+++ b/src/com/android/settings/display/NightDisplaySettings.java
@@ -156,6 +156,17 @@
     }
 
     @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case DIALOG_START_TIME:
+                return MetricsEvent.DIALOG_NIGHT_DISPLAY_SET_START_TIME;
+            case DIALOG_END_TIME:
+                return MetricsEvent.DIALOG_NIGHT_DISPLAY_SET_END_TIME;
+            default:
+                return 0;
+        }
+    }
+    @Override
     public void onActivated(boolean activated) {
         mActivatedPreference.setChecked(activated);
     }
diff --git a/src/com/android/settings/users/RestrictedProfileSettings.java b/src/com/android/settings/users/RestrictedProfileSettings.java
index 182053f..31722e2 100644
--- a/src/com/android/settings/users/RestrictedProfileSettings.java
+++ b/src/com/android/settings/users/RestrictedProfileSettings.java
@@ -26,6 +26,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
@@ -133,6 +134,18 @@
         return null;
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case DIALOG_ID_EDIT_USER_INFO:
+                return MetricsProto.MetricsEvent.DIALOG_USER_EDIT;
+            case DIALOG_CONFIRM_REMOVE:
+                return MetricsProto.MetricsEvent.DIALOG_USER_REMOVE;
+            default:
+                return 0;
+        }
+    }
+
     private void removeUser() {
         getView().post(new Runnable() {
             public void run() {
diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java
index 65f55cb..47f8007 100644
--- a/src/com/android/settings/users/UserDetailsSettings.java
+++ b/src/com/android/settings/users/UserDetailsSettings.java
@@ -26,6 +26,7 @@
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
 
+import com.android.internal.logging.MetricsProto;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -192,6 +193,20 @@
         throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case DIALOG_CONFIRM_REMOVE:
+                return MetricsProto.MetricsEvent.DIALOG_USER_REMOVE;
+            case DIALOG_CONFIRM_ENABLE_CALLING:
+                return MetricsProto.MetricsEvent.DIALOG_USER_ENABLE_CALLING;
+            case DIALOG_CONFIRM_ENABLE_CALLING_AND_SMS:
+                return MetricsProto.MetricsEvent.DIALOG_USER_ENABLE_CALLING_AND_SMS;
+            default:
+                return 0;
+        }
+    }
+
     void removeUser() {
         mUserManager.removeUser(mUserInfo.id);
         finishFragment();
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index bc3712e..d070838 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -622,6 +622,32 @@
         }
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case DIALOG_CONFIRM_REMOVE:
+                return MetricsEvent.DIALOG_USER_REMOVE;
+            case DIALOG_USER_CANNOT_MANAGE:
+                return MetricsEvent.DIALOG_USER_CANNOT_MANAGE;
+            case DIALOG_ADD_USER:
+                return MetricsEvent.DIALOG_USER_ADD;
+            case DIALOG_SETUP_USER:
+                return MetricsEvent.DIALOG_USER_SETUP;
+            case DIALOG_SETUP_PROFILE:
+                return MetricsEvent.DIALOG_USER_SETUP_PROFILE;
+            case DIALOG_CHOOSE_USER_TYPE:
+                return MetricsEvent.DIALOG_USER_CHOOSE_TYPE;
+            case DIALOG_NEED_LOCKSCREEN:
+                return MetricsEvent.DIALOG_USER_NEED_LOCKSCREEN;
+            case DIALOG_CONFIRM_EXIT_GUEST:
+                return MetricsEvent.DIALOG_USER_CONFIRM_EXIT_GUEST;
+            case DIALOG_USER_PROFILE_EDITOR:
+                return MetricsEvent.DIALOG_USER_EDIT_PROFILE;
+            default:
+                return 0;
+        }
+    }
+
     private static boolean emergencyInfoActivityPresent(Context context) {
         Intent intent = new Intent(ACTION_EDIT_EMERGENCY_INFO).setPackage("com.android.emergency");
         List<ResolveInfo> infos = context.getPackageManager().queryIntentActivities(intent, 0);
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
index ea92b7f..55f0b63 100644
--- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
+++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
@@ -25,6 +25,7 @@
 import android.support.v7.preference.PreferenceScreen;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsProto;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -152,6 +153,16 @@
     }
 
     @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case WifiSettings.WIFI_DIALOG_ID:
+                return MetricsProto.MetricsEvent.DIALOG_WIFI_SAVED_AP_EDIT;
+            default:
+                return 0;
+        }
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
 
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 6198bc9..782ff13 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -597,6 +597,22 @@
         return super.onCreateDialog(dialogId);
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case WIFI_DIALOG_ID:
+                return MetricsEvent.DIALOG_WIFI_AP_EDIT;
+            case WPS_PBC_DIALOG_ID:
+                return MetricsEvent.DIALOG_WIFI_PBC;
+            case WPS_PIN_DIALOG_ID:
+                return MetricsEvent.DIALOG_WIFI_PIN;
+            case WRITE_NFC_DIALOG_ID:
+                return MetricsEvent.DIALOG_WIFI_WRITE_NFC;
+            default:
+                return 0;
+        }
+    }
+
     /**
      * Shows the latest access points available with supplemental information like
      * the strength of network and the security for it.
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index ddf7dfe..487090d 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -496,6 +496,21 @@
     }
 
     @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case DIALOG_DISCONNECT:
+                return MetricsEvent.DIALOG_WIFI_P2P_DISCONNECT;
+            case DIALOG_CANCEL_CONNECT:
+                return MetricsEvent.DIALOG_WIFI_P2P_CANCEL_CONNECT;
+            case DIALOG_RENAME:
+                return MetricsEvent.DIALOG_WIFI_P2P_RENAME;
+            case DIALOG_DELETE_GROUP:
+                return MetricsEvent.DIALOG_WIFI_P2P_DELETE_GROUP;
+        }
+        return 0;
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         if (mSelectedWifiPeer != null) {
             outState.putParcelable(SAVE_DIALOG_PEER, mSelectedWifiPeer.device);