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/AndroidManifest.xml b/AndroidManifest.xml
index 9f55fe2..c1b3161 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -232,6 +232,19 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="DockSettings"
+                android:label="@string/dock_settings_title"
+                android:clearTaskOnLaunch="true"
+                >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="com.android.settings.DOCK_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.VOICE_LAUNCH" />
+                <category android:name="com.android.settings.SHORTCUT" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="DeviceInfoSettings" android:label="@string/device_info_settings"
                 >
             <intent-filter>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c459ccc..4a32962 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -953,8 +953,8 @@
     <!-- Dock not found dialog title -->
     <string name="dock_not_found_title">Dock not found</string>
     <!-- Dock not found dialog text -->
-    <string name="dock_not_found_text">You must dock the phone to configure audio settings for that dock</string>
-
+    <string name="dock_not_found_text">The phone must be docked to configure dock audio</string>
+    
     <!-- Acounts & Sync settings screen setting option name to go into the screen for data sync settings-->
     <string name="sync_settings">Accounts &amp; sync</string>
     <!-- Main Settings screen setting option summary text for the itme to go into the screen with data sync settings-->
diff --git a/res/xml/dock_settings.xml b/res/xml/dock_settings.xml
new file mode 100644
index 0000000..43e9fa5
--- /dev/null
+++ b/res/xml/dock_settings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+    android:title="@string/dock_settings_title"
+    android:key="parent">
+
+    <PreferenceScreen
+        android:key="dock_audio"
+        android:title="@string/dock_audio_settings_title"
+        android:summary="@string/dock_settings_summary"
+        android:widgetLayout="@*android:layout/preference_dialog" />
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
index 79a777d..0fe502e 100644
--- a/res/xml/settings.xml
+++ b/res/xml/settings.xml
@@ -133,6 +133,17 @@
                 android:targetClass="com.android.settings.LanguageSettings" />
         </com.android.settings.IconPreferenceScreen>
 
+        <!-- Dock -->
+
+        <com.android.settings.IconPreferenceScreen
+            android:key="dock_settings"
+            android:title="@string/dock_settings">
+            <intent
+                android:action="android.intent.action.MAIN"
+                android:targetPackage="com.android.settings"
+                android:targetClass="com.android.settings.DockSettings" />
+        </com.android.settings.IconPreferenceScreen>
+
         <!-- Accessibility feedback -->
 
         <com.android.settings.IconPreferenceScreen
diff --git a/res/xml/sound_and_display_settings.xml b/res/xml/sound_and_display_settings.xml
index 1ffbdbf..657a340 100644
--- a/res/xml/sound_and_display_settings.xml
+++ b/res/xml/sound_and_display_settings.xml
@@ -47,13 +47,6 @@
                 android:order="3"
                 android:streamType="music" />
 
-        <PreferenceScreen
-                android:key="dock_settings"
-                android:order="4"
-                android:title="@string/dock_settings_title"
-                android:summary="@string/dock_settings_summary"
-                android:widgetLayout="@*android:layout/preference_dialog" />
-
         <com.android.settings.DefaultRingtonePreference
                 android:key="ringtone"
                 android:title="@string/ringtone_title"
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;