Merge "Remove TabletStatusBar from systemui package."
This commit is contained in:
committed by
Android (Google) Code Review
commit
1623b8cf7f
@@ -1,151 +0,0 @@
|
||||
<?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.
|
||||
-->
|
||||
|
||||
<!-- TabletStatusBarView extends FrameLayout -->
|
||||
<com.android.systemui.statusbar.tablet.TabletStatusBarView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
|
||||
android:background="@drawable/system_bar_background"
|
||||
>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/bar_contents_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@*android:dimen/system_bar_height"
|
||||
android:layout_gravity="bottom"
|
||||
>
|
||||
<RelativeLayout
|
||||
android:id="@+id/bar_contents"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipChildren="false"
|
||||
>
|
||||
|
||||
<!-- notification icons & panel access -->
|
||||
<include layout="@layout/system_bar_notification_area"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_marginTop="1dp"
|
||||
/>
|
||||
|
||||
<!-- navigation controls -->
|
||||
<LinearLayout
|
||||
android:id="@+id/navigationArea"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentStart="true"
|
||||
android:orientation="horizontal"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false"
|
||||
>
|
||||
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
|
||||
android:layout_width="@dimen/navigation_key_width"
|
||||
android:layout_height="match_parent"
|
||||
android:src="@drawable/ic_sysbar_back"
|
||||
systemui:keyCode="4"
|
||||
android:contentDescription="@string/accessibility_back"
|
||||
systemui:glowBackground="@drawable/ic_sysbar_highlight"
|
||||
/>
|
||||
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home"
|
||||
android:layout_width="@dimen/navigation_key_width"
|
||||
android:layout_height="match_parent"
|
||||
android:src="@drawable/ic_sysbar_home"
|
||||
systemui:keyCode="3"
|
||||
android:contentDescription="@string/accessibility_home"
|
||||
systemui:glowBackground="@drawable/ic_sysbar_highlight"
|
||||
/>
|
||||
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps"
|
||||
android:layout_width="@dimen/navigation_key_width"
|
||||
android:layout_height="match_parent"
|
||||
android:src="@drawable/ic_sysbar_recent"
|
||||
android:contentDescription="@string/accessibility_recent"
|
||||
systemui:glowBackground="@drawable/ic_sysbar_highlight"
|
||||
/>
|
||||
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu"
|
||||
android:layout_width="@dimen/navigation_menu_key_width"
|
||||
android:layout_height="match_parent"
|
||||
android:src="@drawable/ic_sysbar_menu"
|
||||
systemui:keyCode="82"
|
||||
android:visibility="invisible"
|
||||
android:contentDescription="@string/accessibility_menu"
|
||||
systemui:glowBackground="@drawable/ic_sysbar_highlight"
|
||||
/>
|
||||
</LinearLayout>
|
||||
|
||||
<!-- fake space bar zone -->
|
||||
<com.android.systemui.statusbar.policy.EventHole android:id="@+id/fake_space_bar"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="0dp"
|
||||
android:paddingStart="8dip"
|
||||
android:paddingEnd="8dip"
|
||||
android:layout_toEndOf="@+id/navigationArea"
|
||||
android:layout_toStartOf="@+id/notificationArea"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
</RelativeLayout>
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/bar_shadow_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@*android:dimen/system_bar_height"
|
||||
android:layout_gravity="bottom"
|
||||
>
|
||||
<!-- lights out shade -->
|
||||
<RelativeLayout
|
||||
android:id="@+id/bar_shadow"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#FF000000"
|
||||
android:visibility="gone"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/dot0"
|
||||
android:layout_width="80dip"
|
||||
android:layout_height="48dip"
|
||||
android:src="@drawable/ic_sysbar_lights_out_dot_small"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
/>
|
||||
<ImageView
|
||||
android:id="@+id/dot1"
|
||||
android:layout_width="80dip"
|
||||
android:layout_height="48dip"
|
||||
android:src="@drawable/ic_sysbar_lights_out_dot_large"
|
||||
android:layout_toEndOf="@+id/dot0"
|
||||
android:layout_alignParentBottom="true"
|
||||
/>
|
||||
<ImageView
|
||||
android:id="@+id/dot2"
|
||||
android:layout_width="80dip"
|
||||
android:layout_height="48dip"
|
||||
android:src="@drawable/ic_sysbar_lights_out_dot_small"
|
||||
android:layout_toEndOf="@+id/dot1"
|
||||
android:layout_alignParentBottom="true"
|
||||
/>
|
||||
<ImageView
|
||||
android:id="@+id/dot3"
|
||||
android:layout_width="80dip"
|
||||
android:layout_height="48dip"
|
||||
android:src="@drawable/ic_sysbar_lights_out_dot_small"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
/>
|
||||
</RelativeLayout>
|
||||
</FrameLayout>
|
||||
</com.android.systemui.statusbar.tablet.TabletStatusBarView>
|
||||
@@ -1,43 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
**
|
||||
** Copyright 2011, 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.tablet.CompatModePanel
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:paddingBottom="@dimen/panel_float"
|
||||
android:paddingEnd="20dp"
|
||||
>
|
||||
<RadioGroup android:id="@+id/compat_mode_radio_group"
|
||||
android:background="@*android:drawable/dialog_full_holo_dark"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:padding="10dp"
|
||||
>
|
||||
<RadioButton android:id="@+id/compat_mode_off_radio"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/compat_mode_off" />
|
||||
<RadioButton android:id="@+id/compat_mode_on_radio"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/compat_mode_on" />
|
||||
</RadioGroup>
|
||||
</com.android.systemui.statusbar.tablet.CompatModePanel>
|
||||
@@ -1,105 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/*
|
||||
** Copyright 2011, 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:minHeight="?android:attr/listPreferredItemHeight"
|
||||
android:background="@drawable/status_bar_item_background"
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="6dip"
|
||||
android:paddingStart="6dip"
|
||||
android:paddingTop="5dip"
|
||||
android:paddingBottom="5dip"
|
||||
android:gravity="center_vertical">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<LinearLayout
|
||||
android:id="@+id/item_subtype"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal"
|
||||
android:background="?android:attr/selectableItemBackground">
|
||||
<RadioButton
|
||||
android:id="@+id/item_radio"
|
||||
android:layout_width="30dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:focusable="false"
|
||||
android:clickable="false" />
|
||||
<ImageView
|
||||
android:id="@+id/item_icon"
|
||||
android:layout_width="@android:dimen/app_icon_size"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleType="fitCenter"
|
||||
android:contentDescription="@null" />
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:layout_width="0px"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content">
|
||||
<TextView
|
||||
android:id="@+id/item_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
android:layout_marginBottom="2dip" />
|
||||
<TextView
|
||||
android:id="@+id/item_subtitle"
|
||||
android:layout_marginTop="-4dip"
|
||||
android:layout_gravity="center_vertical|start"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
<View
|
||||
android:id="@+id/item_vertical_separator"
|
||||
android:layout_width="2dip"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginBottom="5dip"
|
||||
android:background="@android:drawable/divider_horizontal_dark" />
|
||||
<ImageView
|
||||
android:id="@+id/item_settings_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="5dip"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingEnd="10dip"
|
||||
android:paddingStart="10dip"
|
||||
android:src="@drawable/ic_sysbar_quicksettings"
|
||||
android:visibility="visible"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:contentDescription="@string/accessibility_settings_button" />
|
||||
</LinearLayout>
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dip"
|
||||
android:background="@android:drawable/divider_horizontal_dark" />
|
||||
</LinearLayout>
|
||||
@@ -1,117 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
**
|
||||
** Copyright 2011, 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.tablet.InputMethodsPanel
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:paddingBottom="7dip"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dip"
|
||||
android:layout_weight="1" />
|
||||
<FrameLayout
|
||||
android:id="@+id/glow"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/recents_blue_glow">
|
||||
<LinearLayout
|
||||
android:layout_width="450dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="20dip"
|
||||
android:orientation="vertical"
|
||||
android:background="@drawable/notify_panel_clock_bg">
|
||||
<!-- Hard keyboard switch -->
|
||||
<LinearLayout
|
||||
android:id="@+id/hard_keyboard_section"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:orientation="vertical">
|
||||
<LinearLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
android:id="@+id/use_physical_keyboard_label"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="6dip"
|
||||
android:paddingStart="30dip"
|
||||
android:paddingTop="5dip"
|
||||
android:paddingBottom="5dip"
|
||||
android:gravity="center_vertical"
|
||||
android:singleLine="true"
|
||||
android:text="@string/status_bar_use_physical_keyboard"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:ellipsize="marquee" />
|
||||
<Switch
|
||||
android:id="@+id/hard_keyboard_switch"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="16dip" />
|
||||
</LinearLayout>
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dip"
|
||||
android:background="@android:drawable/divider_horizontal_dark" />
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Input method list -->
|
||||
<ScrollView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0dip"
|
||||
android:overScrollMode="ifContentScrolls"
|
||||
android:layout_marginTop="3dip"
|
||||
android:layout_weight="1"
|
||||
android:scrollbarAlwaysDrawVerticalTrack="true"
|
||||
android:scrollbarDefaultDelayBeforeFade="75000">
|
||||
<LinearLayout
|
||||
android:id="@+id/input_method_menu_list"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical" />
|
||||
</ScrollView>
|
||||
|
||||
<!-- Configure input methods -->
|
||||
<TextView
|
||||
android:id="@+id/ime_settings_shortcut"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="6dip"
|
||||
android:paddingStart="30dip"
|
||||
android:paddingTop="5dip"
|
||||
android:paddingBottom="5dip"
|
||||
android:gravity="center_vertical"
|
||||
android:singleLine="true"
|
||||
android:text="@string/status_bar_input_method_settings_configure_input_methods"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:ellipsize="marquee" />
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
</com.android.systemui.statusbar.tablet.InputMethodsPanel>
|
||||
@@ -1,36 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/* apps/common/assets/default/default/skins/StatusBar.xml
|
||||
**
|
||||
** Copyright 2011, 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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="20dp"
|
||||
android:textColor="@android:color/holo_blue_light"
|
||||
android:text="@string/status_bar_no_recent_apps"
|
||||
android:gravity="start"
|
||||
android:layout_gravity="bottom|start"
|
||||
/>
|
||||
</FrameLayout>
|
||||
@@ -1,133 +0,0 @@
|
||||
<?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.
|
||||
-->
|
||||
|
||||
<!-- notification icons & panel access -->
|
||||
<com.android.systemui.statusbar.tablet.NotificationArea
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
|
||||
android:id="@+id/notificationArea"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:orientation="horizontal"
|
||||
android:background="?android:attr/listChoiceBackgroundIndicator"
|
||||
android:clickable="true"
|
||||
>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/feedbackIconArea"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
>
|
||||
|
||||
<com.android.systemui.statusbar.tablet.InputMethodButton
|
||||
android:id="@+id/imeSwitchButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="8dip"
|
||||
android:src="@drawable/ic_sysbar_ime_default"
|
||||
android:visibility="gone"
|
||||
android:contentDescription="@string/accessibility_ime_switch_button"
|
||||
/>
|
||||
|
||||
<com.android.systemui.statusbar.policy.CompatModeButton
|
||||
android:id="@+id/compatModeButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="8dip"
|
||||
android:src="@drawable/ic_sysbar_zoom"
|
||||
android:visibility="gone"
|
||||
android:contentDescription="@string/accessibility_compatibility_zoom_button"
|
||||
/>
|
||||
|
||||
<com.android.systemui.statusbar.tablet.NotificationIconArea
|
||||
android:id="@+id/notificationIcons"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
>
|
||||
<view
|
||||
class="com.android.systemui.statusbar.tablet.NotificationIconArea$IconLayout"
|
||||
android:id="@+id/icons"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginStart="8dp"
|
||||
android:alpha="0.4"
|
||||
/>
|
||||
</com.android.systemui.statusbar.tablet.NotificationIconArea>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/notificationTrigger"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
>
|
||||
<com.android.systemui.statusbar.policy.Clock
|
||||
android:id="@+id/clock"
|
||||
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:singleLine="true"
|
||||
android:paddingStart="6dip"
|
||||
android:layout_marginEnd="8dip"
|
||||
android:gravity="center_vertical|start"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/network_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginEnd="6dip"
|
||||
android:layout_marginStart="6dip"
|
||||
android:gravity="center"
|
||||
android:singleLine="true"
|
||||
android:visibility="gone"
|
||||
android:textSize="16sp"
|
||||
android:textColor="#606060"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/signal_battery_cluster"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center"
|
||||
>
|
||||
<include layout="@layout/signal_cluster_view"
|
||||
android:id="@+id/signal_cluster"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<ImageView
|
||||
android:id="@+id/bluetooth"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:paddingStart="4dip"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
<ImageView
|
||||
android:id="@+id/battery"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:paddingStart="4dip"
|
||||
/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</com.android.systemui.statusbar.tablet.NotificationArea>
|
||||
@@ -1,75 +0,0 @@
|
||||
<!--
|
||||
Copyright (C) 2006 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.
|
||||
-->
|
||||
|
||||
<!-- android:background="@drawable/system_bar_closed_default_background" -->
|
||||
<com.android.systemui.statusbar.tablet.NotificationPanel
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
|
||||
android:id="@+id/content_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:gravity="end"
|
||||
>
|
||||
|
||||
<!-- lift the panel up off the status bar while leaving a touchable are -->
|
||||
<Space
|
||||
android:id="@+id/system_bar_notification_panel_bottom_space"
|
||||
android:layout_height="56dp"
|
||||
android:layout_width="478dp"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/content_frame"
|
||||
android:background="@drawable/notification_panel_bg"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="478dp"
|
||||
android:orientation="vertical"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_above="@id/system_bar_notification_panel_bottom_space"
|
||||
android:paddingBottom="8dp"
|
||||
>
|
||||
|
||||
<include layout="@layout/system_bar_notification_panel_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="130dp"
|
||||
android:layout_above="@id/content_frame"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_weight="0"
|
||||
/>
|
||||
|
||||
<ScrollView
|
||||
|
||||
android:id="@+id/notification_scroller"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:overScrollMode="ifContentScrolls"
|
||||
android:layout_weight="1"
|
||||
>
|
||||
<com.android.systemui.statusbar.policy.NotificationRowLayout
|
||||
android:id="@+id/content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:descendantFocusability="afterDescendants"
|
||||
systemui:rowHeight="@dimen/notification_row_min_height"
|
||||
/>
|
||||
</ScrollView>
|
||||
</LinearLayout>
|
||||
</com.android.systemui.statusbar.tablet.NotificationPanel>
|
||||
@@ -1,231 +0,0 @@
|
||||
<!--
|
||||
Copyright (C) 2006 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.tablet.NotificationPanelTitle
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
|
||||
android:id="@+id/title_area"
|
||||
android:background="@drawable/system_bar_notification_header_bg"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="true"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="26dp"
|
||||
android:paddingTop="14dp"
|
||||
android:paddingEnd="26dp"
|
||||
>
|
||||
|
||||
<TableLayout
|
||||
android:id="@+id/icons"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:shrinkColumns="2,4"
|
||||
android:stretchColumns="7"
|
||||
>
|
||||
<TableRow>
|
||||
|
||||
<!-- to keep the column ids stable we wrap disappearing views in
|
||||
frames -->
|
||||
<FrameLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/bluetooth"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:paddingEnd="16dp"
|
||||
android:visibility="gone"
|
||||
android:contentDescription="@null"
|
||||
android:layout_gravity="center_vertical"
|
||||
/>
|
||||
</FrameLayout>
|
||||
|
||||
<!-- mobile data -->
|
||||
<FrameLayout
|
||||
android:id="@+id/mobile_icon"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingEnd="6dp"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/mobile_signal"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:contentDescription="@null"
|
||||
/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/mobile_type"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:contentDescription="@null"
|
||||
/>
|
||||
|
||||
</FrameLayout>
|
||||
<TextView
|
||||
android:id="@+id/mobile_text"
|
||||
style="@style/SystemBarNotificationText"
|
||||
android:layout_gravity="start|center_vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingEnd="12dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:text="@string/status_bar_settings_settings_button"
|
||||
/>
|
||||
|
||||
<!-- wifi -->
|
||||
<FrameLayout
|
||||
android:id="@+id/wifi_icon"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingEnd="6dp"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/wifi_signal"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:contentDescription="@null"
|
||||
/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/wifi_direction"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:contentDescription="@null"
|
||||
/>
|
||||
|
||||
</FrameLayout>
|
||||
<TextView
|
||||
android:id="@+id/wifi_text"
|
||||
style="@style/SystemBarNotificationText"
|
||||
android:layout_gravity="start|center_vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingEnd="12dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:text="@string/status_bar_settings_settings_button"
|
||||
/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/battery"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:scaleType="centerInside"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_alignBaseline="@id/wifi_signal"
|
||||
android:paddingEnd="6dp"
|
||||
android:contentDescription="@null"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/battery_text"
|
||||
style="@style/SystemBarNotificationText"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="start|center_vertical"
|
||||
android:paddingEnd="2dp"
|
||||
android:singleLine="true"
|
||||
android:text="@string/status_bar_settings_settings_button"
|
||||
/>
|
||||
|
||||
<!-- this will stretch to eat up available space -->
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/settings_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_sysbar_quicksettings"
|
||||
android:contentDescription="@string/accessibility_desc_quick_settings"
|
||||
/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/notification_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_notification_open"
|
||||
android:visibility="invisible"
|
||||
android:contentDescription="@string/accessibility_notifications_button"
|
||||
/>
|
||||
</FrameLayout>
|
||||
|
||||
</TableRow>
|
||||
</TableLayout>
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="@dimen/notification_panel_header_padding_top"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:baselineAligned="false"
|
||||
>
|
||||
|
||||
<com.android.systemui.statusbar.policy.Clock
|
||||
android:id="@+id/clock"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/TextAppearance.SystemBar.Expanded.Clock"
|
||||
/>
|
||||
|
||||
<com.android.systemui.statusbar.policy.DateView
|
||||
android:id="@+id/date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:textAppearance="@style/TextAppearance.SystemBar.Expanded.Date"
|
||||
/>
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_weight="1"
|
||||
/>
|
||||
|
||||
<ImageView android:id="@+id/clear_all_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleType="center"
|
||||
android:src="@drawable/ic_notify_clear"
|
||||
android:contentDescription="@string/accessibility_clear_all"
|
||||
/>
|
||||
</LinearLayout>
|
||||
</com.android.systemui.statusbar.tablet.NotificationPanelTitle>
|
||||
@@ -1,43 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/* apps/common/assets/default/default/skins/StatusBar.xml
|
||||
**
|
||||
** Copyright 2006, 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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<!-- android:background="@drawable/system_bar_closed_default_background" -->
|
||||
<com.android.systemui.statusbar.tablet.NotificationPeekPanel
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:background="@*android:drawable/dialog_full_holo_dark"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_horizontal|bottom"
|
||||
android:animationCache="false"
|
||||
android:orientation="vertical"
|
||||
android:background="@drawable/system_bar_background"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:descendantFocusability="afterDescendants"
|
||||
>
|
||||
</FrameLayout>
|
||||
</com.android.systemui.statusbar.tablet.NotificationPeekPanel>
|
||||
@@ -1,61 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/* apps/common/assets/default/default/skins/StatusBar.xml
|
||||
**
|
||||
** Copyright 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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:background="@*android:drawable/dialog_full_holo_dark"
|
||||
>
|
||||
<TextView
|
||||
android:id="@+id/description"
|
||||
android:textAppearance="@android:style/TextAppearance.Small"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:textStyle="bold"
|
||||
android:maxLines="1"
|
||||
android:layout_alignParentBottom="true"
|
||||
/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/preview"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_above="@+id/description"
|
||||
android:descendantFocusability="blocksDescendants"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerInside"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@+id/alt"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:textAppearance="@android:style/TextAppearance.Large"
|
||||
android:gravity="center"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
</FrameLayout>
|
||||
</RelativeLayout>
|
||||
@@ -1,100 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/* apps/common/assets/default/default/skins/StatusBar.xml
|
||||
**
|
||||
** Copyright 2006, 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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<RelativeLayout android:id="@+id/recent_item"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content">
|
||||
|
||||
<TextView android:id="@+id/app_label"
|
||||
android:layout_width="@dimen/status_bar_recents_app_label_width"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="@dimen/status_bar_recents_app_label_text_size"
|
||||
android:fadingEdge="horizontal"
|
||||
android:fadingEdgeLength="@dimen/status_bar_recents_text_fading_edge_length"
|
||||
android:scrollHorizontally="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_marginStart="@dimen/status_bar_recents_app_label_left_margin"
|
||||
android:layout_marginTop="32dip"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
android:textColor="@color/status_bar_recents_app_label_color"
|
||||
android:importantForAccessibility="no"
|
||||
/>
|
||||
|
||||
<FrameLayout android:id="@+id/app_thumbnail"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toEndOf="@id/app_label"
|
||||
android:layout_marginStart="@dimen/status_bar_recents_thumbnail_left_margin"
|
||||
android:scaleType="center"
|
||||
android:background="@drawable/recents_thumbnail_bg"
|
||||
android:foreground="@drawable/recents_thumbnail_fg"
|
||||
android:visibility="invisible">
|
||||
<ImageView android:id="@+id/app_thumbnail_image"
|
||||
android:layout_width="@dimen/status_bar_recents_thumbnail_width"
|
||||
android:layout_height="@dimen/status_bar_recents_thumbnail_height"
|
||||
/>
|
||||
</FrameLayout>
|
||||
|
||||
|
||||
<ImageView android:id="@+id/app_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toEndOf="@id/app_label"
|
||||
android:layout_marginStart="@dimen/status_bar_recents_app_icon_left_margin"
|
||||
android:layout_marginTop="@dimen/status_bar_recents_app_icon_top_margin"
|
||||
android:maxWidth="@dimen/status_bar_recents_app_icon_max_width"
|
||||
android:maxHeight="@dimen/status_bar_recents_app_icon_max_height"
|
||||
android:scaleType="centerInside"
|
||||
android:adjustViewBounds="true"
|
||||
android:visibility="invisible"
|
||||
/>
|
||||
|
||||
|
||||
<View android:id="@+id/recents_callout_line"
|
||||
android:layout_width="@dimen/status_bar_recents_app_label_width"
|
||||
android:layout_height="1dip"
|
||||
android:layout_below="@id/app_label"
|
||||
android:layout_marginTop="3dip"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_marginStart="@dimen/status_bar_recents_app_label_left_margin"
|
||||
android:layout_toStartOf="@id/app_thumbnail"
|
||||
android:layout_marginEnd="3dip"
|
||||
android:background="@drawable/recents_callout_line"
|
||||
/>
|
||||
|
||||
<TextView android:id="@+id/app_description"
|
||||
android:layout_width="@dimen/status_bar_recents_app_label_width"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="@dimen/status_bar_recents_app_description_text_size"
|
||||
android:fadingEdge="horizontal"
|
||||
android:fadingEdgeLength="@dimen/status_bar_recents_text_fading_edge_length"
|
||||
android:scrollHorizontally="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_below="@id/recents_callout_line"
|
||||
android:layout_marginStart="@dimen/status_bar_recents_app_label_left_margin"
|
||||
android:layout_marginTop="3dip"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
/>
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -1,84 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/* apps/common/assets/default/default/skins/StatusBar.xml
|
||||
**
|
||||
** Copyright 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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<com.android.systemui.recent.RecentsPanelView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
|
||||
android:id="@+id/recents_root"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:clipToPadding="false"
|
||||
android:clipChildren="false"
|
||||
systemui:recentItemLayout="@layout/system_bar_recent_item"
|
||||
>
|
||||
<FrameLayout
|
||||
android:id="@+id/recents_bg_protect"
|
||||
android:background="@drawable/recents_bg_protect_tile"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_marginBottom="@*android:dimen/system_bar_height"
|
||||
android:clipToPadding="false"
|
||||
android:clipChildren="false">
|
||||
|
||||
<com.android.systemui.recent.RecentsVerticalScrollView android:id="@+id/recents_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/status_bar_recents_right_glow_margin"
|
||||
android:divider="@null"
|
||||
android:stackFromBottom="true"
|
||||
android:fadingEdge="vertical"
|
||||
android:scrollbars="none"
|
||||
android:fadingEdgeLength="20dip"
|
||||
android:layout_gravity="bottom|start"
|
||||
android:clipToPadding="false"
|
||||
android:clipChildren="false"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<LinearLayout android:id="@+id/recents_linear_layout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:clipToPadding="false"
|
||||
android:clipChildren="false">
|
||||
</LinearLayout>
|
||||
|
||||
</com.android.systemui.recent.RecentsVerticalScrollView>
|
||||
|
||||
<include layout="@layout/system_bar_no_recent_apps"
|
||||
android:id="@+id/recents_no_apps"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="58dip"
|
||||
android:layout_marginBottom="36dip"
|
||||
android:visibility="invisible" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<com.android.systemui.recent.StatusBarTouchProxy
|
||||
android:id="@+id/status_bar_touch_proxy"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@*android:dimen/system_bar_height"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentStart="true"
|
||||
/>
|
||||
|
||||
|
||||
</com.android.systemui.recent.RecentsPanelView>
|
||||
@@ -1,25 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/* apps/common/assets/default/default/skins/StatusBar.xml
|
||||
**
|
||||
** Copyright 2011, 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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/listview_footer_padding"
|
||||
android:layout_height="24dip"
|
||||
android:layout_width="match_parent">
|
||||
</FrameLayout>
|
||||
@@ -1,157 +0,0 @@
|
||||
<?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.
|
||||
-->
|
||||
|
||||
<com.android.systemui.statusbar.tablet.SettingsView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
|
||||
<!-- Airplane mode -->
|
||||
<LinearLayout
|
||||
android:id="@+id/airplane"
|
||||
style="@style/SystemBarPanelSettingsRow"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/airplane_icon"
|
||||
style="@style/SystemBarPanelSettingsIcon"
|
||||
android:src="@drawable/ic_sysbar_airplane_on"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@+id/airplane_label"
|
||||
style="@style/SystemBarPanelSettingsContents"
|
||||
android:text="@string/status_bar_settings_airplane"
|
||||
/>
|
||||
<Switch
|
||||
android:id="@+id/airplane_checkbox"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="5dp"
|
||||
/>
|
||||
</LinearLayout>
|
||||
<View style="@style/SystemBarPanelSettingsPanelSeparator" />
|
||||
|
||||
<!-- Network -->
|
||||
<LinearLayout
|
||||
android:id="@+id/network"
|
||||
style="@style/SystemBarPanelSettingsRow"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/network_icon"
|
||||
style="@style/SystemBarPanelSettingsIcon"
|
||||
android:src="@drawable/ic_sysbar_wifi_on"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@+id/network_label"
|
||||
style="@style/SystemBarPanelSettingsContents"
|
||||
android:text="@string/status_bar_settings_wifi_button"
|
||||
/>
|
||||
</LinearLayout>
|
||||
<View style="@style/SystemBarPanelSettingsPanelSeparator" />
|
||||
|
||||
<!-- Rotation lock -->
|
||||
<LinearLayout
|
||||
android:id="@+id/rotate"
|
||||
style="@style/SystemBarPanelSettingsRow"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/rotate_icon"
|
||||
style="@style/SystemBarPanelSettingsIcon"
|
||||
android:src="@drawable/ic_sysbar_rotate_on"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@+id/rotate_label"
|
||||
style="@style/SystemBarPanelSettingsContents"
|
||||
android:text="@string/status_bar_settings_auto_rotation"
|
||||
/>
|
||||
<Switch
|
||||
android:id="@+id/rotate_checkbox"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="5dp"
|
||||
/>
|
||||
</LinearLayout>
|
||||
<View
|
||||
android:id="@+id/rotate_separator"
|
||||
style="@style/SystemBarPanelSettingsPanelSeparator" />
|
||||
|
||||
<!-- Brightness -->
|
||||
<LinearLayout style="@style/SystemBarPanelSettingsRow" >
|
||||
<ImageView
|
||||
android:id="@+id/brightness_icon"
|
||||
style="@style/SystemBarPanelSettingsIcon"
|
||||
android:src="@drawable/ic_sysbar_brightness"
|
||||
/>
|
||||
<com.android.systemui.settings.ToggleSlider
|
||||
android:id="@+id/brightness"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginEnd="2dp"
|
||||
systemui:text="@string/status_bar_settings_auto_brightness_label"
|
||||
/>
|
||||
</LinearLayout>
|
||||
<View style="@style/SystemBarPanelSettingsPanelSeparator" />
|
||||
|
||||
<!-- Notifications / Do not disturb -->
|
||||
<LinearLayout
|
||||
android:id="@+id/do_not_disturb"
|
||||
style="@style/SystemBarPanelSettingsRow"
|
||||
>
|
||||
<ImageView
|
||||
android:id="@+id/do_not_disturb_icon"
|
||||
style="@style/SystemBarPanelSettingsIcon"
|
||||
android:src="@drawable/ic_notification_open"
|
||||
/>
|
||||
<TextView
|
||||
style="@style/SystemBarPanelSettingsContents"
|
||||
android:text="@string/status_bar_settings_notifications"
|
||||
/>
|
||||
<Switch
|
||||
android:id="@+id/do_not_disturb_checkbox"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginEnd="5dp"
|
||||
/>
|
||||
</LinearLayout>
|
||||
<View style="@style/SystemBarPanelSettingsPanelSeparator" />
|
||||
|
||||
<!-- Link to settings -->
|
||||
<LinearLayout
|
||||
android:id="@+id/settings"
|
||||
style="@style/SystemBarPanelSettingsRow"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/settings"
|
||||
style="@style/SystemBarPanelSettingsIcon"
|
||||
android:src="@drawable/ic_sysbar_quicksettings"
|
||||
/>
|
||||
<TextView
|
||||
style="@style/SystemBarPanelSettingsContents"
|
||||
android:text="@string/status_bar_settings_settings_button"
|
||||
/>
|
||||
</LinearLayout>
|
||||
<View style="@style/SystemBarPanelSettingsPanelSeparator" />
|
||||
|
||||
</com.android.systemui.statusbar.tablet.SettingsView>
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
<?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.
|
||||
-->
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="bottom"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/large_icon"
|
||||
android:layout_width="@android:dimen/notification_large_icon_width"
|
||||
android:layout_height="@android:dimen/notification_large_icon_height"
|
||||
android:scaleType="center"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@*android:dimen/system_bar_height"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/system_bar_ticker_background"
|
||||
>
|
||||
|
||||
<ImageView android:id="@+id/left_icon"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="center"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
|
||||
<TextView android:id="@+id/text"
|
||||
android:textAppearance="@*android:style/TextAppearance.StatusBar.Ticker"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginStart="12dp"
|
||||
android:gravity="center_vertical"
|
||||
android:maxLines="2"
|
||||
/>
|
||||
|
||||
<ImageView android:id="@+id/right_icon"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="center"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -1,52 +0,0 @@
|
||||
<?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.
|
||||
-->
|
||||
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
>
|
||||
|
||||
<View
|
||||
android:layout_height="@*android:dimen/system_bar_height"
|
||||
android:layout_width="match_parent"
|
||||
android:background="@drawable/system_bar_ticker_background"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:clickable="false"
|
||||
/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/large_icon"
|
||||
android:layout_width="@android:dimen/notification_large_icon_height"
|
||||
android:layout_height="@android:dimen/notification_large_icon_width"
|
||||
android:scaleType="center"
|
||||
android:visibility="gone"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/ticker_expanded"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="@*android:dimen/system_bar_height"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_toEndOf="@id/large_icon"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignWithParentIfMissing="true"
|
||||
/>
|
||||
</RelativeLayout>
|
||||
@@ -16,22 +16,10 @@
|
||||
*/
|
||||
-->
|
||||
<resources>
|
||||
<!-- size at which Notification icons will be drawn in the status bar -->
|
||||
<dimen name="system_bar_icon_drawing_size">24dip</dimen>
|
||||
|
||||
<!-- opacity at which Notification icons will be drawn in the status bar -->
|
||||
<item type="dimen" name="system_bar_icon_drawing_alpha">100%</item>
|
||||
|
||||
<!-- The width of the view containing non-menu status bar icons -->
|
||||
<dimen name="system_bar_navigation_key_width">80dip</dimen>
|
||||
|
||||
<!-- The width of the view containing the menu status bar icon -->
|
||||
<dimen name="system_bar_navigation_menu_key_width">80dip</dimen>
|
||||
|
||||
<!-- ======================================== -->
|
||||
<!-- The following resources were recently moved from sw600dp; there may
|
||||
be situations where they don't sync up perfectly with
|
||||
PhoneStatusBar/TabletStatusBar. -->
|
||||
be situations where they don't sync up perfectly with PhoneStatusBar. -->
|
||||
<!-- ======================================== -->
|
||||
|
||||
<!-- The width of the ticker, including the icon -->
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
<?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.
|
||||
-->
|
||||
|
||||
<resources xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<style name="SystemBarNotificationText">
|
||||
<item name="android:textSize">16sp</item>
|
||||
<item name="android:textColor">#ff999999</item>
|
||||
</style>
|
||||
|
||||
<style name="SystemBarPanelSettingsRow">
|
||||
<item name="android:paddingRight">16dp</item>
|
||||
<item name="android:layout_height">64dp</item>
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:orientation">horizontal</item>
|
||||
<item name="android:background">?android:attr/listChoiceBackgroundIndicator</item>
|
||||
</style>
|
||||
|
||||
<style name="SystemBarPanelSettingsIcon">
|
||||
<item name="android:layout_height">match_parent</item>
|
||||
<item name="android:layout_width">64dp</item>
|
||||
<item name="android:scaleType">center</item>
|
||||
</style>
|
||||
|
||||
<style name="SystemBarPanelSettingsContents">
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_width">0dp</item>
|
||||
<item name="android:layout_weight">1</item>
|
||||
<item name="android:layout_gravity">start|center_vertical</item>
|
||||
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||
<item name="android:textSize">18sp</item>
|
||||
</style>
|
||||
|
||||
<style name="SystemBarPanelSettingsPanelSeparator">
|
||||
<item name="android:layout_marginEnd">0dp</item>
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">1dp</item>
|
||||
<item name="android:background">@android:drawable/divider_horizontal_dark</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.SystemBar.Clock" parent="@*android:style/TextAppearance.StatusBar.Icon">
|
||||
<item name="android:textSize">30dp</item>
|
||||
<item name="android:textStyle">normal</item>
|
||||
<item name="android:textColor">@android:color/holo_blue_light</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.SystemBar.Expanded.Clock" parent="@style/TextAppearance.StatusBar.Expanded.Clock">
|
||||
<item name="android:textSize">48dp</item>
|
||||
<item name="android:fontFamily">sans-serif-light</item>
|
||||
<item name="android:textStyle">normal</item>
|
||||
<item name="android:textColor">#ffffff</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.SystemBar.Expanded.Date" parent="@style/TextAppearance.StatusBar.Expanded.Date">
|
||||
<item name="android:textSize">14dp</item>
|
||||
<item name="android:textStyle">normal</item>
|
||||
<item name="android:textColor">#666666</item>
|
||||
<item name="android:textAllCaps">true</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
@@ -29,10 +29,5 @@
|
||||
<drawable name="notification_item_background_legacy_color">#ffaaaaaa</drawable>
|
||||
<drawable name="intruder_bg_pressed">#ff33B5E5</drawable>
|
||||
<drawable name="notification_header_bg">#FF000000</drawable>
|
||||
|
||||
<!-- ==================== system bar only ==================== -->
|
||||
<drawable name="system_bar_background">#ff000000</drawable>
|
||||
<!-- the darkening filter applied to notifications -->
|
||||
<drawable name="notification_icon_area_smoke">#aa000000</drawable>
|
||||
<color name="notification_panel_scrim_color">#B0000000</color>
|
||||
</resources>
|
||||
|
||||
@@ -37,10 +37,6 @@
|
||||
interface. This name is in the ComponentName flattened format (package/class) -->
|
||||
<string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.phone.PhoneStatusBar</string>
|
||||
|
||||
<!-- Component to be used as the system bar service. Must implement the IStatusBar
|
||||
interface. This name is in the ComponentName flattened format (package/class) -->
|
||||
<string name="config_systemBarComponent" translatable="false">com.android.systemui.statusbar.tablet.TabletStatusBar</string>
|
||||
|
||||
<!-- Whether or not we show the number in the bar. -->
|
||||
<bool name="config_statusBarShowNumber">false</bool>
|
||||
|
||||
|
||||
@@ -43,24 +43,21 @@ import android.widget.FrameLayout;
|
||||
|
||||
import com.android.internal.widget.multiwaveview.GlowPadView;
|
||||
import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
|
||||
import com.android.systemui.recent.StatusBarTouchProxy;
|
||||
import com.android.systemui.statusbar.BaseStatusBar;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.StatusBarPanel;
|
||||
import com.android.systemui.statusbar.phone.PhoneStatusBar;
|
||||
import com.android.systemui.statusbar.tablet.StatusBarPanel;
|
||||
import com.android.systemui.statusbar.tablet.TabletStatusBar;
|
||||
|
||||
public class SearchPanelView extends FrameLayout implements
|
||||
StatusBarPanel, ActivityOptions.OnAnimationStartedListener {
|
||||
private static final int SEARCH_PANEL_HOLD_DURATION = 0;
|
||||
static final String TAG = "SearchPanelView";
|
||||
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
|
||||
static final boolean DEBUG = PhoneStatusBar.DEBUG || false;
|
||||
public static final boolean DEBUG_GESTURES = true;
|
||||
private static final String ASSIST_ICON_METADATA_NAME =
|
||||
"com.android.systemui.action_assist_icon";
|
||||
private final Context mContext;
|
||||
private BaseStatusBar mBar;
|
||||
private StatusBarTouchProxy mStatusBarTouchProxy;
|
||||
|
||||
private boolean mShowing;
|
||||
private View mSearchTargetsContainer;
|
||||
@@ -169,7 +166,6 @@ public class SearchPanelView extends FrameLayout implements
|
||||
super.onFinishInflate();
|
||||
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
mSearchTargetsContainer = findViewById(R.id.search_panel_container);
|
||||
mStatusBarTouchProxy = (StatusBarTouchProxy) findViewById(R.id.status_bar_touch_proxy);
|
||||
// TODO: fetch views
|
||||
mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
|
||||
mGlowPadView.setOnTriggerListener(mGlowPadViewListener);
|
||||
@@ -197,14 +193,7 @@ public class SearchPanelView extends FrameLayout implements
|
||||
}
|
||||
|
||||
public boolean isInContentArea(int x, int y) {
|
||||
if (pointInside(x, y, mSearchTargetsContainer)) {
|
||||
return true;
|
||||
} else if (mStatusBarTouchProxy != null &&
|
||||
pointInside(x, y, mStatusBarTouchProxy)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return pointInside(x, y, mSearchTargetsContainer);
|
||||
}
|
||||
|
||||
private final OnPreDrawListener mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
|
||||
@@ -294,17 +283,6 @@ public class SearchPanelView extends FrameLayout implements
|
||||
mBar = bar;
|
||||
}
|
||||
|
||||
public void setStatusBarView(final View statusBarView) {
|
||||
if (mStatusBarTouchProxy != null) {
|
||||
mStatusBarTouchProxy.setStatusBar(statusBarView);
|
||||
// mGlowPadView.setOnTouchListener(new OnTouchListener() {
|
||||
// public boolean onTouch(View v, MotionEvent event) {
|
||||
// return statusBarView.onTouchEvent(event);
|
||||
// }
|
||||
// });
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
if (DEBUG_GESTURES) {
|
||||
|
||||
@@ -20,10 +20,10 @@ import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Log;
|
||||
import android.view.IWindowManager;
|
||||
import android.view.WindowManagerGlobal;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
@@ -35,7 +35,7 @@ public class SystemUIService extends Service {
|
||||
* The class names of the stuff to start.
|
||||
*/
|
||||
final Object[] SERVICES = new Object[] {
|
||||
0, // system bar or status bar, filled in below.
|
||||
R.string.config_statusBarComponent,
|
||||
com.android.systemui.power.PowerUI.class,
|
||||
com.android.systemui.media.RingtonePlayer.class,
|
||||
com.android.systemui.settings.SettingsUI.class,
|
||||
@@ -63,16 +63,6 @@ public class SystemUIService extends Service {
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
// Pick status bar or system bar.
|
||||
IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
|
||||
try {
|
||||
SERVICES[0] = wm.hasSystemNavBar()
|
||||
? R.string.config_systemBarComponent
|
||||
: R.string.config_statusBarComponent;
|
||||
} catch (RemoteException e) {
|
||||
Log.w(TAG, "Failing checking whether status bar can hide", e);
|
||||
}
|
||||
|
||||
final int N = SERVICES.length;
|
||||
mServices = new SystemUI[N];
|
||||
for (int i=0; i<N; i++) {
|
||||
|
||||
@@ -37,7 +37,6 @@ import android.view.View;
|
||||
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.phone.PhoneStatusBar;
|
||||
import com.android.systemui.statusbar.tablet.TabletStatusBar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -46,7 +45,7 @@ import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
public class RecentTasksLoader implements View.OnTouchListener {
|
||||
static final String TAG = "RecentTasksLoader";
|
||||
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
|
||||
static final boolean DEBUG = PhoneStatusBar.DEBUG || false;
|
||||
|
||||
private static final int DISPLAY_TASKS = 20;
|
||||
private static final int MAX_TASKS = DISPLAY_TASKS + 1; // allow extra for non-apps
|
||||
|
||||
@@ -30,7 +30,7 @@ import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.tablet.StatusBarPanel;
|
||||
import com.android.systemui.statusbar.StatusBarPanel;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@@ -61,21 +61,19 @@ import android.widget.TextView;
|
||||
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.BaseStatusBar;
|
||||
import com.android.systemui.statusbar.StatusBarPanel;
|
||||
import com.android.systemui.statusbar.phone.PhoneStatusBar;
|
||||
import com.android.systemui.statusbar.tablet.StatusBarPanel;
|
||||
import com.android.systemui.statusbar.tablet.TabletStatusBar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class RecentsPanelView extends FrameLayout implements OnItemClickListener, RecentsCallback,
|
||||
StatusBarPanel, Animator.AnimatorListener {
|
||||
static final String TAG = "RecentsPanelView";
|
||||
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
|
||||
static final boolean DEBUG = PhoneStatusBar.DEBUG || false;
|
||||
private PopupMenu mPopup;
|
||||
private View mRecentsScrim;
|
||||
private View mRecentsNoApps;
|
||||
private ViewGroup mRecentsContainer;
|
||||
private StatusBarTouchProxy mStatusBarTouchProxy;
|
||||
|
||||
private boolean mShowing;
|
||||
private boolean mWaitingToShow;
|
||||
@@ -289,14 +287,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
|
||||
}
|
||||
|
||||
public boolean isInContentArea(int x, int y) {
|
||||
if (pointInside(x, y, mRecentsContainer)) {
|
||||
return true;
|
||||
} else if (mStatusBarTouchProxy != null &&
|
||||
pointInside(x, y, mStatusBarTouchProxy)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return pointInside(x, y, mRecentsContainer);
|
||||
}
|
||||
|
||||
public void show(boolean show) {
|
||||
@@ -430,12 +421,6 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
|
||||
return mShowing;
|
||||
}
|
||||
|
||||
public void setStatusBarView(View statusBarView) {
|
||||
if (mStatusBarTouchProxy != null) {
|
||||
mStatusBarTouchProxy.setStatusBar(statusBarView);
|
||||
}
|
||||
}
|
||||
|
||||
public void setRecentTasksLoader(RecentTasksLoader loader) {
|
||||
mRecentTasksLoader = loader;
|
||||
}
|
||||
@@ -451,7 +436,6 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
|
||||
super.onFinishInflate();
|
||||
|
||||
mRecentsContainer = (ViewGroup) findViewById(R.id.recents_container);
|
||||
mStatusBarTouchProxy = (StatusBarTouchProxy) findViewById(R.id.status_bar_touch_proxy);
|
||||
mListAdapter = new TaskDescriptionAdapter(mContext);
|
||||
if (mRecentsContainer instanceof RecentsScrollView){
|
||||
RecentsScrollView scrollView
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.recent;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
public class StatusBarTouchProxy extends FrameLayout {
|
||||
|
||||
private View mStatusBar;
|
||||
|
||||
public StatusBarTouchProxy(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public void setStatusBar(View statusBar) {
|
||||
mStatusBar = statusBar;
|
||||
}
|
||||
|
||||
public boolean onTouchEvent (MotionEvent event) {
|
||||
return mStatusBar.dispatchTouchEvent(event);
|
||||
}
|
||||
}
|
||||
@@ -76,7 +76,6 @@ import com.android.systemui.recent.RecentTasksLoader;
|
||||
import com.android.systemui.recent.RecentsActivity;
|
||||
import com.android.systemui.recent.TaskDescription;
|
||||
import com.android.systemui.statusbar.policy.NotificationRowLayout;
|
||||
import com.android.systemui.statusbar.tablet.StatusBarPanel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
@@ -534,7 +533,6 @@ public abstract class BaseStatusBar extends SystemUI implements
|
||||
mDisplay.getMetrics(dm);
|
||||
// calculate it here, but consider moving it elsewhere
|
||||
// first, determine which orientation you're in.
|
||||
// todo: move the system_bar layouts to sw600dp ?
|
||||
final Configuration config = res.getConfiguration();
|
||||
int x, y;
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.statusbar.tablet;
|
||||
package com.android.systemui.statusbar;
|
||||
|
||||
public interface StatusBarPanel {
|
||||
public boolean isInContentArea(int x, int y);
|
||||
@@ -720,7 +720,6 @@ public class PhoneStatusBar extends BaseStatusBar {
|
||||
@Override
|
||||
protected void updateSearchPanel() {
|
||||
super.updateSearchPanel();
|
||||
mSearchPanelView.setStatusBarView(mNavigationBarView);
|
||||
mNavigationBarView.setDelegateView(mSearchPanelView);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.tablet;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.RadioButton;
|
||||
|
||||
import com.android.systemui.R;
|
||||
|
||||
public class CompatModePanel extends FrameLayout implements StatusBarPanel,
|
||||
View.OnClickListener {
|
||||
private static final boolean DEBUG = TabletStatusBar.DEBUG;
|
||||
private static final String TAG = "CompatModePanel";
|
||||
|
||||
private ActivityManager mAM;
|
||||
|
||||
private boolean mAttached = false;
|
||||
private Context mContext;
|
||||
private RadioButton mOnButton, mOffButton;
|
||||
|
||||
private View mTrigger;
|
||||
// private InputMethodButton mInputMethodSwitchButton;
|
||||
|
||||
public CompatModePanel(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
mContext = context;
|
||||
mAM = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinishInflate() {
|
||||
mOnButton = (RadioButton) findViewById(R.id.compat_mode_on_radio);
|
||||
mOffButton = (RadioButton) findViewById(R.id.compat_mode_off_radio);
|
||||
mOnButton.setOnClickListener(this);
|
||||
mOffButton.setOnClickListener(this);
|
||||
|
||||
refresh();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
if (mAttached) {
|
||||
mAttached = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
if (!mAttached) {
|
||||
mAttached = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v == mOnButton) {
|
||||
mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_ENABLED);
|
||||
} else if (v == mOffButton) {
|
||||
mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_DISABLED);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInContentArea(int x, int y) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchHoverEvent(MotionEvent event) {
|
||||
// Ignore hover events outside of this panel bounds since such events
|
||||
// generate spurious accessibility events with the panel content when
|
||||
// tapping outside of it, thus confusing the user.
|
||||
final int x = (int) event.getX();
|
||||
final int y = (int) event.getY();
|
||||
if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) {
|
||||
return super.dispatchHoverEvent(event);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setTrigger(View v) {
|
||||
mTrigger = v;
|
||||
}
|
||||
|
||||
public void openPanel() {
|
||||
setVisibility(View.VISIBLE);
|
||||
if (mTrigger != null) mTrigger.setSelected(true);
|
||||
refresh();
|
||||
}
|
||||
|
||||
public void closePanel() {
|
||||
setVisibility(View.GONE);
|
||||
if (mTrigger != null) mTrigger.setSelected(false);
|
||||
}
|
||||
|
||||
private void refresh() {
|
||||
int mode = mAM.getFrontActivityScreenCompatMode();
|
||||
if (mode == ActivityManager.COMPAT_MODE_ALWAYS
|
||||
|| mode == ActivityManager.COMPAT_MODE_NEVER) {
|
||||
// No longer have something to switch.
|
||||
closePanel();
|
||||
return;
|
||||
}
|
||||
final boolean on = (mode == ActivityManager.COMPAT_MODE_ENABLED);
|
||||
mOnButton.setChecked(on);
|
||||
mOffButton.setChecked(!on);
|
||||
}
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.IBinder;
|
||||
import android.provider.Settings;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.view.inputmethod.InputMethodSubtype;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.android.systemui.R;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class InputMethodButton extends ImageView {
|
||||
|
||||
private static final String TAG = "StatusBar/InputMethodButton";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
// These values are defined in Settings application.
|
||||
private static final int ID_IME_BUTTON_VISIBILITY_AUTO = 0;
|
||||
private static final int ID_IME_BUTTON_VISIBILITY_ALWAYS_SHOW = 1;
|
||||
private static final int ID_IME_BUTTON_VISIBILITY_ALWAYS_HIDE = 2;
|
||||
|
||||
// other services we wish to talk to
|
||||
private final InputMethodManager mImm;
|
||||
private final int mId;
|
||||
private ImageView mIcon;
|
||||
private IBinder mToken;
|
||||
private boolean mShowButton = false;
|
||||
private boolean mScreenLocked = false;
|
||||
private boolean mHardKeyboardAvailable;
|
||||
|
||||
// Please refer to InputMethodManagerService.TAG_TRY_SUPPRESSING_IME_SWITCHER
|
||||
private static final String TAG_TRY_SUPPRESSING_IME_SWITCHER = "TrySuppressingImeSwitcher";
|
||||
|
||||
public InputMethodButton(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
|
||||
// Resource Id of the input method button. This id is defined in status_bar.xml
|
||||
mId = getId();
|
||||
// IME hookup
|
||||
mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
mIcon = (ImageView) findViewById(mId);
|
||||
|
||||
refreshStatusIcon();
|
||||
}
|
||||
|
||||
// Refer to InputMethodManagerService.needsToShowImeSwitchOngoingNotification()
|
||||
private boolean needsToShowIMEButtonWhenVisibilityAuto() {
|
||||
List<InputMethodInfo> imis = mImm.getEnabledInputMethodList();
|
||||
final int N = imis.size();
|
||||
if (N > 2) return true;
|
||||
if (N < 1) return false;
|
||||
int nonAuxCount = 0;
|
||||
int auxCount = 0;
|
||||
InputMethodSubtype nonAuxSubtype = null;
|
||||
InputMethodSubtype auxSubtype = null;
|
||||
for(int i = 0; i < N; ++i) {
|
||||
final InputMethodInfo imi = imis.get(i);
|
||||
final List<InputMethodSubtype> subtypes = mImm.getEnabledInputMethodSubtypeList(
|
||||
imi, true);
|
||||
final int subtypeCount = subtypes.size();
|
||||
if (subtypeCount == 0) {
|
||||
++nonAuxCount;
|
||||
} else {
|
||||
for (int j = 0; j < subtypeCount; ++j) {
|
||||
final InputMethodSubtype subtype = subtypes.get(j);
|
||||
if (!subtype.isAuxiliary()) {
|
||||
++nonAuxCount;
|
||||
nonAuxSubtype = subtype;
|
||||
} else {
|
||||
++auxCount;
|
||||
auxSubtype = subtype;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (nonAuxCount > 1 || auxCount > 1) {
|
||||
return true;
|
||||
} else if (nonAuxCount == 1 && auxCount == 1) {
|
||||
if (nonAuxSubtype != null && auxSubtype != null
|
||||
&& (nonAuxSubtype.getLocale().equals(auxSubtype.getLocale())
|
||||
|| auxSubtype.overridesImplicitlyEnabledSubtype()
|
||||
|| nonAuxSubtype.overridesImplicitlyEnabledSubtype())
|
||||
&& nonAuxSubtype.containsExtraValueKey(TAG_TRY_SUPPRESSING_IME_SWITCHER)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean needsToShowIMEButton() {
|
||||
if (!mShowButton || mScreenLocked) return false;
|
||||
|
||||
if (mHardKeyboardAvailable) {
|
||||
return true;
|
||||
}
|
||||
|
||||
final int visibility = loadInputMethodSelectorVisibility();
|
||||
switch (visibility) {
|
||||
case ID_IME_BUTTON_VISIBILITY_AUTO:
|
||||
return needsToShowIMEButtonWhenVisibilityAuto();
|
||||
case ID_IME_BUTTON_VISIBILITY_ALWAYS_SHOW:
|
||||
return true;
|
||||
case ID_IME_BUTTON_VISIBILITY_ALWAYS_HIDE:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void refreshStatusIcon() {
|
||||
if (mIcon == null) {
|
||||
return;
|
||||
}
|
||||
if (!needsToShowIMEButton()) {
|
||||
setVisibility(View.GONE);
|
||||
return;
|
||||
} else {
|
||||
setVisibility(View.VISIBLE);
|
||||
}
|
||||
mIcon.setImageResource(R.drawable.ic_sysbar_ime);
|
||||
}
|
||||
|
||||
private int loadInputMethodSelectorVisibility() {
|
||||
return Settings.Secure.getInt(getContext().getContentResolver(),
|
||||
Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, ID_IME_BUTTON_VISIBILITY_AUTO);
|
||||
}
|
||||
|
||||
public void setIconImage(int resId) {
|
||||
if (mIcon != null) {
|
||||
mIcon.setImageResource(resId);
|
||||
}
|
||||
}
|
||||
|
||||
public void setImeWindowStatus(IBinder token, boolean showButton) {
|
||||
mToken = token;
|
||||
mShowButton = showButton;
|
||||
refreshStatusIcon();
|
||||
}
|
||||
|
||||
public void setHardKeyboardStatus(boolean available) {
|
||||
if (mHardKeyboardAvailable != available) {
|
||||
mHardKeyboardAvailable = available;
|
||||
refreshStatusIcon();
|
||||
}
|
||||
}
|
||||
|
||||
public void setScreenLocked(boolean locked) {
|
||||
mScreenLocked = locked;
|
||||
refreshStatusIcon();
|
||||
}
|
||||
}
|
||||
@@ -1,487 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.tablet;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.IBinder;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.view.inputmethod.InputMethodSubtype;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.Switch;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.systemui.R;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
public class InputMethodsPanel extends LinearLayout implements StatusBarPanel,
|
||||
View.OnClickListener {
|
||||
private static final boolean DEBUG = TabletStatusBar.DEBUG;
|
||||
private static final String TAG = "InputMethodsPanel";
|
||||
|
||||
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
onPackageChanged();
|
||||
}
|
||||
};
|
||||
|
||||
private final InputMethodManager mImm;
|
||||
private final IntentFilter mIntentFilter = new IntentFilter();
|
||||
private final HashMap<View, Pair<InputMethodInfo, InputMethodSubtype>> mRadioViewAndImiMap =
|
||||
new HashMap<View, Pair<InputMethodInfo, InputMethodSubtype>>();
|
||||
private final TreeMap<InputMethodInfo, List<InputMethodSubtype>>
|
||||
mEnabledInputMethodAndSubtypesCache =
|
||||
new TreeMap<InputMethodInfo, List<InputMethodSubtype>>(
|
||||
new InputMethodComparator());
|
||||
|
||||
private boolean mAttached = false;
|
||||
private boolean mPackageChanged = false;
|
||||
private Context mContext;
|
||||
private IBinder mToken;
|
||||
private InputMethodButton mInputMethodSwitchButton;
|
||||
private LinearLayout mInputMethodMenuList;
|
||||
private boolean mHardKeyboardAvailable;
|
||||
private boolean mHardKeyboardEnabled;
|
||||
private OnHardKeyboardEnabledChangeListener mHardKeyboardEnabledChangeListener;
|
||||
private LinearLayout mHardKeyboardSection;
|
||||
private Switch mHardKeyboardSwitch;
|
||||
private PackageManager mPackageManager;
|
||||
private String mEnabledInputMethodAndSubtypesCacheStr;
|
||||
private String mLastSystemLocaleString;
|
||||
private View mConfigureImeShortcut;
|
||||
|
||||
private class InputMethodComparator implements Comparator<InputMethodInfo> {
|
||||
@Override
|
||||
public int compare(InputMethodInfo imi1, InputMethodInfo imi2) {
|
||||
if (imi2 == null) return 0;
|
||||
if (imi1 == null) return 1;
|
||||
if (mPackageManager == null) {
|
||||
return imi1.getId().compareTo(imi2.getId());
|
||||
}
|
||||
CharSequence imiId1 = imi1.loadLabel(mPackageManager) + "/" + imi1.getId();
|
||||
CharSequence imiId2 = imi2.loadLabel(mPackageManager) + "/" + imi2.getId();
|
||||
return imiId1.toString().compareTo(imiId2.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public InputMethodsPanel(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public InputMethodsPanel(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
mContext = context;
|
||||
mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
mIntentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
|
||||
mIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
|
||||
mIntentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
|
||||
mIntentFilter.addDataScheme("package");
|
||||
}
|
||||
|
||||
public void setHardKeyboardEnabledChangeListener(
|
||||
OnHardKeyboardEnabledChangeListener listener) {
|
||||
mHardKeyboardEnabledChangeListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
if (mAttached) {
|
||||
getContext().unregisterReceiver(mBroadcastReceiver);
|
||||
mAttached = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
if (!mAttached) {
|
||||
getContext().registerReceiver(mBroadcastReceiver, mIntentFilter);
|
||||
mAttached = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinishInflate() {
|
||||
mInputMethodMenuList = (LinearLayout) findViewById(R.id.input_method_menu_list);
|
||||
mHardKeyboardSection = (LinearLayout) findViewById(R.id.hard_keyboard_section);
|
||||
mHardKeyboardSwitch = (Switch) findViewById(R.id.hard_keyboard_switch);
|
||||
mConfigureImeShortcut = findViewById(R.id.ime_settings_shortcut);
|
||||
mConfigureImeShortcut.setOnClickListener(this);
|
||||
// TODO: If configurations for IME are not changed, do not update
|
||||
// by checking onConfigurationChanged.
|
||||
updateUiElements();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInContentArea(int x, int y) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (view == mConfigureImeShortcut) {
|
||||
showConfigureInputMethods();
|
||||
closePanel(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchHoverEvent(MotionEvent event) {
|
||||
// Ignore hover events outside of this panel bounds since such events
|
||||
// generate spurious accessibility events with the panel content when
|
||||
// tapping outside of it, thus confusing the user.
|
||||
final int x = (int) event.getX();
|
||||
final int y = (int) event.getY();
|
||||
if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) {
|
||||
return super.dispatchHoverEvent(event);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void updateHardKeyboardEnabled() {
|
||||
if (mHardKeyboardAvailable) {
|
||||
final boolean checked = mHardKeyboardSwitch.isChecked();
|
||||
if (mHardKeyboardEnabled != checked) {
|
||||
mHardKeyboardEnabled = checked;
|
||||
if (mHardKeyboardEnabledChangeListener != null)
|
||||
mHardKeyboardEnabledChangeListener.onHardKeyboardEnabledChange(checked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void openPanel() {
|
||||
setVisibility(View.VISIBLE);
|
||||
updateUiElements();
|
||||
if (mInputMethodSwitchButton != null) {
|
||||
mInputMethodSwitchButton.setIconImage(R.drawable.ic_sysbar_ime_pressed);
|
||||
}
|
||||
}
|
||||
|
||||
public void closePanel(boolean closeKeyboard) {
|
||||
setVisibility(View.GONE);
|
||||
if (mInputMethodSwitchButton != null) {
|
||||
mInputMethodSwitchButton.setIconImage(R.drawable.ic_sysbar_ime);
|
||||
}
|
||||
if (closeKeyboard) {
|
||||
mImm.hideSoftInputFromWindow(getWindowToken(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
private void startActivity(Intent intent) {
|
||||
mContext.startActivity(intent);
|
||||
}
|
||||
|
||||
private void showConfigureInputMethods() {
|
||||
Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
|
||||
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
private View createInputMethodItem(
|
||||
final InputMethodInfo imi, final InputMethodSubtype subtype) {
|
||||
final CharSequence subtypeName;
|
||||
if (subtype == null || subtype.overridesImplicitlyEnabledSubtype()) {
|
||||
subtypeName = null;
|
||||
} else {
|
||||
subtypeName = getSubtypeName(imi, subtype);
|
||||
}
|
||||
final CharSequence imiName = getIMIName(imi);
|
||||
final Drawable icon = getSubtypeIcon(imi, subtype);
|
||||
final View view = View.inflate(mContext, R.layout.system_bar_input_methods_item, null);
|
||||
final ImageView subtypeIcon = (ImageView)view.findViewById(R.id.item_icon);
|
||||
final TextView itemTitle = (TextView)view.findViewById(R.id.item_title);
|
||||
final TextView itemSubtitle = (TextView)view.findViewById(R.id.item_subtitle);
|
||||
final ImageView settingsIcon = (ImageView)view.findViewById(R.id.item_settings_icon);
|
||||
final View subtypeView = view.findViewById(R.id.item_subtype);
|
||||
if (subtypeName == null) {
|
||||
itemTitle.setText(imiName);
|
||||
itemSubtitle.setVisibility(View.GONE);
|
||||
} else {
|
||||
itemTitle.setText(subtypeName);
|
||||
itemSubtitle.setVisibility(View.VISIBLE);
|
||||
itemSubtitle.setText(imiName);
|
||||
}
|
||||
subtypeIcon.setImageDrawable(icon);
|
||||
subtypeIcon.setContentDescription(itemTitle.getText());
|
||||
final String settingsActivity = imi.getSettingsActivity();
|
||||
if (!TextUtils.isEmpty(settingsActivity)) {
|
||||
settingsIcon.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||
intent.setClassName(imi.getPackageName(), settingsActivity);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
|
||||
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(intent);
|
||||
closePanel(true);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Do not show the settings icon if the IME does not have a settings preference
|
||||
view.findViewById(R.id.item_vertical_separator).setVisibility(View.GONE);
|
||||
settingsIcon.setVisibility(View.GONE);
|
||||
}
|
||||
mRadioViewAndImiMap.put(
|
||||
subtypeView, new Pair<InputMethodInfo, InputMethodSubtype> (imi, subtype));
|
||||
subtypeView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Pair<InputMethodInfo, InputMethodSubtype> imiAndSubtype =
|
||||
updateRadioButtonsByView(v);
|
||||
closePanel(false);
|
||||
setInputMethodAndSubtype(imiAndSubtype.first, imiAndSubtype.second);
|
||||
}
|
||||
});
|
||||
return view;
|
||||
}
|
||||
|
||||
private void updateUiElements() {
|
||||
updateHardKeyboardSection();
|
||||
|
||||
// TODO: Reuse subtype views.
|
||||
mInputMethodMenuList.removeAllViews();
|
||||
mRadioViewAndImiMap.clear();
|
||||
mPackageManager = mContext.getPackageManager();
|
||||
|
||||
Map<InputMethodInfo, List<InputMethodSubtype>> enabledIMIs =
|
||||
getEnabledInputMethodAndSubtypeList();
|
||||
Set<InputMethodInfo> cachedImiSet = enabledIMIs.keySet();
|
||||
for (InputMethodInfo imi: cachedImiSet) {
|
||||
List<InputMethodSubtype> subtypes = enabledIMIs.get(imi);
|
||||
if (subtypes == null || subtypes.size() == 0) {
|
||||
mInputMethodMenuList.addView(
|
||||
createInputMethodItem(imi, null));
|
||||
continue;
|
||||
}
|
||||
for (InputMethodSubtype subtype: subtypes) {
|
||||
mInputMethodMenuList.addView(createInputMethodItem(imi, subtype));
|
||||
}
|
||||
}
|
||||
updateRadioButtons();
|
||||
}
|
||||
|
||||
public void setImeToken(IBinder token) {
|
||||
mToken = token;
|
||||
}
|
||||
|
||||
public void setImeSwitchButton(InputMethodButton imb) {
|
||||
mInputMethodSwitchButton = imb;
|
||||
}
|
||||
|
||||
private void setInputMethodAndSubtype(InputMethodInfo imi, InputMethodSubtype subtype) {
|
||||
if (mToken != null) {
|
||||
mImm.setInputMethodAndSubtype(mToken, imi.getId(), subtype);
|
||||
} else {
|
||||
Log.w(TAG, "IME Token is not set yet.");
|
||||
}
|
||||
}
|
||||
|
||||
public void setHardKeyboardStatus(boolean available, boolean enabled) {
|
||||
if (mHardKeyboardAvailable != available || mHardKeyboardEnabled != enabled) {
|
||||
mHardKeyboardAvailable = available;
|
||||
mHardKeyboardEnabled = enabled;
|
||||
updateHardKeyboardSection();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateHardKeyboardSection() {
|
||||
if (mHardKeyboardAvailable) {
|
||||
mHardKeyboardSection.setVisibility(View.VISIBLE);
|
||||
if (mHardKeyboardSwitch.isChecked() != mHardKeyboardEnabled) {
|
||||
mHardKeyboardSwitch.setChecked(mHardKeyboardEnabled);
|
||||
updateHardKeyboardEnabled();
|
||||
}
|
||||
} else {
|
||||
mHardKeyboardSection.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
// Turn on the selected radio button when the user chooses the item
|
||||
private Pair<InputMethodInfo, InputMethodSubtype> updateRadioButtonsByView(View selectedView) {
|
||||
Pair<InputMethodInfo, InputMethodSubtype> selectedImiAndSubtype = null;
|
||||
if (mRadioViewAndImiMap.containsKey(selectedView)) {
|
||||
for (View radioView: mRadioViewAndImiMap.keySet()) {
|
||||
RadioButton subtypeRadioButton =
|
||||
(RadioButton) radioView.findViewById(R.id.item_radio);
|
||||
if (subtypeRadioButton == null) {
|
||||
Log.w(TAG, "RadioButton was not found in the selected subtype view");
|
||||
return null;
|
||||
}
|
||||
if (radioView == selectedView) {
|
||||
Pair<InputMethodInfo, InputMethodSubtype> imiAndSubtype =
|
||||
mRadioViewAndImiMap.get(radioView);
|
||||
selectedImiAndSubtype = imiAndSubtype;
|
||||
subtypeRadioButton.setChecked(true);
|
||||
} else {
|
||||
subtypeRadioButton.setChecked(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
return selectedImiAndSubtype;
|
||||
}
|
||||
|
||||
private void updateRadioButtons() {
|
||||
updateRadioButtonsByImiAndSubtype(
|
||||
getCurrentInputMethodInfo(), mImm.getCurrentInputMethodSubtype());
|
||||
}
|
||||
|
||||
// Turn on the selected radio button at startup
|
||||
private void updateRadioButtonsByImiAndSubtype(
|
||||
InputMethodInfo imi, InputMethodSubtype subtype) {
|
||||
if (imi == null) return;
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Update radio buttons by " + imi.getId() + ", " + subtype);
|
||||
}
|
||||
for (View radioView: mRadioViewAndImiMap.keySet()) {
|
||||
RadioButton subtypeRadioButton =
|
||||
(RadioButton) radioView.findViewById(R.id.item_radio);
|
||||
if (subtypeRadioButton == null) {
|
||||
Log.w(TAG, "RadioButton was not found in the selected subtype view");
|
||||
return;
|
||||
}
|
||||
Pair<InputMethodInfo, InputMethodSubtype> imiAndSubtype =
|
||||
mRadioViewAndImiMap.get(radioView);
|
||||
if (imiAndSubtype.first.getId().equals(imi.getId())
|
||||
&& (imiAndSubtype.second == null || imiAndSubtype.second.equals(subtype))) {
|
||||
subtypeRadioButton.setChecked(true);
|
||||
} else {
|
||||
subtypeRadioButton.setChecked(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private TreeMap<InputMethodInfo, List<InputMethodSubtype>>
|
||||
getEnabledInputMethodAndSubtypeList() {
|
||||
String newEnabledIMIs = Settings.Secure.getString(
|
||||
mContext.getContentResolver(), Settings.Secure.ENABLED_INPUT_METHODS);
|
||||
String currentSystemLocaleString =
|
||||
mContext.getResources().getConfiguration().locale.toString();
|
||||
if (!TextUtils.equals(mEnabledInputMethodAndSubtypesCacheStr, newEnabledIMIs)
|
||||
|| !TextUtils.equals(mLastSystemLocaleString, currentSystemLocaleString)
|
||||
|| mPackageChanged) {
|
||||
mEnabledInputMethodAndSubtypesCache.clear();
|
||||
final List<InputMethodInfo> imis = mImm.getEnabledInputMethodList();
|
||||
for (InputMethodInfo imi: imis) {
|
||||
mEnabledInputMethodAndSubtypesCache.put(imi,
|
||||
mImm.getEnabledInputMethodSubtypeList(imi, true));
|
||||
}
|
||||
mEnabledInputMethodAndSubtypesCacheStr = newEnabledIMIs;
|
||||
mPackageChanged = false;
|
||||
mLastSystemLocaleString = currentSystemLocaleString;
|
||||
}
|
||||
return mEnabledInputMethodAndSubtypesCache;
|
||||
}
|
||||
|
||||
private InputMethodInfo getCurrentInputMethodInfo() {
|
||||
String curInputMethodId = Settings.Secure.getString(getContext()
|
||||
.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
|
||||
Set<InputMethodInfo> cachedImiSet = mEnabledInputMethodAndSubtypesCache.keySet();
|
||||
// 1. Search IMI in cache
|
||||
for (InputMethodInfo imi: cachedImiSet) {
|
||||
if (imi.getId().equals(curInputMethodId)) {
|
||||
return imi;
|
||||
}
|
||||
}
|
||||
// 2. Get current enabled IMEs and search IMI
|
||||
cachedImiSet = getEnabledInputMethodAndSubtypeList().keySet();
|
||||
for (InputMethodInfo imi: cachedImiSet) {
|
||||
if (imi.getId().equals(curInputMethodId)) {
|
||||
return imi;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private CharSequence getIMIName(InputMethodInfo imi) {
|
||||
if (imi == null) return null;
|
||||
return imi.loadLabel(mPackageManager);
|
||||
}
|
||||
|
||||
private CharSequence getSubtypeName(InputMethodInfo imi, InputMethodSubtype subtype) {
|
||||
if (imi == null || subtype == null) return null;
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Get text from: " + imi.getPackageName() + subtype.getNameResId()
|
||||
+ imi.getServiceInfo().applicationInfo);
|
||||
}
|
||||
return subtype.getDisplayName(
|
||||
mContext, imi.getPackageName(), imi.getServiceInfo().applicationInfo);
|
||||
}
|
||||
|
||||
private Drawable getSubtypeIcon(InputMethodInfo imi, InputMethodSubtype subtype) {
|
||||
if (imi != null) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Update icons of IME: " + imi.getPackageName());
|
||||
if (subtype != null) {
|
||||
Log.d(TAG, "subtype =" + subtype.getLocale() + "," + subtype.getMode());
|
||||
}
|
||||
}
|
||||
if (subtype != null) {
|
||||
return mPackageManager.getDrawable(imi.getPackageName(), subtype.getIconResId(),
|
||||
imi.getServiceInfo().applicationInfo);
|
||||
} else if (imi.getSubtypeCount() > 0) {
|
||||
return mPackageManager.getDrawable(imi.getPackageName(),
|
||||
imi.getSubtypeAt(0).getIconResId(),
|
||||
imi.getServiceInfo().applicationInfo);
|
||||
} else {
|
||||
try {
|
||||
return mPackageManager.getApplicationInfo(
|
||||
imi.getPackageName(), 0).loadIcon(mPackageManager);
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.w(TAG, "IME can't be found: " + imi.getPackageName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void onPackageChanged() {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "onPackageChanged.");
|
||||
}
|
||||
mPackageChanged = true;
|
||||
}
|
||||
|
||||
public interface OnHardKeyboardEnabledChangeListener {
|
||||
public void onHardKeyboardEnabledChange(boolean enabled);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.tablet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
public class NotificationArea extends LinearLayout {
|
||||
|
||||
public NotificationArea(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
|
||||
if (super.onRequestSendAccessibilityEvent(child, event)) {
|
||||
// The event is coming from a descendant like battery but append
|
||||
// the content of the entire notification area so accessibility
|
||||
// services can choose how to present the content to the user.
|
||||
AccessibilityEvent record = AccessibilityEvent.obtain();
|
||||
onInitializeAccessibilityEvent(record);
|
||||
dispatchPopulateAccessibilityEvent(record);
|
||||
event.appendRecord(record);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RelativeLayout;
|
||||
|
||||
import com.android.systemui.R;
|
||||
|
||||
|
||||
public class NotificationIconArea extends RelativeLayout {
|
||||
private static final String TAG = "NotificationIconArea";
|
||||
|
||||
IconLayout mIconLayout;
|
||||
|
||||
public NotificationIconArea(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
|
||||
mIconLayout = (IconLayout)findViewById(R.id.icons);
|
||||
}
|
||||
|
||||
static class IconLayout extends LinearLayout {
|
||||
public IconLayout(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public boolean onInterceptTouchEvent(MotionEvent e) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.android.systemui.R;
|
||||
|
||||
public class NotificationLinearLayout extends LinearLayout {
|
||||
private static final String TAG = "NotificationLinearLayout";
|
||||
|
||||
Drawable mItemGlow;
|
||||
int mInsetLeft;
|
||||
Rect mTmp = new Rect();
|
||||
|
||||
public NotificationLinearLayout(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public NotificationLinearLayout(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
|
||||
final Resources res = context.getResources();
|
||||
|
||||
mItemGlow = res.getDrawable(R.drawable.notify_item_glow_bottom);
|
||||
|
||||
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NotificationLinearLayout,
|
||||
defStyle, 0);
|
||||
mInsetLeft = a.getDimensionPixelSize(R.styleable.NotificationLinearLayout_insetLeft, 0);
|
||||
a.recycle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
setWillNotDraw(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDraw(Canvas canvas) {
|
||||
super.onDraw(canvas);
|
||||
|
||||
final Rect padding = mTmp;
|
||||
final Drawable glow = mItemGlow;
|
||||
glow.getPadding(padding);
|
||||
final int glowHeight = glow.getIntrinsicHeight();
|
||||
final int insetLeft = mInsetLeft;
|
||||
|
||||
final int N = getChildCount();
|
||||
for (int i=0; i<N; i++) {
|
||||
final View child = getChildAt(i);
|
||||
|
||||
final int childBottom = child.getBottom();
|
||||
|
||||
glow.setBounds(child.getLeft() - padding.left + insetLeft, childBottom,
|
||||
child.getRight() - padding.right, childBottom + glowHeight);
|
||||
glow.draw(canvas);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,464 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.animation.AccelerateInterpolator;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
import android.view.animation.Interpolator;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.RelativeLayout;
|
||||
|
||||
import com.android.systemui.ExpandHelper;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.policy.NotificationRowLayout;
|
||||
|
||||
public class NotificationPanel extends RelativeLayout implements StatusBarPanel,
|
||||
View.OnClickListener {
|
||||
private ExpandHelper mExpandHelper;
|
||||
private NotificationRowLayout latestItems;
|
||||
|
||||
static final String TAG = "Tablet/NotificationPanel";
|
||||
static final boolean DEBUG = false;
|
||||
|
||||
final static int PANEL_FADE_DURATION = 150;
|
||||
|
||||
boolean mShowing;
|
||||
boolean mHasClearableNotifications = false;
|
||||
int mNotificationCount = 0;
|
||||
NotificationPanelTitle mTitleArea;
|
||||
ImageView mSettingsButton;
|
||||
ImageView mNotificationButton;
|
||||
View mNotificationScroller;
|
||||
ViewGroup mContentFrame;
|
||||
Rect mContentArea = new Rect();
|
||||
View mSettingsView;
|
||||
ViewGroup mContentParent;
|
||||
TabletStatusBar mBar;
|
||||
View mClearButton;
|
||||
static Interpolator sAccelerateInterpolator = new AccelerateInterpolator();
|
||||
static Interpolator sDecelerateInterpolator = new DecelerateInterpolator();
|
||||
|
||||
// amount to slide mContentParent down by when mContentFrame is missing
|
||||
float mContentFrameMissingTranslation;
|
||||
|
||||
Choreographer mChoreo = new Choreographer();
|
||||
|
||||
public NotificationPanel(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public NotificationPanel(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
public void setBar(TabletStatusBar b) {
|
||||
mBar = b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
setWillNotDraw(false);
|
||||
|
||||
mContentParent = (ViewGroup)findViewById(R.id.content_parent);
|
||||
mContentParent.bringToFront();
|
||||
mTitleArea = (NotificationPanelTitle) findViewById(R.id.title_area);
|
||||
mTitleArea.setPanel(this);
|
||||
|
||||
mSettingsButton = (ImageView) findViewById(R.id.settings_button);
|
||||
mNotificationButton = (ImageView) findViewById(R.id.notification_button);
|
||||
|
||||
mNotificationScroller = findViewById(R.id.notification_scroller);
|
||||
mContentFrame = (ViewGroup)findViewById(R.id.content_frame);
|
||||
mContentFrameMissingTranslation = 0; // not needed with current assets
|
||||
|
||||
// the "X" that appears in place of the clock when the panel is showing notifications
|
||||
mClearButton = findViewById(R.id.clear_all_button);
|
||||
mClearButton.setOnClickListener(mClearButtonListener);
|
||||
|
||||
mShowing = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow () {
|
||||
super.onAttachedToWindow();
|
||||
latestItems = (NotificationRowLayout) findViewById(R.id.content);
|
||||
int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height);
|
||||
int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height);
|
||||
mExpandHelper = new ExpandHelper(mContext, latestItems, minHeight, maxHeight);
|
||||
mExpandHelper.setEventSource(this);
|
||||
mExpandHelper.setGravity(Gravity.BOTTOM);
|
||||
}
|
||||
|
||||
private View.OnClickListener mClearButtonListener = new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
mBar.clearAll();
|
||||
}
|
||||
};
|
||||
|
||||
public View getClearButton() {
|
||||
return mClearButton;
|
||||
}
|
||||
|
||||
public void show(boolean show, boolean animate) {
|
||||
if (animate) {
|
||||
if (mShowing != show) {
|
||||
mShowing = show;
|
||||
if (show) {
|
||||
setVisibility(View.VISIBLE);
|
||||
// Don't start the animation until we've created the layer, which is done
|
||||
// right before we are drawn
|
||||
mContentParent.setLayerType(View.LAYER_TYPE_HARDWARE, null);
|
||||
getViewTreeObserver().addOnPreDrawListener(mPreDrawListener);
|
||||
} else {
|
||||
mChoreo.startAnimation(show);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mShowing = show;
|
||||
setVisibility(show ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used only when we've created a hardware layer and are waiting until it's
|
||||
* been created in order to start the appearing animation.
|
||||
*/
|
||||
private ViewTreeObserver.OnPreDrawListener mPreDrawListener =
|
||||
new ViewTreeObserver.OnPreDrawListener() {
|
||||
@Override
|
||||
public boolean onPreDraw() {
|
||||
getViewTreeObserver().removeOnPreDrawListener(this);
|
||||
mChoreo.startAnimation(true);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Whether the panel is showing, or, if it's animating, whether it will be
|
||||
* when the animation is done.
|
||||
*/
|
||||
public boolean isShowing() {
|
||||
return mShowing;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVisibilityChanged(View v, int vis) {
|
||||
super.onVisibilityChanged(v, vis);
|
||||
// when we hide, put back the notifications
|
||||
if (vis != View.VISIBLE) {
|
||||
if (mSettingsView != null) removeSettingsView();
|
||||
mNotificationScroller.setVisibility(View.VISIBLE);
|
||||
mNotificationScroller.setAlpha(1f);
|
||||
mNotificationScroller.scrollTo(0, 0);
|
||||
updatePanelModeButtons();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchHoverEvent(MotionEvent event) {
|
||||
// Ignore hover events outside of this panel bounds since such events
|
||||
// generate spurious accessibility events with the panel content when
|
||||
// tapping outside of it, thus confusing the user.
|
||||
final int x = (int) event.getX();
|
||||
final int y = (int) event.getY();
|
||||
if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) {
|
||||
return super.dispatchHoverEvent(event);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent event) {
|
||||
final int keyCode = event.getKeyCode();
|
||||
switch (keyCode) {
|
||||
// We exclusively handle the back key by hiding this panel.
|
||||
case KeyEvent.KEYCODE_BACK: {
|
||||
if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||
mBar.animateCollapsePanels();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// We react to the home key but let the system handle it.
|
||||
case KeyEvent.KEYCODE_HOME: {
|
||||
if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||
mBar.animateCollapsePanels();
|
||||
}
|
||||
} break;
|
||||
}
|
||||
return super.dispatchKeyEvent(event);
|
||||
}
|
||||
|
||||
/*
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||
super.onLayout(changed, l, t, r, b);
|
||||
|
||||
if (DEBUG) Log.d(TAG, String.format("PANEL: onLayout: (%d, %d, %d, %d)", l, t, r, b));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, String.format("PANEL: onSizeChanged: (%d -> %d, %d -> %d)",
|
||||
oldw, w, oldh, h));
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
public void onClick(View v) {
|
||||
if (mSettingsButton.isEnabled() && v == mTitleArea) {
|
||||
swapPanels();
|
||||
}
|
||||
}
|
||||
|
||||
public void setNotificationCount(int n) {
|
||||
mNotificationCount = n;
|
||||
}
|
||||
|
||||
public void setContentFrameVisible(final boolean showing, boolean animate) {
|
||||
}
|
||||
|
||||
public void swapPanels() {
|
||||
final View toShow, toHide;
|
||||
if (mSettingsView == null) {
|
||||
addSettingsView();
|
||||
toShow = mSettingsView;
|
||||
toHide = mNotificationScroller;
|
||||
} else {
|
||||
toShow = mNotificationScroller;
|
||||
toHide = mSettingsView;
|
||||
}
|
||||
Animator a = ObjectAnimator.ofFloat(toHide, "alpha", 1f, 0f)
|
||||
.setDuration(PANEL_FADE_DURATION);
|
||||
a.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator _a) {
|
||||
toHide.setVisibility(View.GONE);
|
||||
if (toShow != null) {
|
||||
toShow.setVisibility(View.VISIBLE);
|
||||
if (toShow == mSettingsView || mNotificationCount > 0) {
|
||||
ObjectAnimator.ofFloat(toShow, "alpha", 0f, 1f)
|
||||
.setDuration(PANEL_FADE_DURATION)
|
||||
.start();
|
||||
}
|
||||
|
||||
if (toHide == mSettingsView) {
|
||||
removeSettingsView();
|
||||
}
|
||||
}
|
||||
updateClearButton();
|
||||
updatePanelModeButtons();
|
||||
}
|
||||
});
|
||||
a.start();
|
||||
}
|
||||
|
||||
public void updateClearButton() {
|
||||
if (mBar != null) {
|
||||
final boolean showX
|
||||
= (isShowing()
|
||||
&& mHasClearableNotifications
|
||||
&& mNotificationScroller.getVisibility() == View.VISIBLE);
|
||||
getClearButton().setVisibility(showX ? View.VISIBLE : View.INVISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
public void setClearable(boolean clearable) {
|
||||
mHasClearableNotifications = clearable;
|
||||
}
|
||||
|
||||
public void updatePanelModeButtons() {
|
||||
final boolean settingsVisible = (mSettingsView != null);
|
||||
mSettingsButton.setVisibility(!settingsVisible && mSettingsButton.isEnabled() ? View.VISIBLE : View.GONE);
|
||||
mNotificationButton.setVisibility(settingsVisible ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
public boolean isInContentArea(int x, int y) {
|
||||
mContentArea.left = mContentFrame.getLeft() + mContentFrame.getPaddingLeft();
|
||||
mContentArea.top = mContentFrame.getTop() + mContentFrame.getPaddingTop()
|
||||
+ (int)mContentParent.getTranslationY(); // account for any adjustment
|
||||
mContentArea.right = mContentFrame.getRight() - mContentFrame.getPaddingRight();
|
||||
mContentArea.bottom = mContentFrame.getBottom() - mContentFrame.getPaddingBottom();
|
||||
|
||||
offsetDescendantRectToMyCoords(mContentParent, mContentArea);
|
||||
return mContentArea.contains(x, y);
|
||||
}
|
||||
|
||||
void removeSettingsView() {
|
||||
if (mSettingsView != null) {
|
||||
mContentFrame.removeView(mSettingsView);
|
||||
mSettingsView = null;
|
||||
}
|
||||
}
|
||||
|
||||
// NB: it will be invisible until you show it
|
||||
void addSettingsView() {
|
||||
LayoutInflater infl = LayoutInflater.from(getContext());
|
||||
mSettingsView = infl.inflate(R.layout.system_bar_settings_view, mContentFrame, false);
|
||||
mSettingsView.setVisibility(View.GONE);
|
||||
mContentFrame.addView(mSettingsView);
|
||||
}
|
||||
|
||||
private class Choreographer implements Animator.AnimatorListener {
|
||||
boolean mVisible;
|
||||
int mPanelHeight;
|
||||
AnimatorSet mContentAnim;
|
||||
|
||||
// should group this into a multi-property animation
|
||||
final static int OPEN_DURATION = 250;
|
||||
final static int CLOSE_DURATION = 250;
|
||||
|
||||
// the panel will start to appear this many px from the end
|
||||
final int HYPERSPACE_OFFRAMP = 200;
|
||||
|
||||
Choreographer() {
|
||||
}
|
||||
|
||||
void createAnimation(boolean appearing) {
|
||||
// mVisible: previous state; appearing: new state
|
||||
|
||||
float start, end;
|
||||
|
||||
// 0: on-screen
|
||||
// height: off-screen
|
||||
float y = mContentParent.getTranslationY();
|
||||
if (appearing) {
|
||||
// we want to go from near-the-top to the top, unless we're half-open in the right
|
||||
// general vicinity
|
||||
end = 0;
|
||||
if (mNotificationCount == 0) {
|
||||
end += mContentFrameMissingTranslation;
|
||||
}
|
||||
start = HYPERSPACE_OFFRAMP+end;
|
||||
} else {
|
||||
start = y;
|
||||
end = y + HYPERSPACE_OFFRAMP;
|
||||
}
|
||||
|
||||
Animator posAnim = ObjectAnimator.ofFloat(mContentParent, "translationY",
|
||||
start, end);
|
||||
posAnim.setInterpolator(appearing ? sDecelerateInterpolator : sAccelerateInterpolator);
|
||||
|
||||
if (mContentAnim != null && mContentAnim.isRunning()) {
|
||||
mContentAnim.cancel();
|
||||
}
|
||||
|
||||
Animator fadeAnim = ObjectAnimator.ofFloat(mContentParent, "alpha",
|
||||
appearing ? 1.0f : 0.0f);
|
||||
fadeAnim.setInterpolator(appearing ? sAccelerateInterpolator : sDecelerateInterpolator);
|
||||
|
||||
mContentAnim = new AnimatorSet();
|
||||
mContentAnim
|
||||
.play(fadeAnim)
|
||||
.with(posAnim)
|
||||
;
|
||||
mContentAnim.setDuration((DEBUG?10:1)*(appearing ? OPEN_DURATION : CLOSE_DURATION));
|
||||
mContentAnim.addListener(this);
|
||||
}
|
||||
|
||||
void startAnimation(boolean appearing) {
|
||||
if (DEBUG) Log.d(TAG, "startAnimation(appearing=" + appearing + ")");
|
||||
|
||||
createAnimation(appearing);
|
||||
mContentAnim.start();
|
||||
|
||||
mVisible = appearing;
|
||||
|
||||
// we want to start disappearing promptly
|
||||
if (!mVisible) updateClearButton();
|
||||
}
|
||||
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
if (DEBUG) Log.d(TAG, "onAnimationCancel");
|
||||
}
|
||||
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
if (DEBUG) Log.d(TAG, "onAnimationEnd");
|
||||
if (! mVisible) {
|
||||
setVisibility(View.GONE);
|
||||
}
|
||||
mContentParent.setLayerType(View.LAYER_TYPE_NONE, null);
|
||||
mContentAnim = null;
|
||||
|
||||
// we want to show the X lazily
|
||||
if (mVisible) updateClearButton();
|
||||
}
|
||||
|
||||
public void onAnimationRepeat(Animator animation) {
|
||||
}
|
||||
|
||||
public void onAnimationStart(Animator animation) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||
MotionEvent cancellation = MotionEvent.obtain(ev);
|
||||
cancellation.setAction(MotionEvent.ACTION_CANCEL);
|
||||
|
||||
boolean intercept = mExpandHelper.onInterceptTouchEvent(ev) ||
|
||||
super.onInterceptTouchEvent(ev);
|
||||
if (intercept) {
|
||||
latestItems.onInterceptTouchEvent(cancellation);
|
||||
}
|
||||
return intercept;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent ev) {
|
||||
boolean handled = mExpandHelper.onTouchEvent(ev) ||
|
||||
super.onTouchEvent(ev);
|
||||
return handled;
|
||||
}
|
||||
|
||||
public void setSettingsEnabled(boolean settingsEnabled) {
|
||||
if (mSettingsButton != null) {
|
||||
mSettingsButton.setEnabled(settingsEnabled);
|
||||
mSettingsButton.setVisibility(settingsEnabled ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
public void refreshLayout(int layoutDirection) {
|
||||
// Force asset reloading
|
||||
mSettingsButton.setImageDrawable(null);
|
||||
mSettingsButton.setImageResource(R.drawable.ic_notify_settings);
|
||||
|
||||
// Force asset reloading
|
||||
mNotificationButton.setImageDrawable(null);
|
||||
mNotificationButton.setImageResource(R.drawable.ic_notifications);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 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.tablet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.SoundEffectConstants;
|
||||
import android.view.View;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.widget.RelativeLayout;
|
||||
|
||||
import com.android.systemui.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
||||
public class NotificationPanelTitle extends RelativeLayout implements View.OnClickListener {
|
||||
private NotificationPanel mPanel;
|
||||
private ArrayList<View> buttons;
|
||||
private View mSettingsButton;
|
||||
|
||||
public NotificationPanelTitle(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
buttons = new ArrayList<View>();
|
||||
setOnClickListener(this);
|
||||
}
|
||||
|
||||
public void setPanel(NotificationPanel p) {
|
||||
mPanel = p;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
buttons.add(mSettingsButton = findViewById(R.id.settings_button));
|
||||
buttons.add(findViewById(R.id.notification_button));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPressed(boolean pressed) {
|
||||
super.setPressed(pressed);
|
||||
for (View button : buttons) {
|
||||
if (button != null) {
|
||||
button.setPressed(pressed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent e) {
|
||||
if (!mSettingsButton.isEnabled())
|
||||
return false;
|
||||
switch (e.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
setPressed(true);
|
||||
break;
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
final int x = (int) e.getX();
|
||||
final int y = (int) e.getY();
|
||||
setPressed(x > 0 && x < getWidth() && y > 0 && y < getHeight());
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
if (isPressed()) {
|
||||
playSoundEffect(SoundEffectConstants.CLICK);
|
||||
mPanel.swapPanels();
|
||||
setPressed(false);
|
||||
}
|
||||
break;
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
setPressed(false);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mSettingsButton.isEnabled() && v == this) {
|
||||
mPanel.swapPanels();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
|
||||
if (super.onRequestSendAccessibilityEvent(child, event)) {
|
||||
AccessibilityEvent record = AccessibilityEvent.obtain();
|
||||
onInitializeAccessibilityEvent(record);
|
||||
dispatchPopulateAccessibilityEvent(record);
|
||||
event.appendRecord(record);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.widget.RelativeLayout;
|
||||
|
||||
public class NotificationPeekPanel extends RelativeLayout implements StatusBarPanel {
|
||||
TabletStatusBar mBar;
|
||||
|
||||
public NotificationPeekPanel(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public NotificationPeekPanel(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
public boolean isInContentArea(int x, int y) {
|
||||
final int l = getPaddingLeft();
|
||||
final int r = getWidth() - getPaddingRight();
|
||||
final int t = getPaddingTop();
|
||||
final int b = getHeight() - getPaddingBottom();
|
||||
return x >= l && x < r && y >= t && y < b;
|
||||
}
|
||||
|
||||
public void setBar(TabletStatusBar bar) {
|
||||
mBar = bar;
|
||||
}
|
||||
|
||||
// We don't really want to intercept the touch event, but we *do* want to reset the fade timer
|
||||
// in case the user is interacting with some custom controls or something.
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||
mBar.resetNotificationPeekFadeTimer();
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchHoverEvent(MotionEvent event) {
|
||||
// Ignore hover events outside of this panel bounds since such events
|
||||
// generate spurious accessibility events with the panel content when
|
||||
// tapping outside of it, thus confusing the user.
|
||||
final int x = (int) event.getX();
|
||||
final int y = (int) event.getY();
|
||||
if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) {
|
||||
return super.dispatchHoverEvent(event);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
* 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.tablet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
public class PanelBackgroundView extends View {
|
||||
/*
|
||||
private Bitmap mTexture;
|
||||
private Paint mPaint;
|
||||
private int mTextureWidth;
|
||||
private int mTextureHeight;
|
||||
*/
|
||||
|
||||
public PanelBackgroundView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
/*
|
||||
mTexture = BitmapFactory.decodeResource(getResources(),
|
||||
com.android.internal.R.drawable.status_bar_background);
|
||||
mTextureWidth = mTexture.getWidth();
|
||||
mTextureHeight = mTexture.getHeight();
|
||||
|
||||
mPaint = new Paint();
|
||||
mPaint.setDither(false);
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDraw(Canvas canvas) {
|
||||
/*
|
||||
final Bitmap texture = mTexture;
|
||||
final Paint paint = mPaint;
|
||||
|
||||
final int width = getWidth();
|
||||
final int height = getHeight();
|
||||
|
||||
final int textureWidth = mTextureWidth;
|
||||
final int textureHeight = mTextureHeight;
|
||||
|
||||
int x = 0;
|
||||
int y;
|
||||
|
||||
while (x < width) {
|
||||
y = 0;
|
||||
while (y < height) {
|
||||
canvas.drawBitmap(texture, x, y, paint);
|
||||
y += textureHeight;
|
||||
}
|
||||
x += textureWidth;
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.app.StatusBarManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.settings.BrightnessController;
|
||||
import com.android.systemui.settings.ToggleSlider;
|
||||
import com.android.systemui.statusbar.policy.AirplaneModeController;
|
||||
import com.android.systemui.statusbar.policy.DoNotDisturbController;
|
||||
import com.android.systemui.statusbar.policy.RotationLockController;
|
||||
|
||||
public class SettingsView extends LinearLayout implements View.OnClickListener {
|
||||
static final String TAG = "SettingsView";
|
||||
|
||||
AirplaneModeController mAirplane;
|
||||
RotationLockController mRotationController;
|
||||
BrightnessController mBrightness;
|
||||
DoNotDisturbController mDoNotDisturb;
|
||||
View mRotationLockContainer;
|
||||
View mRotationLockSeparator;
|
||||
|
||||
public SettingsView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public SettingsView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
final Context context = getContext();
|
||||
|
||||
mAirplane = new AirplaneModeController(context,
|
||||
(CompoundButton)findViewById(R.id.airplane_checkbox));
|
||||
findViewById(R.id.network).setOnClickListener(this);
|
||||
|
||||
mRotationLockContainer = findViewById(R.id.rotate);
|
||||
mRotationLockSeparator = findViewById(R.id.rotate_separator);
|
||||
mRotationController = new RotationLockController(context);
|
||||
mRotationController.addRotationLockControllerCallback(
|
||||
new RotationLockController.RotationLockControllerCallback() {
|
||||
@Override
|
||||
public void onRotationLockStateChanged(boolean locked, boolean visible) {
|
||||
mRotationLockContainer.setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||
mRotationLockSeparator.setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
});
|
||||
CompoundButton rotateCheckbox = (CompoundButton) findViewById(R.id.rotate_checkbox);
|
||||
rotateCheckbox.setChecked(!mRotationController.isRotationLocked());
|
||||
rotateCheckbox.setVisibility(mRotationController.isRotationLockAffordanceVisible()
|
||||
? View.VISIBLE : View.GONE);
|
||||
rotateCheckbox.setOnCheckedChangeListener(new CompoundButton. OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
mRotationController.setRotationLocked(!buttonView.isChecked());
|
||||
}
|
||||
});
|
||||
|
||||
mBrightness = new BrightnessController(context,
|
||||
(ImageView)findViewById(R.id.brightness_icon),
|
||||
(ToggleSlider)findViewById(R.id.brightness));
|
||||
mDoNotDisturb = new DoNotDisturbController(context,
|
||||
(CompoundButton)findViewById(R.id.do_not_disturb_checkbox));
|
||||
findViewById(R.id.settings).setOnClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
mAirplane.release();
|
||||
mDoNotDisturb.release();
|
||||
mRotationController.release();
|
||||
}
|
||||
|
||||
public void onClick(View v) {
|
||||
switch (v.getId()) {
|
||||
case R.id.network:
|
||||
onClickNetwork();
|
||||
break;
|
||||
case R.id.settings:
|
||||
onClickSettings();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private StatusBarManager getStatusBarManager() {
|
||||
return (StatusBarManager)getContext().getSystemService(Context.STATUS_BAR_SERVICE);
|
||||
}
|
||||
|
||||
// Network
|
||||
// ----------------------------
|
||||
private void onClickNetwork() {
|
||||
getContext().startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||
getStatusBarManager().collapsePanels();
|
||||
}
|
||||
|
||||
// Settings
|
||||
// ----------------------------
|
||||
private void onClickSettings() {
|
||||
getContext().startActivityAsUser(new Intent(Settings.ACTION_SETTINGS)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK),
|
||||
new UserHandle(UserHandle.USER_CURRENT));
|
||||
getStatusBarManager().collapsePanels();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,233 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.ClipData;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Point;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.DragEvent;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
|
||||
public class ShirtPocket extends ImageView {
|
||||
private static final boolean DEBUG = false;
|
||||
private static final String TAG = "StatusBar/ShirtPocket";
|
||||
|
||||
private ClipData mClipping = null;
|
||||
|
||||
private ImageView mPreviewIcon;
|
||||
|
||||
public static class DropZone extends View {
|
||||
ShirtPocket mPocket;
|
||||
public DropZone(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
public void setPocket(ShirtPocket p) {
|
||||
mPocket = p;
|
||||
}
|
||||
|
||||
public void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
if (mPocket.holding()) {
|
||||
show(false);
|
||||
} else {
|
||||
hide(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Drag API notes: we must be visible to receive drag events
|
||||
private void show(boolean animate) {
|
||||
setTranslationY(0f);
|
||||
if (animate) {
|
||||
setAlpha(0f);
|
||||
ObjectAnimator.ofFloat(this, "alpha", 0f, 1f).start();
|
||||
} else {
|
||||
setAlpha(1f);
|
||||
}
|
||||
}
|
||||
|
||||
private void hide(boolean animate) {
|
||||
AnimatorListenerAdapter onEnd = new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator _a) {
|
||||
DropZone.this.setTranslationY(getHeight() + 2);
|
||||
DropZone.this.setAlpha(0f);
|
||||
}
|
||||
};
|
||||
if (animate) {
|
||||
Animator a = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), 0f);
|
||||
a.addListener(onEnd);
|
||||
a.start();
|
||||
} else {
|
||||
onEnd.onAnimationEnd(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDragEvent(DragEvent event) {
|
||||
if (DEBUG) Log.d(TAG, "onDragEvent: " + event);
|
||||
switch (event.getAction()) {
|
||||
// We want to appear whenever a potential drag takes off from anywhere in the UI.
|
||||
case DragEvent.ACTION_DRAG_STARTED:
|
||||
show(true);
|
||||
break;
|
||||
case DragEvent.ACTION_DRAG_ENTERED:
|
||||
if (DEBUG) Log.d(TAG, "entered!");
|
||||
// XXX: TODO
|
||||
break;
|
||||
case DragEvent.ACTION_DRAG_EXITED:
|
||||
if (DEBUG) Log.d(TAG, "exited!");
|
||||
break;
|
||||
case DragEvent.ACTION_DROP:
|
||||
if (DEBUG) Log.d(TAG, "dropped!");
|
||||
mPocket.stash(event.getClipData());
|
||||
break;
|
||||
case DragEvent.ACTION_DRAG_ENDED:
|
||||
hide(true);
|
||||
break;
|
||||
}
|
||||
return true; // we want everything, thank you
|
||||
}
|
||||
}
|
||||
|
||||
public ShirtPocket(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
// TODO: "pin area" panel, dragging things out
|
||||
ObjectAnimator mAnimHide, mAnimShow;
|
||||
|
||||
protected void onAttachedToWindow() {
|
||||
}
|
||||
|
||||
public boolean holding() {
|
||||
return (mClipping != null);
|
||||
}
|
||||
|
||||
private void stash(ClipData clipping) {
|
||||
mClipping = clipping;
|
||||
if (mClipping != null) {
|
||||
setVisibility(View.VISIBLE);
|
||||
Bitmap icon = mClipping.getIcon();
|
||||
// mDescription.setText(mClipping.getDescription().getLabel());
|
||||
if (icon != null) {
|
||||
setImageBitmap(icon);
|
||||
} else {
|
||||
if (mClipping.getItemCount() > 0) {
|
||||
// TODO: figure out how to visualize every kind of ClipData!
|
||||
//mAltText.setText(mClipping.getItemAt(0).coerceToText(getContext()));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent ev) {
|
||||
final int action = ev.getAction();
|
||||
if (action == MotionEvent.ACTION_DOWN) {
|
||||
final ClipData clip = mClipping;
|
||||
if (clip != null) {
|
||||
final Bitmap icon = clip.getIcon();
|
||||
DragShadowBuilder shadow;
|
||||
if (icon != null) {
|
||||
shadow = new DragShadowBuilder(this) {
|
||||
public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
|
||||
shadowSize.set(icon.getWidth(), icon.getHeight());
|
||||
shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
|
||||
}
|
||||
public void onDrawShadow(Canvas canvas) {
|
||||
canvas.drawBitmap(icon, 0, 0, new Paint());
|
||||
}
|
||||
};
|
||||
} else {
|
||||
// uhhh, what now?
|
||||
shadow = new DragShadowBuilder(this);
|
||||
}
|
||||
|
||||
startDrag(clip, shadow, null, 0);
|
||||
|
||||
// TODO: only discard the clipping if it was accepted
|
||||
stash(null);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
private boolean isInViewContentArea(View v, int x, int y) {
|
||||
final int l = v.getPaddingLeft();
|
||||
final int r = v.getWidth() - v.getPaddingRight();
|
||||
final int t = v.getPaddingTop();
|
||||
final int b = v.getHeight() - v.getPaddingBottom();
|
||||
return x >= l && x < r && y >= t && y < b;
|
||||
}
|
||||
|
||||
View.OnTouchListener mWindowTouchListener = new View.OnTouchListener() {
|
||||
public boolean onTouch(View v, MotionEvent ev) {
|
||||
final int action = ev.getAction();
|
||||
if (action == MotionEvent.ACTION_OUTSIDE
|
||||
|| (action == MotionEvent.ACTION_DOWN
|
||||
&& !isInViewContentArea(mWindow, (int)ev.getX(), (int)ev.getY()))) {
|
||||
hideWindow();
|
||||
return true;
|
||||
} else if (action == MotionEvent.ACTION_DOWN) {
|
||||
final ClipData clip = mClipping;
|
||||
if (clip != null) {
|
||||
final Bitmap icon = clip.getIcon();
|
||||
DragShadowBuilder shadow;
|
||||
if (icon != null) {
|
||||
shadow = new DragShadowBuilder(v) {
|
||||
public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
|
||||
shadowSize.set(icon.getWidth(), icon.getHeight());
|
||||
shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
|
||||
}
|
||||
public void onDrawShadow(Canvas canvas) {
|
||||
canvas.drawBitmap(icon, 0, 0, new Paint());
|
||||
}
|
||||
};
|
||||
} else {
|
||||
// uhhh, what now?
|
||||
shadow = new DragShadowBuilder(mWindow.findViewById(R.id.preview));
|
||||
}
|
||||
|
||||
v.startDrag(clip, shadow, null, 0);
|
||||
|
||||
// TODO: only discard the clipping if it was accepted
|
||||
stash(null);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
*/
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,146 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.BaseStatusBar;
|
||||
import com.android.systemui.statusbar.DelegateViewHelper;
|
||||
|
||||
public class TabletStatusBarView extends FrameLayout {
|
||||
private Handler mHandler;
|
||||
|
||||
private final int MAX_PANELS = 5;
|
||||
private final View[] mIgnoreChildren = new View[MAX_PANELS];
|
||||
private final View[] mPanels = new View[MAX_PANELS];
|
||||
private final int[] mPos = new int[2];
|
||||
private DelegateViewHelper mDelegateHelper;
|
||||
|
||||
public TabletStatusBarView(Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
public TabletStatusBarView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
mDelegateHelper = new DelegateViewHelper(this);
|
||||
}
|
||||
|
||||
public void setDelegateView(View view) {
|
||||
mDelegateHelper.setDelegateView(view);
|
||||
}
|
||||
|
||||
public void setBar(BaseStatusBar phoneStatusBar) {
|
||||
mDelegateHelper.setBar(phoneStatusBar);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
if (mDelegateHelper != null) {
|
||||
mDelegateHelper.onInterceptTouchEvent(event);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
// Find the view we wish to grab events from in order to detect search gesture.
|
||||
// Depending on the device, this will be one of the id's listed below.
|
||||
// If we don't find one, we'll use the view provided in the constructor above (this view).
|
||||
View view = findViewById(R.id.navigationArea);
|
||||
if (view == null) {
|
||||
view = findViewById(R.id.nav_buttons);
|
||||
}
|
||||
mDelegateHelper.setSourceView(view);
|
||||
mDelegateHelper.setInitialTouchRegion(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
if (TabletStatusBar.DEBUG) {
|
||||
Log.d(TabletStatusBar.TAG, "TabletStatusBarView intercepting touch event: " + ev);
|
||||
}
|
||||
// do not close the recents panel here- the intended behavior is that recents is dismissed
|
||||
// on touch up when clicking on status bar buttons
|
||||
// TODO: should we be closing the notification panel and input methods panel?
|
||||
mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL);
|
||||
mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL);
|
||||
mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_INPUT_METHODS_PANEL);
|
||||
mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_INPUT_METHODS_PANEL);
|
||||
mHandler.removeMessages(TabletStatusBar.MSG_STOP_TICKER);
|
||||
mHandler.sendEmptyMessage(TabletStatusBar.MSG_STOP_TICKER);
|
||||
|
||||
for (int i=0; i < mPanels.length; i++) {
|
||||
if (mPanels[i] != null && mPanels[i].getVisibility() == View.VISIBLE) {
|
||||
if (eventInside(mIgnoreChildren[i], ev)) {
|
||||
if (TabletStatusBar.DEBUG) {
|
||||
Log.d(TabletStatusBar.TAG,
|
||||
"TabletStatusBarView eating event for view: "
|
||||
+ mIgnoreChildren[i]);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (TabletStatusBar.DEBUG) {
|
||||
Log.d(TabletStatusBar.TAG, "TabletStatusBarView not intercepting event");
|
||||
}
|
||||
if (mDelegateHelper != null && mDelegateHelper.onInterceptTouchEvent(ev)) {
|
||||
return true;
|
||||
}
|
||||
return super.onInterceptTouchEvent(ev);
|
||||
}
|
||||
|
||||
private boolean eventInside(View v, MotionEvent ev) {
|
||||
// assume that x and y are window coords because we are.
|
||||
final int x = (int)ev.getX();
|
||||
final int y = (int)ev.getY();
|
||||
|
||||
final int[] p = mPos;
|
||||
v.getLocationInWindow(p);
|
||||
|
||||
final int l = p[0];
|
||||
final int t = p[1];
|
||||
final int r = p[0] + v.getWidth();
|
||||
final int b = p[1] + v.getHeight();
|
||||
|
||||
return x >= l && x < r && y >= t && y < b;
|
||||
}
|
||||
|
||||
public void setHandler(Handler h) {
|
||||
mHandler = h;
|
||||
}
|
||||
|
||||
/**
|
||||
* Let the status bar know that if you tap on ignore while panel is showing, don't do anything.
|
||||
*
|
||||
* Debounces taps on, say, a popup's trigger when the popup is already showing.
|
||||
*/
|
||||
public void setIgnoreChildren(int index, View ignore, View panel) {
|
||||
mIgnoreChildren[index] = ignore;
|
||||
mPanels[index] = panel;
|
||||
}
|
||||
}
|
||||
@@ -1,335 +0,0 @@
|
||||
/*
|
||||
* 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.animation.LayoutTransition;
|
||||
import android.app.Notification;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.internal.statusbar.StatusBarIcon;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.StatusBarIconView;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class TabletTicker
|
||||
extends Handler
|
||||
implements LayoutTransition.TransitionListener {
|
||||
|
||||
private static final String TAG = "StatusBar.TabletTicker";
|
||||
|
||||
private static final boolean CLICKABLE_TICKER = true;
|
||||
|
||||
// 3 is enough to let us see most cases, but not get so far behind that it's too annoying.
|
||||
private static final int QUEUE_LENGTH = 3;
|
||||
|
||||
private static final int MSG_ADVANCE = 1;
|
||||
|
||||
private static final int ADVANCE_DELAY = 5000; // 5 seconds
|
||||
|
||||
private final Context mContext;
|
||||
private final WindowManager mWindowManager;
|
||||
|
||||
private ViewGroup mWindow;
|
||||
private IBinder mCurrentKey;
|
||||
private StatusBarNotification mCurrentNotification;
|
||||
private View mCurrentView;
|
||||
|
||||
private IBinder[] mKeys = new IBinder[QUEUE_LENGTH];
|
||||
private StatusBarNotification[] mQueue = new StatusBarNotification[QUEUE_LENGTH];
|
||||
private int mQueuePos;
|
||||
|
||||
private final int mLargeIconHeight;
|
||||
|
||||
private TabletStatusBar mBar;
|
||||
|
||||
private LayoutTransition mLayoutTransition;
|
||||
private boolean mWindowShouldClose;
|
||||
|
||||
public TabletTicker(TabletStatusBar bar) {
|
||||
mBar = bar;
|
||||
mContext = bar.getContext();
|
||||
mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
|
||||
final Resources res = mContext.getResources();
|
||||
mLargeIconHeight = res.getDimensionPixelSize(
|
||||
android.R.dimen.notification_large_icon_height);
|
||||
}
|
||||
|
||||
public void add(IBinder key, StatusBarNotification notification) {
|
||||
if (false) {
|
||||
Log.d(TAG, "add 1 mCurrentNotification=" + mCurrentNotification
|
||||
+ " mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue));
|
||||
}
|
||||
|
||||
// If it's already in here, remove whatever's in there and put the new one at the end.
|
||||
remove(key, false);
|
||||
|
||||
mKeys[mQueuePos] = key;
|
||||
mQueue[mQueuePos] = notification;
|
||||
|
||||
// If nothing is running now, start the next one.
|
||||
if (mQueuePos == 0 && mCurrentNotification == null) {
|
||||
sendEmptyMessage(MSG_ADVANCE);
|
||||
}
|
||||
|
||||
if (mQueuePos < QUEUE_LENGTH - 1) {
|
||||
mQueuePos++;
|
||||
}
|
||||
}
|
||||
|
||||
public void remove(IBinder key) {
|
||||
remove(key, true);
|
||||
}
|
||||
|
||||
public void remove(IBinder key, boolean advance) {
|
||||
if (mCurrentKey == key) {
|
||||
// Showing now
|
||||
if (advance) {
|
||||
removeMessages(MSG_ADVANCE);
|
||||
sendEmptyMessage(MSG_ADVANCE);
|
||||
}
|
||||
} else {
|
||||
// In the queue
|
||||
for (int i=0; i<QUEUE_LENGTH; i++) {
|
||||
if (mKeys[i] == key) {
|
||||
for (; i<QUEUE_LENGTH-1; i++) {
|
||||
mKeys[i] = mKeys[i+1];
|
||||
mQueue[i] = mQueue[i+1];
|
||||
}
|
||||
mKeys[QUEUE_LENGTH-1] = null;
|
||||
mQueue[QUEUE_LENGTH-1] = null;
|
||||
if (mQueuePos > 0) {
|
||||
mQueuePos--;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void halt() {
|
||||
removeMessages(MSG_ADVANCE);
|
||||
if (mCurrentView != null || mQueuePos != 0) {
|
||||
for (int i=0; i<QUEUE_LENGTH; i++) {
|
||||
mKeys[i] = null;
|
||||
mQueue[i] = null;
|
||||
}
|
||||
mQueuePos = 0;
|
||||
sendEmptyMessage(MSG_ADVANCE);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case MSG_ADVANCE:
|
||||
advance();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void advance() {
|
||||
// Out with the old...
|
||||
if (mCurrentView != null) {
|
||||
if (mWindow != null) {
|
||||
mWindow.removeView(mCurrentView);
|
||||
}
|
||||
mCurrentView = null;
|
||||
mCurrentKey = null;
|
||||
mCurrentNotification = null;
|
||||
}
|
||||
|
||||
// In with the new...
|
||||
dequeue();
|
||||
while (mCurrentNotification != null) {
|
||||
mCurrentView = makeTickerView(mCurrentNotification);
|
||||
if (mCurrentView != null) {
|
||||
if (mWindow == null) {
|
||||
mWindow = makeWindow();
|
||||
mWindowManager.addView(mWindow, mWindow.getLayoutParams());
|
||||
}
|
||||
|
||||
mWindow.addView(mCurrentView);
|
||||
sendEmptyMessageDelayed(MSG_ADVANCE, ADVANCE_DELAY);
|
||||
break;
|
||||
}
|
||||
dequeue();
|
||||
}
|
||||
|
||||
// if there's nothing left, close the window
|
||||
mWindowShouldClose = (mCurrentView == null && mWindow != null);
|
||||
}
|
||||
|
||||
private void dequeue() {
|
||||
mCurrentKey = mKeys[0];
|
||||
mCurrentNotification = mQueue[0];
|
||||
if (false) {
|
||||
Log.d(TAG, "dequeue mQueuePos=" + mQueuePos + " mQueue=" + Arrays.toString(mQueue));
|
||||
}
|
||||
final int N = mQueuePos;
|
||||
for (int i=0; i<N; i++) {
|
||||
mKeys[i] = mKeys[i+1];
|
||||
mQueue[i] = mQueue[i+1];
|
||||
}
|
||||
mKeys[N] = null;
|
||||
mQueue[N] = null;
|
||||
if (mQueuePos > 0) {
|
||||
mQueuePos--;
|
||||
}
|
||||
}
|
||||
|
||||
private ViewGroup makeWindow() {
|
||||
final Resources res = mContext.getResources();
|
||||
final FrameLayout view = new FrameLayout(mContext);
|
||||
final int width = res.getDimensionPixelSize(R.dimen.notification_ticker_width);
|
||||
int windowFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
|
||||
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|
||||
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
|
||||
if (CLICKABLE_TICKER) {
|
||||
windowFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
|
||||
} else {
|
||||
windowFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
|
||||
}
|
||||
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(width, mLargeIconHeight,
|
||||
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, windowFlags,
|
||||
PixelFormat.TRANSLUCENT);
|
||||
lp.gravity = Gravity.BOTTOM | Gravity.END;
|
||||
// lp.windowAnimations = com.android.internal.R.style.Animation_Toast;
|
||||
|
||||
mLayoutTransition = new LayoutTransition();
|
||||
mLayoutTransition.addTransitionListener(this);
|
||||
view.setLayoutTransition(mLayoutTransition);
|
||||
lp.setTitle("NotificationTicker");
|
||||
view.setLayoutParams(lp);
|
||||
return view;
|
||||
}
|
||||
|
||||
public void startTransition(LayoutTransition transition, ViewGroup container,
|
||||
View view, int transitionType) {}
|
||||
|
||||
public void endTransition(LayoutTransition transition, ViewGroup container,
|
||||
View view, int transitionType) {
|
||||
if (mWindowShouldClose) {
|
||||
mWindowManager.removeView(mWindow);
|
||||
mWindow = null;
|
||||
mWindowShouldClose = false;
|
||||
mBar.doneTicking();
|
||||
}
|
||||
}
|
||||
|
||||
private View makeTickerView(StatusBarNotification notification) {
|
||||
final Notification n = notification.getNotification();
|
||||
|
||||
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(
|
||||
Context.LAYOUT_INFLATER_SERVICE);
|
||||
|
||||
ViewGroup group;
|
||||
int layoutId;
|
||||
int iconId;
|
||||
if (n.largeIcon != null) {
|
||||
iconId = R.id.right_icon;
|
||||
} else {
|
||||
iconId = R.id.left_icon;
|
||||
}
|
||||
if (n.tickerView != null) {
|
||||
group = (ViewGroup)inflater.inflate(R.layout.system_bar_ticker_panel, null, false);
|
||||
ViewGroup content = (FrameLayout) group.findViewById(R.id.ticker_expanded);
|
||||
View expanded = null;
|
||||
Exception exception = null;
|
||||
try {
|
||||
expanded = n.tickerView.apply(mContext, content);
|
||||
}
|
||||
catch (RuntimeException e) {
|
||||
exception = e;
|
||||
}
|
||||
if (expanded == null) {
|
||||
final String ident = notification.getPackageName()
|
||||
+ "/0x" + Integer.toHexString(notification.getId());
|
||||
Log.e(TAG, "couldn't inflate view for notification " + ident, exception);
|
||||
return null;
|
||||
}
|
||||
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
content.addView(expanded, lp);
|
||||
} else if (n.tickerText != null) {
|
||||
group = (ViewGroup)inflater.inflate(R.layout.system_bar_ticker_compat, mWindow, false);
|
||||
final Drawable icon = StatusBarIconView.getIcon(mContext,
|
||||
new StatusBarIcon(notification.getPackageName(), notification.getUser(), n.icon, n.iconLevel, 0,
|
||||
n.tickerText));
|
||||
ImageView iv = (ImageView)group.findViewById(iconId);
|
||||
iv.setImageDrawable(icon);
|
||||
iv.setVisibility(View.VISIBLE);
|
||||
TextView tv = (TextView)group.findViewById(R.id.text);
|
||||
tv.setText(n.tickerText);
|
||||
} else {
|
||||
throw new RuntimeException("tickerView==null && tickerText==null");
|
||||
}
|
||||
ImageView largeIcon = (ImageView)group.findViewById(R.id.large_icon);
|
||||
if (n.largeIcon != null) {
|
||||
largeIcon.setImageBitmap(n.largeIcon);
|
||||
largeIcon.setVisibility(View.VISIBLE);
|
||||
final ViewGroup.LayoutParams lp = largeIcon.getLayoutParams();
|
||||
final int statusBarHeight = mBar.getStatusBarHeight();
|
||||
if (n.largeIcon.getHeight() <= statusBarHeight) {
|
||||
// for smallish largeIcons, it looks a little odd to have them floating halfway up
|
||||
// the ticker, so we vertically center them in the status bar area instead
|
||||
lp.height = statusBarHeight;
|
||||
} else {
|
||||
lp.height = mLargeIconHeight;
|
||||
}
|
||||
largeIcon.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
if (CLICKABLE_TICKER) {
|
||||
PendingIntent contentIntent = notification.getNotification().contentIntent;
|
||||
if (contentIntent != null) {
|
||||
// create the usual notification clicker, but chain it together with a halt() call
|
||||
// to abort the ticker too
|
||||
final View.OnClickListener clicker = mBar.makeClicker(contentIntent,
|
||||
notification.getPackageName(), notification.getTag(), notification.getId());
|
||||
group.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
halt();
|
||||
clicker.onClick(v);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
group.setOnClickListener(null);
|
||||
}
|
||||
}
|
||||
|
||||
return group;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user