summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI
diff options
context:
space:
mode:
Diffstat (limited to 'packages/SystemUI')
-rw-r--r--packages/SystemUI/AndroidManifest.xml2
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_enabled.pngbin0 -> 3736 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_normal.pngbin0 -> 3645 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_enabled.pngbin0 -> 4346 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_normal.pngbin0 -> 4288 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_rssi_enabled.pngbin0 -> 3251 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_rssi_normal.pngbin0 -> 3232 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_enabled.pngbin0 -> 3802 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_normal.pngbin0 -> 3756 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_enabled.pngbin0 -> 3438 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_normal.pngbin0 -> 3358 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_enabled.pngbin0 -> 3574 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_normal.pngbin0 -> 3569 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_rssi_enabled.pngbin0 -> 3083 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_rssi_normal.pngbin0 -> 3074 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_enabled.pngbin0 -> 3337 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_normal.pngbin0 -> 3321 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_enabled.pngbin0 -> 3827 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_normal.pngbin0 -> 3747 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_enabled.pngbin0 -> 4847 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_normal.pngbin0 -> 5212 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_rssi_enabled.pngbin0 -> 3499 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_rssi_normal.pngbin0 -> 3452 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_enabled.pngbin0 -> 4465 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_normal.pngbin0 -> 4301 bytes
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_battery.xml20
-rw-r--r--packages/SystemUI/res/layout/quick_settings.xml14
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile.xml20
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_airplane.xml25
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_battery.xml26
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_bluetooth.xml25
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_brightness.xml25
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_ime.xml23
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_location.xml26
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_media.xml23
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_rssi.xml25
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_settings.xml25
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_time.xml35
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_user.xml26
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_wifi.xml25
-rw-r--r--packages/SystemUI/res/layout/quick_settings_tile_wifi_display.xml25
-rw-r--r--packages/SystemUI/res/values-land/config.xml6
-rw-r--r--packages/SystemUI/res/values-land/dimens.xml3
-rw-r--r--packages/SystemUI/res/values/config.xml6
-rw-r--r--packages/SystemUI/res/values/dimens.xml10
-rw-r--r--packages/SystemUI/res/values/strings.xml30
-rw-r--r--packages/SystemUI/res/values/styles.xml22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java582
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java138
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsTileView.java51
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java55
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java37
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/QuickSettingsDateView.java45
59 files changed, 1445 insertions, 20 deletions
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 13800a6..3dfb638 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -16,6 +16,8 @@
<uses-permission android:name="android.permission.REMOTE_AUDIO_PLAYBACK" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
+ <uses-permission android:name="android.permission.READ_PROFILE" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
<!-- Networking and telephony -->
<uses-permission android:name="android.permission.BLUETOOTH" />
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_enabled.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_enabled.png
new file mode 100644
index 0000000..c47f70a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_normal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_normal.png
new file mode 100644
index 0000000..c87e162
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_enabled.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_enabled.png
new file mode 100644
index 0000000..8baece6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_normal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_normal.png
new file mode 100644
index 0000000..03f8b9c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_rssi_enabled.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_rssi_enabled.png
new file mode 100644
index 0000000..8348455
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_rssi_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_rssi_normal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_rssi_normal.png
new file mode 100644
index 0000000..0dfcfd2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_rssi_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_enabled.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_enabled.png
new file mode 100644
index 0000000..0276e42
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_normal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_normal.png
new file mode 100644
index 0000000..112279a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_enabled.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_enabled.png
new file mode 100644
index 0000000..06ed0a8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_normal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_normal.png
new file mode 100644
index 0000000..1c83e5b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_enabled.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_enabled.png
new file mode 100644
index 0000000..9cff183
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_normal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_normal.png
new file mode 100644
index 0000000..1e6c564
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_rssi_enabled.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_rssi_enabled.png
new file mode 100644
index 0000000..afe6e98
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_rssi_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_rssi_normal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_rssi_normal.png
new file mode 100644
index 0000000..3bec266
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_rssi_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_enabled.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_enabled.png
new file mode 100644
index 0000000..6c94754
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_normal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_normal.png
new file mode 100644
index 0000000..d6b47fc
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_enabled.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_enabled.png
new file mode 100644
index 0000000..7ee9290
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_normal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_normal.png
new file mode 100644
index 0000000..41d7498
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_enabled.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_enabled.png
new file mode 100644
index 0000000..8811e62
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_normal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_normal.png
new file mode 100644
index 0000000..0026596
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_rssi_enabled.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_rssi_enabled.png
new file mode 100644
index 0000000..4a2789d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_rssi_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_rssi_normal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_rssi_normal.png
new file mode 100644
index 0000000..ee4b21f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_rssi_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_enabled.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_enabled.png
new file mode 100644
index 0000000..114ee29
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_enabled.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_normal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_normal.png
new file mode 100644
index 0000000..0719b21
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_normal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/ic_qs_battery.xml b/packages/SystemUI/res/drawable/ic_qs_battery.xml
new file mode 100644
index 0000000..4e2a265
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_battery.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<clip
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/stat_sys_battery_100"
+ android:clipOrientation="vertical"
+ android:gravity="bottom" />
diff --git a/packages/SystemUI/res/layout/quick_settings.xml b/packages/SystemUI/res/layout/quick_settings.xml
index 8c6258a..d89f279 100644
--- a/packages/SystemUI/res/layout/quick_settings.xml
+++ b/packages/SystemUI/res/layout/quick_settings.xml
@@ -19,14 +19,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/settings_panel"
- android:background="#80000080"
+ android:background="@drawable/notification_panel_bg"
>
- <ImageView
+ <!-- TODO: Put into ScrollView -->
+ <com.android.systemui.statusbar.phone.QuickSettingsContainerView
+ android:id="@+id/quick_settings_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:scaleType="centerInside"
- android:src="@drawable/qs_coming_soon"
- android:padding="4dp"
+ android:paddingBottom="@dimen/quick_settings_container_padding"
+ android:paddingLeft="@dimen/quick_settings_container_padding"
+ android:paddingRight="@dimen/quick_settings_container_padding"
+ android:animateLayoutChanges="true"
+ android:columnCount="@integer/quick_settings_num_columns"
/>
<LinearLayout android:id="@+id/handle"
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/layout/quick_settings_tile.xml b/packages/SystemUI/res/layout/quick_settings_tile.xml
new file mode 100644
index 0000000..a571393
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<com.android.systemui.statusbar.phone.QuickSettingsTileView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/quick_settings_cell_height"
+ android:background="#1B1D1B" /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_airplane.xml b/packages/SystemUI/res/layout/quick_settings_tile_airplane.xml
new file mode 100644
index 0000000..3e3a9c2
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_airplane.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/airplane_mode_textview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:text="@string/quick_settings_airplane_mode_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_battery.xml b/packages/SystemUI/res/layout/quick_settings_tile_battery.xml
new file mode 100644
index 0000000..680a1bb
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_battery.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/battery_textview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:drawableTop="@drawable/ic_qs_battery"
+ android:text="@string/quick_settings_battery_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_bluetooth.xml b/packages/SystemUI/res/layout/quick_settings_tile_bluetooth.xml
new file mode 100644
index 0000000..4472484
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_bluetooth.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/bluetooth_textview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:text="@string/quick_settings_bluetooth_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml b/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml
new file mode 100644
index 0000000..216930d
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:drawableTop="@drawable/ic_sysbar_brightness"
+ android:text="@string/quick_settings_brightness_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_ime.xml b/packages/SystemUI/res/layout/quick_settings_tile_ime.xml
new file mode 100644
index 0000000..93db6db
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_ime.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:text="@string/quick_settings_ime_label"
+ android:singleLine="true"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_location.xml b/packages/SystemUI/res/layout/quick_settings_tile_location.xml
new file mode 100644
index 0000000..1a40642
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_location.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/location_textview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:drawableTop="@drawable/stat_sys_gps_acquiring"
+ android:text="@string/quick_settings_location_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_media.xml b/packages/SystemUI/res/layout/quick_settings_tile_media.xml
new file mode 100644
index 0000000..0810d02
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_media.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:text="@string/quick_settings_media_device_label"
+ android:singleLine="true"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_rssi.xml b/packages/SystemUI/res/layout/quick_settings_tile_rssi.xml
new file mode 100644
index 0000000..3e541cb
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_rssi.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/rssi_textview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:text="@string/quick_settings_rssi_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_settings.xml b/packages/SystemUI/res/layout/quick_settings_tile_settings.xml
new file mode 100644
index 0000000..1c2f827
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:drawableTop="@drawable/ic_notify_quicksettings"
+ android:text="@string/quick_settings_settings_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_time.xml b/packages/SystemUI/res/layout/quick_settings_tile_time.xml
new file mode 100644
index 0000000..ab0c52d
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_time.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:orientation="vertical">
+ <com.android.systemui.statusbar.policy.Clock
+ android:textAppearance="@style/TextAppearance.QuickSettings.Clock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:singleLine="true"
+ />
+ <com.android.systemui.statusbar.policy.QuickSettingsDateView
+ android:textAppearance="@style/TextAppearance.QuickSettings.Date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ />
+</LinearLayout> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_user.xml b/packages/SystemUI/res/layout/quick_settings_tile_user.xml
new file mode 100644
index 0000000..8edc978
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_user.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/user_textview"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal|bottom"
+ android:gravity="center"
+ android:text="@string/quick_settings_user_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ android:background="#33000000"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_wifi.xml b/packages/SystemUI/res/layout/quick_settings_tile_wifi.xml
new file mode 100644
index 0000000..42eb45a
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_wifi.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/wifi_textview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:text="@string/quick_settings_wifi_label"
+ android:textAppearance="@style/TextAppearance.QuickSettings.TileView"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_wifi_display.xml b/packages/SystemUI/res/layout/quick_settings_tile_wifi_display.xml
new file mode 100644
index 0000000..3a330d8
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_wifi_display.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:text="@string/quick_settings_wifi_display_label"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ /> \ No newline at end of file
diff --git a/packages/SystemUI/res/values-land/config.xml b/packages/SystemUI/res/values-land/config.xml
index bbae18d..6476d88 100644
--- a/packages/SystemUI/res/values-land/config.xml
+++ b/packages/SystemUI/res/values-land/config.xml
@@ -23,5 +23,11 @@
<!-- Whether we're using the tablet-optimized recents interface (we use this
value at runtime for some things) -->
<integer name="status_bar_recents_bg_gradient_degrees">90</integer>
+
+ <!-- The number of columns in the QuickSettings -->
+ <integer name="quick_settings_num_columns">6</integer>
+
+ <!-- The number of columns that the top level tiles span in the QuickSettings -->
+ <integer name="quick_settings_user_time_settings_tile_span">2</integer>
</resources>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index e7c8b1f..ab71371 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -37,4 +37,7 @@
<!-- Where to place the app icon over the thumbnail -->
<dimen name="status_bar_recents_app_icon_left_margin">8dp</dimen>
<dimen name="status_bar_recents_app_icon_top_margin">8dp</dimen>
+
+ <!-- The fixed height of each tile -->
+ <dimen name="quick_settings_cell_height">100dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 34e58a3..734e68c 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -81,5 +81,11 @@
<!-- Min alpha % that recent items will fade to while being dismissed -->
<integer name="config_recent_item_min_alpha">3</integer>
+
+ <!-- The number of columns in the QuickSettings -->
+ <integer name="quick_settings_num_columns">3</integer>
+
+ <!-- The number of columns that the top level tiles span in the QuickSettings -->
+ <integer name="quick_settings_user_time_settings_tile_span">1</integer>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 0d7cdb1..63ce2a9 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -174,4 +174,14 @@
<!-- The distance you can pull a notificaiton before it pops open -->
<dimen name="one_finger_pop_limit">32dp</dimen>
+
+ <!-- The amount of padding around the QuickSettings tiles -->
+ <dimen name="quick_settings_container_padding">12dp</dimen>
+
+ <!-- The fixed height of each tile -->
+ <dimen name="quick_settings_cell_height">110dp</dimen>
+
+ <!-- The padding between each tile within the QuickSettings layout -->
+ <dimen name="quick_settings_cell_gap">5dp</dimen>
+
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 43070c6..b83e71c 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -401,4 +401,34 @@
<!-- Name of the launcher shortcut icon that allows dreams to be started immediately [CHAR LIMIT=20] -->
<string name="start_dreams">Start dreams</string>
+ <!-- QuickSettings: Airplane mode [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_airplane_mode_label">Airplane mode</string>
+ <!-- QuickSettings: Battery [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_battery_label">Battery</string>
+ <!-- QuickSettings: Bluetooth [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_bluetooth_label">Bluetooth</string>
+ <!-- QuickSettings: Brightness [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_brightness_label">Brightness</string>
+ <!-- QuickSettings: IME [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_ime_label">IME</string>
+ <!-- QuickSettings: Location [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_location_label">Location in use</string>
+ <!-- QuickSettings: Media device [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_media_device_label">Media device</string>
+ <!-- QuickSettings: RSSI [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_rssi_label">RSSI</string>
+ <!-- QuickSettings: RSSI (No network) [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_rssi_emergency_only">Emergency Calls Only</string>
+ <!-- QuickSettings: Settings [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_settings_label">Settings</string>
+ <!-- QuickSettings: Time [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_time_label">Time</string>
+ <!-- QuickSettings: User [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_user_label">Me</string>
+ <!-- QuickSettings: Wifi [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_wifi_label">Wifi</string>
+ <!-- QuickSettings: Wifi (No network) [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_wifi_no_network">No Network</string>
+ <!-- QuickSettings: Wifi display [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_wifi_display_label">Wifi display</string>
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 2564003..34bd627 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -70,6 +70,28 @@
<style name="TextAppearance.StatusBar.Expanded.Network.EmergencyOnly">
</style>
+ <style name="TextAppearance" />
+ <style name="TextAppearance.QuickSettings" />
+
+ <style name="TextAppearance.QuickSettings.TileView">
+ <item name="android:padding">8dp</item>
+ <item name="android:textSize">13dp</item>
+ <item name="android:textStyle">normal</item>
+ <item name="android:textColor">#ff8d908c</item>
+ <item name="android:singleLine">true</item>
+ <item name="android:ellipsize">marquee</item>
+ <item name="android:fadingEdge">horizontal</item>
+ </style>
+
+ <style name="TextAppearance.QuickSettings.Clock" parent="@style/TextAppearance.QuickSettings.TileView">
+ <item name="android:textSize">24dp</item>
+ <item name="android:textColor">@android:color/holo_blue_light</item>
+ </style>
+
+ <style name="TextAppearance.QuickSettings.Date" parent="@style/TextAppearance.QuickSettings.TileView">
+ <item name="android:textSize">14dp</item>
+ </style>
+
<style name="Animation" />
<style name="Animation.ShirtPocketPanel">
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 2f551e1..bee63ee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -12,6 +12,10 @@ import android.view.View;
import android.widget.FrameLayout;
import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.BluetoothController;
+import com.android.systemui.statusbar.policy.LocationController;
+import com.android.systemui.statusbar.policy.NetworkController;
public class PanelView extends FrameLayout {
public static final boolean DEBUG = false;
@@ -356,6 +360,11 @@ public class PanelView extends FrameLayout {
mBar = panelBar;
}
+ public void setup(NetworkController network, BluetoothController bt, BatteryController batt,
+ LocationController location) {
+ // To be implemented by classes extending PanelView
+ }
+
public void collapse() {
// TODO: abort animation or ongoing touch
if (mExpandedHeight > 0) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 5646c55..a5d4a8e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -19,11 +19,10 @@ package com.android.systemui.statusbar.phone;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
+import android.animation.LayoutTransition;
import android.animation.ObjectAnimator;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
-import android.app.Dialog;
-import android.app.KeyguardManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.StatusBarManager;
@@ -31,7 +30,6 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
@@ -54,13 +52,11 @@ import android.util.Log;
import android.util.Slog;
import android.view.Display;
import android.view.Gravity;
-import android.view.IWindowManager;
-import android.view.KeyEvent;
+import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowManagerGlobal;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.view.animation.AccelerateInterpolator;
@@ -76,7 +72,6 @@ import android.widget.TextView;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.systemui.R;
-import com.android.systemui.recent.RecentTasksLoader;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.GestureRecorder;
@@ -86,6 +81,7 @@ import com.android.systemui.statusbar.RotationToggle;
import com.android.systemui.statusbar.SignalClusterView;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.DateView;
import com.android.systemui.statusbar.policy.IntruderAlertView;
import com.android.systemui.statusbar.policy.LocationController;
@@ -139,6 +135,7 @@ public class PhoneStatusBar extends BaseStatusBar {
PhoneStatusBarPolicy mIconPolicy;
// These are no longer handled by the policy, because we need custom strategies for them
+ BluetoothController mBluetoothController;
BatteryController mBatteryController;
LocationController mLocationController;
NetworkController mNetworkController;
@@ -317,9 +314,6 @@ public class PhoneStatusBar extends BaseStatusBar {
View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER
| (mNotificationPanelIsFullScreenWidth ? 0 : View.STATUS_BAR_DISABLE_SYSTEM_INFO));
- // quick settings (WIP)
- mSettingsPanel = (PanelView) mStatusBarWindow.findViewById(R.id.settings_panel);
-
if (!ActivityManager.isHighEndGfx()) {
mStatusBarWindow.setBackground(null);
mNotificationPanel.setBackground(new FastColorDrawable(context.getResources().getColor(
@@ -394,9 +388,11 @@ public class PhoneStatusBar extends BaseStatusBar {
mBatteryController = new BatteryController(mContext);
mBatteryController.addIconView((ImageView)mStatusBarView.findViewById(R.id.battery));
mNetworkController = new NetworkController(mContext);
+ mBluetoothController = new BluetoothController(mContext);
final SignalClusterView signalCluster =
(SignalClusterView)mStatusBarView.findViewById(R.id.signal_cluster);
+
mNetworkController.addSignalCluster(signalCluster);
signalCluster.setNetworkController(mNetworkController);
@@ -434,6 +430,12 @@ public class PhoneStatusBar extends BaseStatusBar {
});
}
+ // Quick Settings (WIP)
+ mSettingsPanel = (PanelView) mStatusBarWindow.findViewById(R.id.settings_panel);
+ mSettingsPanel.setBar(mStatusBarView);
+ mSettingsPanel.setup(mNetworkController, mBluetoothController, mBatteryController,
+ mLocationController);
+
// final ImageView wimaxRSSI =
// (ImageView)sb.findViewById(R.id.wimax_signal);
// if (wimaxRSSI != null) {
@@ -1844,6 +1846,10 @@ public class PhoneStatusBar extends BaseStatusBar {
if (mClearButton instanceof TextView) {
((TextView)mClearButton).setText(context.getText(R.string.status_bar_clear_all_button));
}
+
+ // Update the QuickSettings container
+ ((SettingsPanelView) mSettingsPanel).updateResources();
+
loadDimens();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
new file mode 100644
index 0000000..7a0e4d6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -0,0 +1,582 @@
+/*
+ * Copyright (C) 2012 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.systemui.statusbar.phone;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
+import android.content.Context;
+import android.content.CursorLoader;
+import android.content.Intent;
+import android.content.Loader;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.graphics.drawable.ClipDrawable;
+import android.net.Uri;
+import android.provider.ContactsContract;
+import android.provider.Settings;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.QuickSettingsModel.State;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.BluetoothController;
+import com.android.systemui.statusbar.policy.LocationController;
+import com.android.systemui.statusbar.policy.NetworkController;
+
+class QuickSettingsModel implements BluetoothStateChangeCallback,
+ NetworkController.NetworkSignalChangedCallback,
+ BatteryController.BatteryStateChangeCallback,
+ LocationController.LocationGpsStateChangeCallback {
+
+ /** Represents the state of a given attribute. */
+ static class State {
+ int iconId;
+ String label;
+ boolean enabled;
+ }
+ static class BatteryState extends State {
+ int batteryLevel;
+ boolean pluggedIn;
+ }
+
+ /** The callback to update a given tile. */
+ interface RefreshCallback {
+ public void refreshView(QuickSettingsTileView view, State state);
+ }
+
+ private Context mContext;
+
+ private QuickSettingsTileView mUserTile;
+ private RefreshCallback mUserCallback;
+ private State mUserState = new State();
+
+ private QuickSettingsTileView mAirplaneModeTile;
+ private RefreshCallback mAirplaneModeCallback;
+ private State mAirplaneModeState = new State();
+
+ private QuickSettingsTileView mWifiTile;
+ private RefreshCallback mWifiCallback;
+ private State mWifiState = new State();
+
+ private QuickSettingsTileView mRSSITile;
+ private RefreshCallback mRSSICallback;
+ private State mRSSIState = new State();
+
+ private QuickSettingsTileView mBluetoothTile;
+ private RefreshCallback mBluetoothCallback;
+ private State mBluetoothState = new State();
+
+ private QuickSettingsTileView mBatteryTile;
+ private RefreshCallback mBatteryCallback;
+ private BatteryState mBatteryState = new BatteryState();
+
+ private QuickSettingsTileView mLocationTile;
+ private RefreshCallback mLocationCallback;
+ private State mLocationState = new State();
+
+ public QuickSettingsModel(Context context) {
+ mContext = context;
+ }
+
+ // User
+ void addUserTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mUserTile = view;
+ mUserCallback = cb;
+ mUserCallback.refreshView(mUserTile, mUserState);
+ }
+ void setUserTileInfo(String name) {
+ mUserState.label = name;
+ mUserCallback.refreshView(mUserTile, mUserState);
+ }
+
+ // Airplane Mode
+ void addAirplaneModeTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mAirplaneModeTile = view;
+ mAirplaneModeTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mAirplaneModeState.enabled) {
+ setAirplaneModeState(false);
+ } else {
+ setAirplaneModeState(true);
+ }
+ }
+ });
+ mAirplaneModeCallback = cb;
+ mAirplaneModeCallback.refreshView(mAirplaneModeTile, mAirplaneModeState);
+ }
+ private void setAirplaneModeState(boolean enabled) {
+ // TODO: Sets the view to be "awaiting" if not already awaiting
+
+ // Change the system setting
+ Settings.System.putInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
+ enabled ? 1 : 0);
+
+ // TODO: Update the UI to reflect system setting
+ // mCheckBoxPref.setChecked(enabled);
+
+ // Post the intent
+ Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ intent.putExtra("state", enabled);
+ mContext.sendBroadcast(intent);
+ }
+ // NetworkSignalChanged callback
+ @Override
+ public void onAirplaneModeChanged(boolean enabled) {
+ // TODO: If view is in awaiting state, disable
+ Resources r = mContext.getResources();
+ mAirplaneModeState.enabled = enabled;
+ mAirplaneModeState.iconId = (enabled ?
+ R.drawable.ic_qs_airplane_enabled :
+ R.drawable.ic_qs_airplane_normal);
+ mAirplaneModeCallback.refreshView(mAirplaneModeTile, mAirplaneModeState);
+ }
+
+ // Wifi
+ void addWifiTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mWifiTile = view;
+ mWifiCallback = cb;
+ mWifiCallback.refreshView(mWifiTile, mWifiState);
+ }
+ // NetworkSignalChanged callback
+ @Override
+ public void onWifiSignalChanged(boolean enabled, String description) {
+ // TODO: If view is in awaiting state, disable
+ Resources r = mContext.getResources();
+ // TODO: Check if wifi is enabled
+ mWifiState.enabled = enabled;
+ mWifiState.iconId = (enabled ?
+ R.drawable.ic_qs_wifi_enabled :
+ R.drawable.ic_qs_wifi_normal);
+ mWifiState.label = (enabled ?
+ description :
+ r.getString(R.string.quick_settings_wifi_no_network));
+ mWifiCallback.refreshView(mWifiTile, mWifiState);
+ }
+
+ // RSSI
+ void addRSSITile(QuickSettingsTileView view, RefreshCallback cb) {
+ mRSSITile = view;
+ mRSSICallback = cb;
+ mRSSICallback.refreshView(mRSSITile, mRSSIState);
+ }
+ private void setRSSIState(boolean enabled) {
+ // TODO: Set RSSI enabled
+ // TODO: Sets the view to be "awaiting" if not already awaiting
+ }
+ // NetworkSignalChanged callback
+ @Override
+ public void onMobileDataSignalChanged(boolean enabled, String description) {
+ // TODO: If view is in awaiting state, disable
+ Resources r = mContext.getResources();
+ // TODO: Check if RSSI is enabled
+ mRSSIState.enabled = enabled;
+ mRSSIState.iconId = (enabled ?
+ R.drawable.ic_qs_rssi_enabled :
+ R.drawable.ic_qs_rssi_normal);
+ mRSSIState.label = (enabled ?
+ description :
+ r.getString(R.string.quick_settings_rssi_emergency_only));
+ mRSSICallback.refreshView(mRSSITile, mRSSIState);
+ }
+
+ // Bluetooth
+ void addBluetoothTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mBluetoothTile = view;
+ mBluetoothTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mBluetoothState.enabled) {
+ setBluetoothState(false);
+ } else {
+ setBluetoothState(true);
+ }
+ }
+ });
+ mBluetoothCallback = cb;
+
+ final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ onBluetoothStateChange(adapter.isEnabled());
+ }
+ private void setBluetoothState(boolean enabled) {
+ // TODO: Sets the view to be "awaiting" if not already awaiting
+ final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ if (adapter != null) {
+ if (enabled) {
+ adapter.enable();
+ } else {
+ adapter.disable();
+ }
+ }
+ }
+ // BluetoothController callback
+ @Override
+ public void onBluetoothStateChange(boolean on) {
+ // TODO: If view is in awaiting state, disable
+ Resources r = mContext.getResources();
+ mBluetoothState.enabled = on;
+ if (on) {
+ mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_enabled;
+ } else {
+ mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_normal;
+ }
+ mBluetoothCallback.refreshView(mBluetoothTile, mBluetoothState);
+ }
+
+ // Battery
+ void addBatteryTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mBatteryTile = view;
+ mBatteryCallback = cb;
+ mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
+ }
+ // BatteryController callback
+ @Override
+ public void onBatteryLevelChanged(int level, boolean pluggedIn) {
+ mBatteryState.batteryLevel = level;
+ mBatteryState.pluggedIn = pluggedIn;
+ mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
+ }
+
+ // Location
+ void addLocationTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mLocationTile = view;
+ mLocationCallback = cb;
+ mLocationCallback.refreshView(mLocationTile, mLocationState);
+ disableLocationTile();
+ }
+ private void enableLocationTile() {
+ mLocationTile.setVisibility(View.VISIBLE);
+ }
+ private void disableLocationTile() {
+ mLocationTile.setVisibility(View.GONE);
+ }
+ // LocationController callback
+ @Override
+ public void onLocationGpsStateChanged(boolean inUse, String description) {
+ if (inUse) {
+ mLocationState.enabled = inUse;
+ mLocationState.label = description;
+ mLocationCallback.refreshView(mLocationTile, mLocationState);
+ enableLocationTile();
+ } else {
+ disableLocationTile();
+ }
+ }
+
+}
+
+/**
+ *
+ */
+class QuickSettings {
+
+ private Context mContext;
+ private PanelBar mBar;
+ private QuickSettingsModel mModel;
+ private QuickSettingsContainerView mContainerView;
+
+ private CursorLoader mUserInfoLoader;
+
+ // The set of QuickSettingsTiles that have dynamic spans (and need to be updated on
+ // configuration change)
+ private final ArrayList<QuickSettingsTileView> mDynamicSpannedTiles =
+ new ArrayList<QuickSettingsTileView>();
+
+ public QuickSettings(Context context, QuickSettingsContainerView container) {
+ mContext = context;
+ mModel = new QuickSettingsModel(context);
+ mContainerView = container;
+
+ setupQuickSettings();
+ updateResources();
+ }
+
+ void setBar(PanelBar bar) {
+ mBar = bar;
+ }
+
+ void setup(NetworkController networkController, BluetoothController bluetoothController,
+ BatteryController batteryController, LocationController locationController) {
+ networkController.addNetworkSignalChangedCallback(mModel);
+ bluetoothController.addStateChangedCallback(mModel);
+ batteryController.addStateChangedCallback(mModel);
+ locationController.addStateChangedCallback(mModel);
+ }
+
+ private void queryForUserInformation() {
+ Uri userContactUri = Uri.withAppendedPath(
+ ContactsContract.Profile.CONTENT_URI,
+ ContactsContract.Contacts.Data.CONTENT_DIRECTORY);
+
+ String[] selectArgs = {
+ ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
+ ContactsContract.CommonDataKinds.Photo.PHOTO
+ };
+ String where = String.format("(%s = ? OR %s = ?) AND %s IS NULL",
+ ContactsContract.Contacts.Data.MIMETYPE,
+ ContactsContract.Contacts.Data.MIMETYPE,
+ ContactsContract.RawContacts.ACCOUNT_TYPE);
+ String[] whereArgs = {
+ ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE,
+ ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
+ };
+
+ mUserInfoLoader = new CursorLoader(mContext, userContactUri, selectArgs, where, whereArgs,
+ null);
+ mUserInfoLoader.registerListener(0,
+ new Loader.OnLoadCompleteListener<Cursor>() {
+ @Override
+ public void onLoadComplete(Loader<Cursor> loader,
+ Cursor cursor) {
+ if (cursor.moveToFirst()) {
+ String name = cursor.getString(0); // DISPLAY_NAME
+ mModel.setUserTileInfo(name);
+ /*
+ byte[] photoData = cursor.getBlob(0);
+ Bitmap b =
+ BitmapFactory.decodeByteArray(photoData, 0, photoData.length);
+ */
+ }
+ mUserInfoLoader.stopLoading();
+ }
+ });
+ mUserInfoLoader.startLoading();
+ }
+
+ private void setupQuickSettings() {
+ // Setup the tiles that we are going to be showing (including the temporary ones)
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+
+ addUserTiles(mContainerView, inflater);
+ addSystemTiles(mContainerView, inflater);
+ addTemporaryTiles(mContainerView, inflater);
+
+ queryForUserInformation();
+ }
+
+ private void addUserTiles(ViewGroup parent, LayoutInflater inflater) {
+ QuickSettingsTileView userTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ userTile.setContent(R.layout.quick_settings_tile_user, inflater);
+ mModel.addUserTile(userTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State state) {
+ TextView tv = (TextView) view.findViewById(R.id.user_textview);
+ tv.setText(state.label);
+ }
+ });
+ parent.addView(userTile);
+ mDynamicSpannedTiles.add(userTile);
+
+ // Time tile
+ QuickSettingsTileView timeTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ timeTile.setContent(R.layout.quick_settings_tile_time, inflater);
+ parent.addView(timeTile);
+ mDynamicSpannedTiles.add(timeTile);
+
+ // Settings tile
+ QuickSettingsTileView settingsTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ settingsTile.setContent(R.layout.quick_settings_tile_settings, inflater);
+ settingsTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ mBar.collapseAllPanels(true);
+ }
+ });
+ parent.addView(settingsTile);
+ mDynamicSpannedTiles.add(settingsTile);
+ }
+
+ private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {
+ // Wi-fi
+ QuickSettingsTileView wifiTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ wifiTile.setContent(R.layout.quick_settings_tile_wifi, inflater);
+ wifiTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ mBar.collapseAllPanels(true);
+ }
+ });
+ mModel.addWifiTile(wifiTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State state) {
+ TextView tv = (TextView) view.findViewById(R.id.wifi_textview);
+ tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0);
+ tv.setText(state.label);
+ }
+ });
+ parent.addView(wifiTile);
+
+ // RSSI
+ QuickSettingsTileView rssiTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ rssiTile.setContent(R.layout.quick_settings_tile_rssi, inflater);
+ rssiTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ mBar.collapseAllPanels(true);
+ }
+ });
+ mModel.addRSSITile(rssiTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State state) {
+ TextView tv = (TextView) view.findViewById(R.id.rssi_textview);
+ tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0);
+ tv.setText(state.label);
+ }
+ });
+ parent.addView(rssiTile);
+
+ // Battery
+ QuickSettingsTileView batteryTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ batteryTile.setContent(R.layout.quick_settings_tile_battery, inflater);
+ batteryTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ mBar.collapseAllPanels(true);
+ }
+ });
+ mModel.addBatteryTile(batteryTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State state) {
+ QuickSettingsModel.BatteryState batteryState =
+ (QuickSettingsModel.BatteryState) state;
+ TextView tv = (TextView) view.findViewById(R.id.battery_textview);
+ ClipDrawable drawable = (ClipDrawable) tv.getCompoundDrawables()[1];
+ drawable.setLevel((int) (10000 * (batteryState.batteryLevel / 100.0f)));
+ // TODO: use format string
+ tv.setText(batteryState.batteryLevel + "%");
+ }
+ });
+ parent.addView(batteryTile);
+
+ // Airplane Mode
+ QuickSettingsTileView airplaneTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ airplaneTile.setContent(R.layout.quick_settings_tile_airplane, inflater);
+ mModel.addAirplaneModeTile(airplaneTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State state) {
+ TextView tv = (TextView) view.findViewById(R.id.airplane_mode_textview);
+ tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0);
+ }
+ });
+ parent.addView(airplaneTile);
+
+ // Bluetooth
+ QuickSettingsTileView bluetoothTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ bluetoothTile.setContent(R.layout.quick_settings_tile_bluetooth, inflater);
+ mModel.addBluetoothTile(bluetoothTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State state) {
+ TextView tv = (TextView) view.findViewById(R.id.bluetooth_textview);
+ tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0);
+ }
+ });
+ parent.addView(bluetoothTile);
+
+ // Brightness
+ QuickSettingsTileView brightnessTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ brightnessTile.setContent(R.layout.quick_settings_tile_brightness, inflater);
+ brightnessTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(android.provider.Settings.ACTION_DISPLAY_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ mBar.collapseAllPanels(true);
+ }
+ });
+ parent.addView(brightnessTile);
+ }
+
+ private void addTemporaryTiles(final ViewGroup parent, final LayoutInflater inflater) {
+ // Location
+ QuickSettingsTileView locationTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ locationTile.setContent(R.layout.quick_settings_tile_location, inflater);
+ locationTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent =
+ new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ mBar.collapseAllPanels(true);
+ }
+ });
+ mModel.addLocationTile(locationTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State state) {
+ TextView tv = (TextView) view.findViewById(R.id.location_textview);
+ tv.setText(state.label);
+ }
+ });
+ parent.addView(locationTile);
+
+ /*
+ QuickSettingsTileView mediaTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ mediaTile.setContent(R.layout.quick_settings_tile_media, inflater);
+ parent.addView(mediaTile);
+ QuickSettingsTileView imeTile = (QuickSettingsTileView)
+ inflater.inflate(R.layout.quick_settings_tile, parent, false);
+ imeTile.setContent(R.layout.quick_settings_tile_ime, inflater);
+ imeTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ parent.removeViewAt(0);
+ }
+ });
+ parent.addView(imeTile);
+ */
+ }
+
+ void updateResources() {
+ Resources r = mContext.getResources();
+
+ // Update the User, Time, and Settings tiles spans, and reset everything else
+ int span = r.getInteger(R.integer.quick_settings_user_time_settings_tile_span);
+ for (QuickSettingsTileView v : mDynamicSpannedTiles) {
+ v.setColumnSpan(span);
+ }
+ mContainerView.requestLayout();
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java
new file mode 100644
index 0000000..105ceb1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsContainerView.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2012 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.systemui.statusbar.phone;
+
+import android.animation.LayoutTransition;
+import android.content.Context;
+import android.content.res.Resources;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import com.android.systemui.R;
+
+/**
+ *
+ */
+class QuickSettingsContainerView extends FrameLayout {
+
+ // The number of columns in the QuickSettings grid
+ private int mNumColumns;
+
+ // The gap between tiles in the QuickSettings grid
+ private float mCellGap;
+
+ public QuickSettingsContainerView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ updateResources();
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ // TODO: Setup the layout transitions
+ LayoutTransition transitions = getLayoutTransition();
+ }
+
+ void updateResources() {
+ Resources r = getContext().getResources();
+ mCellGap = r.getDimension(R.dimen.quick_settings_cell_gap);
+ mNumColumns = r.getInteger(R.integer.quick_settings_num_columns);
+ requestLayout();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ // Calculate the cell width dynamically
+ int width = MeasureSpec.getSize(widthMeasureSpec);
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+ int availableWidth = (int) (width - getPaddingLeft() - getPaddingRight() -
+ (mNumColumns - 1) * mCellGap);
+ float cellWidth = availableWidth / mNumColumns;
+
+ // Update each of the children's widths accordingly to the cell width
+ int N = getChildCount();
+ int cellHeight = 0;
+ int cursor = 0;
+ for (int i = 0; i < N; ++i) {
+ // Update the child's width
+ QuickSettingsTileView v = (QuickSettingsTileView) getChildAt(i);
+ ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
+ int colSpan = v.getColumnSpan();
+ lp.width = (int) ((colSpan * cellWidth) + (colSpan - 1) * mCellGap);
+
+ // Measure the child
+ v.setMinimumWidth(lp.width);
+ v.setMinimumHeight(lp.height);
+ int newWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.AT_MOST);
+ int newHeightSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.AT_MOST);
+ v.measure(newWidthSpec, newHeightSpec);
+
+ // Save the cell height
+ if (cellHeight <= 0) {
+ cellHeight = v.getMeasuredHeight();
+ }
+ cursor += colSpan;
+ }
+
+ // Set the measured dimensions. We always fill the tray width, but wrap to the height of
+ // all the tiles.
+ int numRows = (int) Math.ceil((float) cursor / mNumColumns);
+ int newHeight = (int) ((numRows * cellHeight) + ((numRows - 1) * mCellGap)) +
+ getPaddingTop() + getPaddingBottom();
+ setMeasuredDimension(width, newHeight);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ int N = getChildCount();
+ int x = getPaddingLeft();
+ int y = getPaddingTop();
+ int cursor = 0;
+ for (int i = 0; i < N; ++i) {
+ QuickSettingsTileView v = (QuickSettingsTileView) getChildAt(i);
+ ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) v.getLayoutParams();
+ if (v.getVisibility() != GONE) {
+ int col = cursor % mNumColumns;
+ int colSpan = v.getColumnSpan();
+ int row = (int) (cursor / mNumColumns);
+
+ // Push the item to the next row if it can't fit on this one
+ if ((col + colSpan) > mNumColumns) {
+ x = getPaddingLeft();
+ y += lp.height + mCellGap;
+ row++;
+ }
+
+ // Layout the container
+ v.layout(x, y, x + lp.width, y + lp.height);
+
+ // Offset the position by the cell gap or reset the position and cursor when we
+ // reach the end of the row
+ cursor += v.getColumnSpan();
+ if (cursor < (((row + 1) * mNumColumns))) {
+ x += lp.width + mCellGap;
+ } else {
+ x = getPaddingLeft();
+ y += lp.height + mCellGap;
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsTileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsTileView.java
new file mode 100644
index 0000000..8f5cde6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsTileView.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2012 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.systemui.statusbar.phone;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.FrameLayout;
+
+/**
+ *
+ */
+class QuickSettingsTileView extends FrameLayout {
+
+ private int mColSpan;
+ private int mRowSpan;
+ private int mCellWidth;
+
+ public QuickSettingsTileView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mColSpan = 1;
+ mRowSpan = 1;
+ }
+
+ void setColumnSpan(int span) {
+ mColSpan = span;
+ }
+
+ int getColumnSpan() {
+ return mColSpan;
+ }
+
+ void setContent(int layoutId, LayoutInflater inflater) {
+ inflater.inflate(layoutId, this);
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java
index fb1528f..f896d57 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java
@@ -16,15 +16,70 @@
package com.android.systemui.statusbar.phone;
+import android.animation.LayoutTransition;
import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.BaseStatusBar;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.BluetoothController;
+import com.android.systemui.statusbar.policy.LocationController;
+import com.android.systemui.statusbar.policy.NetworkController;
public class SettingsPanelView extends PanelView {
+
+ private QuickSettings mQS;
+ private QuickSettingsContainerView mQSContainer;
+
public SettingsPanelView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ mQSContainer = (QuickSettingsContainerView) findViewById(R.id.quick_settings_container);
+ mQS = new QuickSettings(getContext(), mQSContainer);
+ }
+
+ @Override
+ public void setBar(PanelBar panelBar) {
+ super.setBar(panelBar);
+
+ if (mQS != null) {
+ mQS.setBar(panelBar);
+ }
+ }
+
+ @Override
+ public void setup(NetworkController networkController, BluetoothController bluetoothController,
+ BatteryController batteryController, LocationController locationController) {
+ super.setup(networkController, bluetoothController, batteryController, locationController);
+
+ if (mQS != null) {
+ mQS.setup(networkController, bluetoothController, batteryController,
+ locationController);
+ }
+ }
+
+ void updateResources() {
+ if (mQS != null) {
+ mQS.updateResources();
+ }
+ if (mQSContainer != null) {
+ mQSContainer.updateResources();
+ }
+ requestLayout();
+ }
+
+ @Override
public void fling(float vel, boolean always) {
((PhoneStatusBarView) mBar).mBar.getGestureRecorder().tag(
"fling " + ((vel > 0) ? "open" : "closed"),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index ff418c4..7f9bcac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy;
import java.util.ArrayList;
+import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -36,6 +37,13 @@ public class BatteryController extends BroadcastReceiver {
private ArrayList<ImageView> mIconViews = new ArrayList<ImageView>();
private ArrayList<TextView> mLabelViews = new ArrayList<TextView>();
+ private ArrayList<BatteryStateChangeCallback> mChangeCallbacks =
+ new ArrayList<BatteryStateChangeCallback>();
+
+ public interface BatteryStateChangeCallback {
+ public void onBatteryLevelChanged(int level, boolean pluggedIn);
+ }
+
public BatteryController(Context context) {
mContext = context;
@@ -52,6 +60,10 @@ public class BatteryController extends BroadcastReceiver {
mLabelViews.add(v);
}
+ public void addStateChangedCallback(BatteryStateChangeCallback cb) {
+ mChangeCallbacks.add(cb);
+ }
+
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
@@ -73,6 +85,10 @@ public class BatteryController extends BroadcastReceiver {
v.setText(mContext.getString(R.string.status_bar_settings_battery_meter_format,
level));
}
+
+ for (BatteryStateChangeCallback cb : mChangeCallbacks) {
+ cb.onBatteryLevelChanged(level, plugged);
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
index 603808e..e517dde 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java
@@ -16,9 +16,8 @@
package com.android.systemui.statusbar.policy;
-import java.util.ArrayList;
-
import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -26,6 +25,8 @@ import android.content.IntentFilter;
import android.view.View;
import android.widget.ImageView;
+import java.util.ArrayList;
+
import com.android.systemui.R;
public class BluetoothController extends BroadcastReceiver {
@@ -38,6 +39,9 @@ public class BluetoothController extends BroadcastReceiver {
private int mContentDescriptionId = 0;
private boolean mEnabled = false;
+ private ArrayList<BluetoothStateChangeCallback> mChangeCallbacks =
+ new ArrayList<BluetoothStateChangeCallback>();
+
public BluetoothController(Context context) {
mContext = context;
@@ -58,6 +62,10 @@ public class BluetoothController extends BroadcastReceiver {
mIconViews.add(v);
}
+ public void addStateChangedCallback(BluetoothStateChangeCallback cb) {
+ mChangeCallbacks.add(cb);
+ }
+
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
@@ -98,5 +106,8 @@ public class BluetoothController extends BroadcastReceiver {
? null
: mContext.getString(mContentDescriptionId));
}
+ for (BluetoothStateChangeCallback cb : mChangeCallbacks) {
+ cb.onBluetoothStateChange(mEnabled);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
index c19550b..640dcca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
@@ -30,7 +30,7 @@ import com.android.systemui.R;
import java.util.Date;
-public final class DateView extends TextView {
+public class DateView extends TextView {
private static final String TAG = "DateView";
private boolean mAttachedToWindow;
@@ -86,7 +86,7 @@ public final class DateView extends TextView {
return 0;
}
- private final void updateClock() {
+ protected void updateClock() {
final Context context = getContext();
Date now = new Date();
CharSequence dow = DateFormat.format("EEEE", now);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java
index bec5d72..4bf03e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java
@@ -37,6 +37,7 @@ import android.app.INotificationManager;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
public class LocationController extends BroadcastReceiver {
private static final String TAG = "StatusBar.LocationController";
@@ -47,6 +48,13 @@ public class LocationController extends BroadcastReceiver {
private INotificationManager mNotificationService;
+ private ArrayList<LocationGpsStateChangeCallback> mChangeCallbacks =
+ new ArrayList<LocationGpsStateChangeCallback>();
+
+ public interface LocationGpsStateChangeCallback {
+ public void onLocationGpsStateChanged(boolean inUse, String description);
+ }
+
public LocationController(Context context) {
mContext = context;
@@ -60,6 +68,10 @@ public class LocationController extends BroadcastReceiver {
mNotificationService = nm.getService();
}
+ public void addStateChangedCallback(LocationGpsStateChangeCallback cb) {
+ mChangeCallbacks.add(cb);
+ }
+
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
@@ -89,12 +101,14 @@ public class LocationController extends BroadcastReceiver {
if (visible) {
Intent gpsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
gpsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0,
gpsIntent, 0, null, UserHandle.CURRENT);
+ String text = mContext.getText(textResId).toString();
Notification n = new Notification.Builder(mContext)
.setSmallIcon(iconId)
- .setContentTitle(mContext.getText(textResId))
+ .setContentTitle(text)
.setOngoing(true)
.setContentIntent(pendingIntent)
.getNotification();
@@ -117,6 +131,10 @@ public class LocationController extends BroadcastReceiver {
mNotificationService.cancelNotificationWithTag(
mContext.getPackageName(), null,
GPS_NOTIFICATION_ID, UserHandle.USER_CURRENT);
+
+ for (LocationGpsStateChangeCallback cb : mChangeCallbacks) {
+ cb.onLocationGpsStateChanged(false, null);
+ }
}
} catch (android.os.RemoteException ex) {
// well, it was worth a shot
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index d94c6b2..23f27e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -148,6 +148,8 @@ public class NetworkController extends BroadcastReceiver {
ArrayList<TextView> mWifiLabelViews = new ArrayList<TextView>();
ArrayList<TextView> mEmergencyLabelViews = new ArrayList<TextView>();
ArrayList<SignalCluster> mSignalClusters = new ArrayList<SignalCluster>();
+ ArrayList<NetworkSignalChangedCallback> mSignalsChangedCallbacks =
+ new ArrayList<NetworkSignalChangedCallback>();
int mLastPhoneSignalIconId = -1;
int mLastDataDirectionIconId = -1;
int mLastDataDirectionOverlayIconId = -1;
@@ -172,6 +174,12 @@ public class NetworkController extends BroadcastReceiver {
void setIsAirplaneMode(boolean is, int airplaneIcon);
}
+ public interface NetworkSignalChangedCallback {
+ void onWifiSignalChanged(boolean enabled, String description);
+ void onMobileDataSignalChanged(boolean enabled, String description);
+ void onAirplaneModeChanged(boolean enabled);
+ }
+
/**
* Construct this controller object and register for updates.
*/
@@ -299,6 +307,11 @@ public class NetworkController extends BroadcastReceiver {
refreshSignalCluster(cluster);
}
+ public void addNetworkSignalChangedCallback(NetworkSignalChangedCallback cb) {
+ mSignalsChangedCallbacks.add(cb);
+ notifySignalsChangedCallbacks(cb);
+ }
+
public void refreshSignalCluster(SignalCluster cluster) {
cluster.setWifiIndicators(
// only show wifi in the cluster if connected or if wifi-only
@@ -329,6 +342,27 @@ public class NetworkController extends BroadcastReceiver {
cluster.setIsAirplaneMode(mAirplaneMode, mAirplaneIconId);
}
+ void notifySignalsChangedCallbacks(NetworkSignalChangedCallback cb) {
+ // only show wifi in the cluster if connected or if wifi-only
+ boolean wifiEnabled = mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature);
+ String wifiDesc = wifiEnabled ?
+ mWifiSsid : null;
+ cb.onWifiSignalChanged(wifiEnabled, wifiDesc);
+
+ if (isEmergencyOnly()) {
+ cb.onMobileDataSignalChanged(false, null);
+ } else {
+ if (mIsWimaxEnabled && mWimaxConnected) {
+ // wimax is special
+ cb.onMobileDataSignalChanged(true, mNetworkName);
+ } else {
+ // normal mobile data
+ cb.onMobileDataSignalChanged(mHasMobileDataFeature, mNetworkName);
+ }
+ }
+ cb.onAirplaneModeChanged(mAirplaneMode);
+ }
+
public void setStackedMode(boolean stacked) {
mDataAndWifiStacked = true;
}
@@ -1124,6 +1158,9 @@ public class NetworkController extends BroadcastReceiver {
for (SignalCluster cluster : mSignalClusters) {
refreshSignalCluster(cluster);
}
+ for (NetworkSignalChangedCallback cb : mSignalsChangedCallbacks) {
+ notifySignalsChangedCallbacks(cb);
+ }
}
if (mLastAirplaneMode != mAirplaneMode) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/QuickSettingsDateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/QuickSettingsDateView.java
new file mode 100644
index 0000000..c52f94b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/QuickSettingsDateView.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2008 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.systemui.statusbar.policy;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.text.format.DateFormat;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewParent;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+import java.util.Date;
+
+public final class QuickSettingsDateView extends DateView {
+
+ public QuickSettingsDateView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ protected void updateClock() {
+ final Context context = getContext();
+ Date now = new Date();
+ CharSequence dow = DateFormat.format("MMM d, yyyy", now);
+ setText(dow);
+ }
+}