Add validity check for developer options

Enable the developer options module if not already enabled when
necessary. Add log statements to help debug the root cause.

This change is to ensure no one stays blocked on not having access to
developer options while adding some additional logs to understand how
this inconsistent state is acheived.

Bug: 137797266
Test: manual, robolectric
Change-Id: Idbc1a421c22625fb3424239052eb669c7a0f8ff4
diff --git a/src/com/android/car/settings/development/DevelopmentSettingsUtil.java b/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
index 496de5b..d1894ba 100644
--- a/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
+++ b/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
@@ -26,6 +26,7 @@
 import android.provider.Settings;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
 import com.android.settingslib.development.DevelopmentSettingsEnabler;
 
 /**
@@ -36,6 +37,8 @@
  */
 public class DevelopmentSettingsUtil {
 
+    private static final Logger LOG = new Logger(DevelopmentSettingsUtil.class);
+
     private DevelopmentSettingsUtil() {
     }
 
@@ -47,10 +50,8 @@
         Settings.Global.putInt(context.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, enable ? 1 : 0);
 
-        // Used to enable developer options module.
-        ComponentName targetName = ComponentName.unflattenFromString(
-                context.getString(R.string.config_dev_options_module));
-        setDeveloperOptionsEnabledState(context, targetName, showDeveloperOptions(context));
+        // Enable developer options module.
+        setDeveloperOptionsEnabledState(context, showDeveloperOptions(context));
     }
 
     /**
@@ -73,6 +74,19 @@
                 Settings.Global.DEVICE_PROVISIONED, 0) != 0;
     }
 
+    /** Checks whether the developer options module is enabled. */
+    public static boolean isDeveloperOptionsModuleEnabled(Context context) {
+        PackageManager pm = context.getPackageManager();
+        ComponentName component = getDeveloperOptionsModule(context);
+        int state = pm.getComponentEnabledSetting(component);
+        return state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+    }
+
+    private static ComponentName getDeveloperOptionsModule(Context context) {
+        return ComponentName.unflattenFromString(
+                context.getString(R.string.config_dev_options_module));
+    }
+
     private static boolean showDeveloperOptions(Context context) {
         UserManager userManager = UserManager.get(context);
         boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context)
@@ -85,11 +99,15 @@
         return showDev;
     }
 
-    private static void setDeveloperOptionsEnabledState(Context context, ComponentName component,
-            boolean enabled) {
+    private static void setDeveloperOptionsEnabledState(Context context, boolean enabled) {
         PackageManager pm = context.getPackageManager();
+        ComponentName component = getDeveloperOptionsModule(context);
         int state = pm.getComponentEnabledSetting(component);
-        boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+        boolean isEnabled = isDeveloperOptionsModuleEnabled(context);
+        LOG.i("Enabling developer options module: " + component.flattenToString()
+                + " Current state: " + state
+                + " Currently enabled: " + isEnabled
+                + " Should enable: " + enabled);
         if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
             pm.setComponentEnabledSetting(component, enabled
                             ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
diff --git a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
index 92c32b1..c8a1146 100644
--- a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
@@ -23,12 +23,14 @@
 import androidx.preference.Preference;
 
 import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.PreferenceController;
 import com.android.car.settings.development.DevelopmentSettingsUtil;
 
 /** Controls the visibility of the developer options setting. */
 public class DeveloperOptionsEntryPreferenceController extends PreferenceController<Preference> {
 
+    private static final Logger LOG = new Logger(DeveloperOptionsEntryPreferenceController.class);
     private UserManager mUserManager;
 
     public DeveloperOptionsEntryPreferenceController(Context context, String preferenceKey,
@@ -47,4 +49,18 @@
         return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(), mUserManager)
                 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
     }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        // TODO(b/137797266): This should be removed when the root cause of the inconsistency is
+        //  discovered and fixed.
+        if (!DevelopmentSettingsUtil.isDeveloperOptionsModuleEnabled(getContext())) {
+            LOG.e("Inconsistent state: developer options enabled, but developer options module "
+                    + "disabled. Retry enabling...");
+            DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), /* enable= */ true);
+        }
+
+        getContext().startActivity(preference.getIntent());
+        return true;
+    }
 }