New top-level Dock in Settings and a Dock Settings screen with Audio item. #2367275

Add a new top-level setting for car/desktop dock settings.
Sub menu contains one item - Audio (settings)
Sub text for Audio shows current docked status and launches either the
 audio settings or a dialog saying that you're not docked and you need to
 buy a new dock from Google (kidding).
diff --git a/src/com/android/settings/DockSettings.java b/src/com/android/settings/DockSettings.java
new file mode 100644
index 0000000..5cf8a7e
--- /dev/null
+++ b/src/com/android/settings/DockSettings.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2010 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.app.AlertDialog;
+import android.app.Dialog;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+
+import com.android.settings.bluetooth.DockEventReceiver;
+
+public class DockSettings extends PreferenceActivity {
+
+    private static final int DIALOG_NOT_DOCKED = 1;
+    private static final String KEY_AUDIO_SETTINGS = "dock_audio";
+    private Preference mAudioSettings;
+    private Intent mDockIntent;
+
+    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(Intent.ACTION_DOCK_EVENT)) {
+                handleDockChange(intent);
+            }
+        }
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ContentResolver resolver = getContentResolver();
+        addPreferencesFromResource(R.xml.dock_settings);
+
+        initDockSettings();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        IntentFilter filter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
+        registerReceiver(mReceiver, filter);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+
+        unregisterReceiver(mReceiver);
+    }
+
+    private void initDockSettings() {
+        mAudioSettings = findPreference(KEY_AUDIO_SETTINGS);
+    }
+
+    private void handleDockChange(Intent intent) {
+        if (mAudioSettings != null) {
+            int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, 0);
+            mDockIntent = intent;
+            int resId = R.string.dock_audio_summary_unknown;
+            switch (dockState) {
+            case Intent.EXTRA_DOCK_STATE_CAR:
+                resId = R.string.dock_audio_summary_car;
+                break;
+            case Intent.EXTRA_DOCK_STATE_DESK:
+                resId = R.string.dock_audio_summary_desk;
+                break;
+            case Intent.EXTRA_DOCK_STATE_UNDOCKED:
+                resId = R.string.dock_audio_summary_none;
+            }
+            mAudioSettings.setSummary(resId);
+            if (dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED) {
+                // remove undocked dialog if currently showing.
+                try {
+                    dismissDialog(DIALOG_NOT_DOCKED);
+                } catch (IllegalArgumentException iae) {
+                    // Maybe it was already dismissed
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+        if (preference == mAudioSettings) {
+            int dockState = mDockIntent.getIntExtra(Intent.EXTRA_DOCK_STATE, 0);
+            if (dockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) {
+                showDialog(DIALOG_NOT_DOCKED);
+            } else {
+                Intent i = new Intent(mDockIntent);
+                i.setAction(DockEventReceiver.ACTION_DOCK_SHOW_UI);
+                i.setClass(this, DockEventReceiver.class);
+                sendBroadcast(i);
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public Dialog onCreateDialog(int id) {
+        if (id == DIALOG_NOT_DOCKED) {
+            return createUndockedMessage();
+        }
+        return null;
+    }
+
+    private Dialog createUndockedMessage() {
+        final AlertDialog.Builder ab = new AlertDialog.Builder(this);
+        ab.setTitle(R.string.dock_not_found_title);
+        ab.setMessage(R.string.dock_not_found_text);
+        ab.setPositiveButton(android.R.string.ok, null);
+        return ab.create();
+    }
+}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index c0a8613..5309cf5 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -17,9 +17,9 @@
 package com.android.settings;
 
 import android.os.Bundle;
+import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceGroup;
-import android.provider.Settings.System;
 import android.telephony.TelephonyManager;
 
 public class Settings extends PreferenceActivity {
@@ -28,6 +28,7 @@
     private static final String KEY_CALL_SETTINGS = "call_settings";
     private static final String KEY_SYNC_SETTINGS = "sync_settings";
     private static final String KEY_SEARCH_SETTINGS = "search_settings";
+    private static final String KEY_DOCK_SETTINGS = "dock_settings";
     
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -40,6 +41,11 @@
         PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
         Utils.updatePreferenceToSpecificActivityOrRemove(this, parent, KEY_SYNC_SETTINGS, 0);
         Utils.updatePreferenceToSpecificActivityOrRemove(this, parent, KEY_SEARCH_SETTINGS, 0);
+
+        Preference dockSettings = parent.findPreference(KEY_DOCK_SETTINGS);
+        if (getResources().getBoolean(R.bool.has_dock_settings) == false && dockSettings != null) {
+            parent.removePreference(dockSettings);
+        }
     }
     
     @Override
diff --git a/src/com/android/settings/SoundAndDisplaySettings.java b/src/com/android/settings/SoundAndDisplaySettings.java
index e01f7c3..29eb878 100644
--- a/src/com/android/settings/SoundAndDisplaySettings.java
+++ b/src/com/android/settings/SoundAndDisplaySettings.java
@@ -18,8 +18,6 @@
 
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
 
-import com.android.settings.bluetooth.DockEventReceiver;
-
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -63,15 +61,11 @@
     private static final String KEY_EMERGENCY_TONE = "emergency_tone";
     private static final String KEY_SOUND_SETTINGS = "sound_settings";
     private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
-    private static final String KEY_DOCK_SETTINGS = "dock_settings";
 
     private CheckBoxPreference mSilent;
 
     private CheckBoxPreference mPlayMediaNotificationSounds;
 
-    private Preference mDockSettings;
-    private boolean mHasDockSettings;
-
     private IMountService mMountService = null;
 
     /*
@@ -99,16 +93,12 @@
         public void onReceive(Context context, Intent intent) {
             if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
                 updateState(false);
-            } else if (intent.getAction().equals(Intent.ACTION_DOCK_EVENT)) {
-                handleDockChange(intent);
             }
         }
     };
 
     private PreferenceGroup mSoundSettings;
 
-    private Intent mDockIntent;
-
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -178,7 +168,6 @@
             }
         }
 
-        initDockSettings();
     }
 
     @Override
@@ -188,12 +177,6 @@
         updateState(true);
 
         IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
-        if (mHasDockSettings) {
-            if (mDockSettings != null) {
-                mSoundSettings.removePreference(mDockSettings);
-            }
-            filter.addAction(Intent.ACTION_DOCK_EVENT);
-        }
         registerReceiver(mReceiver, filter);
     }
 
@@ -204,34 +187,6 @@
         unregisterReceiver(mReceiver);
     }
 
-    private void initDockSettings() {
-        mDockSettings = mSoundSettings.findPreference(KEY_DOCK_SETTINGS);
-        mHasDockSettings = getResources().getBoolean(R.bool.has_dock_settings);
-        if (mDockSettings != null) {
-            mSoundSettings.removePreference(mDockSettings);
-            // Don't care even if we dock
-            if (getResources().getBoolean(R.bool.has_dock_settings) == false) {
-                mDockSettings = null;
-            }
-        }
-    }
-
-    private void handleDockChange(Intent intent) {
-        if (mHasDockSettings && mDockSettings != null) {
-            int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, 0);
-            if (dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED) {
-                // Show dock settings item
-                mSoundSettings.addPreference(mDockSettings);
-
-                // Save the intent to send to the activity
-                mDockIntent = intent;
-            } else {
-                // Remove dock settings item
-                mSoundSettings.removePreference(mDockSettings);
-            }
-        }
-    }
-
     private void updateState(boolean force) {
         final int ringerMode = mAudioManager.getRingerMode();
         final boolean silentOrVibrateMode =
@@ -354,11 +309,6 @@
             boolean value = mNotificationPulse.isChecked();
             Settings.System.putInt(getContentResolver(),
                     Settings.System.NOTIFICATION_LIGHT_PULSE, value ? 1 : 0);
-        } else if (preference == mDockSettings) {
-            Intent i = new Intent(mDockIntent);
-            i.setAction(DockEventReceiver.ACTION_DOCK_SHOW_UI);
-            i.setClass(this, DockEventReceiver.class);
-            sendBroadcast(i);
         }
 
         return true;