Merge "Material design for screen pinning cling" into lmp-mr1-dev
diff --git a/core/res/res/layout/lock_to_app_checkbox.xml b/core/res/res/layout/lock_to_app_checkbox.xml
deleted file mode 100644
index 890507b..0000000
--- a/core/res/res/layout/lock_to_app_checkbox.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/res/layout/alert_dialog.xml
-**
-** Copyright 2014, 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_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="15dip"
- android:paddingBottom="0dip"
- android:paddingStart="12dip"
- android:paddingEnd="25dip"
- >
-
- <CheckBox
- android:id="@+id/lock_to_app_checkbox"
- style="?android:attr/textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
-
-</FrameLayout>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 9e25ee2..fe87919 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4856,16 +4856,6 @@
<string name="lock_to_app_toast_accessible">To unpin this screen, touch and hold Overview.</string>
<!-- Notify user that they are locked in lock-to-app mode -->
<string name="lock_to_app_toast_locked">Screen is pinned. Unpinning isn\'t allowed by your organization.</string>
- <!-- Lock-to-app dialog title. -->
- <string name="lock_to_app_title">Use screen pinning?</string>
- <!-- Lock-to-app dialog description. -->
- <string name="lock_to_app_description">Screen pinning locks the display in a single view.\n\nTo unpin, touch and hold Back and Overview at the same time.</string>
- <!-- Lock-to-app dialog description when in accessibility mode. -->
- <string name="lock_to_app_description_accessible">Screen pinning locks the display in a single view.\n\nTo unpin, touch and hold Overview.</string>
- <!-- Lock-to-app negative response. -->
- <string name="lock_to_app_negative">NO, THANKS</string>
- <!-- Lock-to-app positive response. -->
- <string name="lock_to_app_positive">START</string>
<!-- Starting lock-to-app indication. -->
<string name="lock_to_app_start">Screen pinned</string>
<!-- Exting lock-to-app indication. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 5ab4078..24c24f8 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -668,13 +668,6 @@
<java-symbol type="string" name="lock_to_app_toast" />
<java-symbol type="string" name="lock_to_app_toast_accessible" />
<java-symbol type="string" name="lock_to_app_toast_locked" />
- <java-symbol type="string" name="lock_to_app_title" />
- <java-symbol type="string" name="lock_to_app_description" />
- <java-symbol type="string" name="lock_to_app_description_accessible" />
- <java-symbol type="string" name="lock_to_app_negative" />
- <java-symbol type="string" name="lock_to_app_positive" />
- <java-symbol type="layout" name="lock_to_app_checkbox" />
- <java-symbol type="id" name="lock_to_app_checkbox" />
<java-symbol type="string" name="lock_to_app_start" />
<java-symbol type="string" name="lock_to_app_exit" />
<java-symbol type="string" name="lock_to_app_unlock_pin" />
diff --git a/packages/SystemUI/res/drawable/screen_pinning_bg_circ.xml b/packages/SystemUI/res/drawable/screen_pinning_bg_circ.xml
new file mode 100644
index 0000000..354b8bd
--- /dev/null
+++ b/packages/SystemUI/res/drawable/screen_pinning_bg_circ.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2014, 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.
+ */
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval" >
+
+ <solid android:color="@color/system_accent_color" />
+
+ <size
+ android:height="@dimen/screen_pinning_nav_highlight_size"
+ android:width="@dimen/screen_pinning_nav_highlight_size" />
+
+</shape>
diff --git a/packages/SystemUI/res/drawable/screen_pinning_light_bg_circ.xml b/packages/SystemUI/res/drawable/screen_pinning_light_bg_circ.xml
new file mode 100644
index 0000000..9e83057
--- /dev/null
+++ b/packages/SystemUI/res/drawable/screen_pinning_light_bg_circ.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2014, 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.
+ */
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval" >
+
+ <solid android:color="@color/screen_pinning_nav_icon_highlight_outer" />
+
+ <size
+ android:height="@dimen/screen_pinning_nav_highlight_outer_size"
+ android:width="@dimen/screen_pinning_nav_highlight_outer_size" />
+
+</shape>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request.xml b/packages/SystemUI/res/layout/screen_pinning_request.xml
new file mode 100644
index 0000000..fea45cc
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2014, 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="@dimen/screen_pinning_request_width"
+ android:layout_height="wrap_content"
+ android:gravity="bottom|center_horizontal"
+ android:layoutDirection="ltr"
+ android:orientation="vertical" >
+
+ <include
+ android:layout_width="@dimen/screen_pinning_request_width"
+ android:layout_height="wrap_content"
+ layout="@layout/screen_pinning_request_text_area" />
+
+ <View
+ android:id="@+id/spacer"
+ android:layout_width="@dimen/screen_pinning_request_width"
+ android:layout_height="18dp"
+ android:background="@color/screen_pinning_request_bg" />
+
+ <include
+ android:layout_width="@dimen/screen_pinning_request_width"
+ android:layout_height="wrap_content"
+ layout="@layout/screen_pinning_request_buttons" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
new file mode 100644
index 0000000..224a0a0
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2014, 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.
+ */
+-->
+<!--
+ This layout matches the structure of navigation_bar.xml and will need
+ to be kept up to sync with changes there.
+ On sw600dp, dimensions are changed to be large enough such that the
+ empty views between the buttons is reduced to nothing, if (nav bar)
+ sw600dp layout is changed then this will likely have to be adjusted
+ and possibly need a sw600dp specific one.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/screen_pinning_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/screen_pinning_request_button_height"
+ android:background="@color/screen_pinning_request_bg" >
+
+ <View
+ android:layout_width="@dimen/screen_pinning_request_side_width"
+ android:layout_height="match_parent"
+ android:layout_weight="0"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_back_group"
+ android:layout_width="@dimen/screen_pinning_request_button_width"
+ android:layout_height="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0"
+ android:paddingStart="@dimen/screen_pinning_request_frame_padding"
+ android:paddingEnd="@dimen/screen_pinning_request_frame_padding" >
+
+ <ImageView
+ android:id="@+id/screen_pinning_back_bg_light"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_light_bg_circ" />
+
+ <ImageView
+ android:id="@+id/screen_pinning_back_bg"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_inner_padding"
+ android:paddingStart="@dimen/screen_pinning_request_inner_padding"
+ android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_bg_circ" />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingStart="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_icon_padding"
+ android:scaleType="center"
+ android:src="@drawable/ic_sysbar_back" />
+ </FrameLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_home_group"
+ android:layout_width="@dimen/screen_pinning_request_button_width"
+ android:layout_height="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0"
+ android:paddingStart="@dimen/screen_pinning_request_frame_padding"
+ android:paddingEnd="@dimen/screen_pinning_request_frame_padding" >
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingStart="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_icon_padding"
+ android:scaleType="center"
+ android:src="@drawable/ic_sysbar_home" />
+ </FrameLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_recents_group"
+ android:layout_width="@dimen/screen_pinning_request_button_width"
+ android:layout_height="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0"
+ android:paddingStart="@dimen/screen_pinning_request_frame_padding"
+ android:paddingEnd="@dimen/screen_pinning_request_frame_padding" >
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_light_bg_circ" />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_inner_padding"
+ android:paddingStart="@dimen/screen_pinning_request_inner_padding"
+ android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_bg_circ" />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingStart="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_icon_padding"
+ android:scaleType="center"
+ android:src="@drawable/ic_sysbar_recent" />
+ </FrameLayout>
+
+ <View
+ android:layout_width="@dimen/screen_pinning_request_side_width"
+ android:layout_height="match_parent"
+ android:layout_weight="0"
+ android:visibility="invisible" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
new file mode 100644
index 0000000..1e5193f
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2014, 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.
+ */
+-->
+<!-- Note all width/height dimensions are switched here to handle landspace
+ rather than duplicating them all.
+ This layout matches the structure of navigation_bar.xml (rot90) and
+ will need to be kept up to sync with changes there.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/screen_pinning_buttons"
+ android:layout_height="match_parent"
+ android:layout_width="@dimen/screen_pinning_request_button_height"
+ android:background="@color/screen_pinning_request_bg"
+ android:orientation="vertical" >
+
+ <View
+ android:layout_height="@dimen/screen_pinning_request_side_width"
+ android:layout_width="match_parent"
+ android:layout_weight="0"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_recents_group"
+ android:layout_height="@dimen/screen_pinning_request_button_width"
+ android:layout_width="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0" >
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_light_bg_circ" />
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="matrix"
+ android:paddingLeft="@dimen/screen_pinning_request_inner_padding"
+ android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_inner_padding"
+ android:src="@drawable/screen_pinning_bg_circ" />
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="center"
+ android:paddingLeft="@dimen/screen_pinning_request_nav_icon_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+ android:src="@drawable/ic_sysbar_recent" />
+ </FrameLayout>
+
+ <View
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_weight="1"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_home_group"
+ android:layout_height="@dimen/screen_pinning_request_button_width"
+ android:layout_width="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0" >
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="center"
+ android:paddingLeft="@dimen/screen_pinning_request_nav_icon_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+ android:src="@drawable/ic_sysbar_home" />
+ </FrameLayout>
+
+ <View
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_weight="1"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_back_group"
+ android:layout_height="@dimen/screen_pinning_request_button_width"
+ android:layout_width="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0" >
+
+ <ImageView
+ android:id="@+id/screen_pinning_back_bg_light"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_light_bg_circ" />
+
+ <ImageView
+ android:id="@+id/screen_pinning_back_bg"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="matrix"
+ android:paddingLeft="@dimen/screen_pinning_request_inner_padding"
+ android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_inner_padding"
+ android:src="@drawable/screen_pinning_bg_circ" />
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="center"
+ android:paddingLeft="@dimen/screen_pinning_request_nav_icon_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+ android:src="@drawable/ic_sysbar_back" />
+ </FrameLayout>
+
+ <View
+ android:layout_height="@dimen/screen_pinning_request_side_width"
+ android:layout_width="match_parent"
+ android:layout_weight="0"
+ android:visibility="invisible" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_land_phone.xml b/packages/SystemUI/res/layout/screen_pinning_request_land_phone.xml
new file mode 100644
index 0000000..e6c22d4
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request_land_phone.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2014, 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_height="@dimen/screen_pinning_request_width"
+ android:layout_width="wrap_content"
+ android:gravity="right|center_vertical"
+ android:orientation="horizontal" >
+
+ <include
+ android:layout_width="360dp"
+ android:layout_height="@dimen/screen_pinning_request_width"
+ layout="@layout/screen_pinning_request_text_area" />
+
+ <include
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/screen_pinning_request_width"
+ layout="@layout/screen_pinning_request_buttons_land" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml b/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml
new file mode 100644
index 0000000..df957f4
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2014, 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:id="@+id/screen_pinning_text_area"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@color/screen_pinning_request_bg"
+ android:gravity="center_vertical" >
+
+ <TextView
+ android:id="@+id/screen_pinning_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingEnd="48dp"
+ android:paddingStart="48dp"
+ android:paddingTop="43dp"
+ android:text="@string/screen_pinning_title"
+ android:textColor="@color/screen_pinning_primary_text"
+ android:textSize="24sp" />
+
+ <TextView
+ android:id="@+id/screen_pinning_description"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/screen_pinning_title"
+ android:paddingEnd="48dp"
+ android:paddingStart="48dp"
+ android:paddingTop="12.6dp"
+ android:text="@string/screen_pinning_description"
+ android:textColor="@color/screen_pinning_primary_text"
+ android:textSize="16sp" />
+
+ <Button
+ android:id="@+id/screen_pinning_ok_button"
+ style="@android:style/Widget.Material.Button"
+ android:layout_width="wrap_content"
+ android:layout_height="36dp"
+ android:layout_alignParentEnd="true"
+ android:layout_below="@+id/screen_pinning_description"
+ android:layout_marginEnd="40dp"
+ android:layout_marginTop="18dp"
+ android:background="@null"
+ android:paddingEnd="8dp"
+ android:paddingStart="8dp"
+ android:text="@string/screen_pinning_positive"
+ android:textColor="@android:color/white"
+ android:textSize="14sp" />
+
+ <Button
+ android:id="@+id/screen_pinning_cancel_button"
+ style="@android:style/Widget.Material.Button"
+ android:layout_width="wrap_content"
+ android:layout_height="36dp"
+ android:layout_alignTop="@id/screen_pinning_ok_button"
+ android:layout_marginEnd="4dp"
+ android:layout_toStartOf="@id/screen_pinning_ok_button"
+ android:background="@null"
+ android:paddingEnd="8dp"
+ android:paddingStart="8dp"
+ android:text="@string/screen_pinning_negative"
+ android:textColor="@android:color/white"
+ android:textSize="14sp" />
+
+</RelativeLayout>
diff --git a/packages/SystemUI/res/values-sw400dp/dimens.xml b/packages/SystemUI/res/values-sw400dp/dimens.xml
index 80e82c4..f19335b 100644
--- a/packages/SystemUI/res/values-sw400dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw400dp/dimens.xml
@@ -23,5 +23,13 @@
navigation_extra_key_width -->
<dimen name="navigation_side_padding">50dp</dimen>
+ <!-- Screen pinning request padding on side of icons
+ (makes the width match the nav bar)-->
+ <dimen name="screen_pinning_request_nav_side_padding">7dp</dimen>
+ <!-- Screen pinning request side views to match nav bar
+ navigation_side_padding - 3 / 2 * (screen_pinning_request_button_width
+ - navigation_key_width) -->
+ <dimen name="screen_pinning_request_side_width">44dp</dimen>
+
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
index 2c22cef..3a62ad9 100644
--- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
@@ -29,4 +29,15 @@
<dimen name="keyguard_clock_notifications_margin_max">36dp</dimen>
<dimen name="keyguard_indication_margin_bottom">80dp</dimen>
+
+ <!-- Screen pinning request width (just a little bit bigger than the three buttons here -->
+ <dimen name="screen_pinning_request_width">490dp</dimen>
+ <!-- Screen pinning request bottom button circle widths -->
+ <dimen name="screen_pinning_request_button_width">162dp</dimen>
+ <!-- Screen pinning request, controls padding on bigger screens, bigger nav bar -->
+ <dimen name="screen_pinning_request_frame_padding">39dp</dimen>
+ <!-- Screen pinning request side views to match nav bar
+ In sw600dp we want the buttons centered so this fills the space,
+ (screen_pinning_request_width - 3 * screen_pinning_request_button_width) / 2 -->
+ <dimen name="screen_pinning_request_side_width">2dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index d3b5580..195fdb1 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -87,4 +87,15 @@
<!-- Margin on the right side of the system icon group on Keyguard. -->
<dimen name="system_icons_keyguard_padding_end">2dp</dimen>
+
+ <!-- Screen pinning request width -->
+ <dimen name="screen_pinning_request_width">400dp</dimen>
+ <!-- Screen pinning request bottom button circle widths -->
+ <dimen name="screen_pinning_request_button_width">128dp</dimen>
+ <!-- Screen pinning request, controls padding on bigger screens, bigger nav bar -->
+ <dimen name="screen_pinning_request_frame_padding">22dp</dimen>
+ <!-- Screen pinning request side views to match nav bar
+ In sw600dp we want the buttons centered so this fills the space,
+ (screen_pinning_request_width - 3 * screen_pinning_request_button_width) / 2 -->
+ <dimen name="screen_pinning_request_side_width">8dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 82dccd2..ea9d3c3 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -123,4 +123,10 @@
<!-- Shadow color for the furthest pixels around the fake shadow for recents. -->
<color name="fake_shadow_end_color">#03000000</color>
+
+ <!-- 25% deep teal 200 -->
+ <color name="screen_pinning_nav_icon_highlight_outer">#4080cbc4</color>
+ <!-- deep teal 500 -->
+ <color name="screen_pinning_request_bg">#ff009688</color>
+ <color name="screen_pinning_request_window_bg">#80000000</color>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 51ef0c3..0edf60f 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -520,4 +520,29 @@
<!-- Padding for signal cluster and battery icon when there are not icons in signal cluster -->
<dimen name="no_signal_cluster_battery_padding">3dp</dimen>
+
+ <!-- Screen pinning request width -->
+ <dimen name="screen_pinning_request_width">@dimen/match_parent</dimen>
+ <!-- Screen pinning request nav button circle heights -->
+ <dimen name="screen_pinning_request_button_height">66dp</dimen>
+ <!-- Screen pinning request nav button circle widths -->
+ <dimen name="screen_pinning_request_button_width">84dp</dimen>
+ <!-- Screen pinning request padding on top of inner circle -->
+ <dimen name="screen_pinning_request_inner_padding">14dp</dimen>
+ <!-- Screen pinning request padding on top of icons -->
+ <dimen name="screen_pinning_request_nav_icon_padding">18dp</dimen>
+ <!-- Screen pinning request padding on side of icons
+ (makes the width match the nav bar)-->
+ <dimen name="screen_pinning_request_nav_side_padding">7dp</dimen>
+ <!-- Screen pinning request side views to match nav bar
+ navigation_side_padding - 3 / 2 * (screen_pinning_request_button_width
+ - navigation_key_width) -->
+ <dimen name="screen_pinning_request_side_width">34dp</dimen>
+ <!-- Screen pinning request controls padding on bigger screens -->
+ <dimen name="screen_pinning_request_frame_padding">0dp</dimen>
+ <!-- Screen pinning inner nav bar circle size -->
+ <dimen name="screen_pinning_nav_highlight_size">56dp</dimen>
+ <!-- Screen pinning inner nav bar outer circle size -->
+ <dimen name="screen_pinning_nav_highlight_outer_size">84dp</dimen>
+
</resources>
diff --git a/packages/SystemUI/res/values/internal.xml b/packages/SystemUI/res/values/internal.xml
index 3b593d2..67685ee 100644
--- a/packages/SystemUI/res/values/internal.xml
+++ b/packages/SystemUI/res/values/internal.xml
@@ -17,5 +17,6 @@
<resources>
<dimen name="status_bar_height">@*android:dimen/status_bar_height</dimen>
<dimen name="navigation_bar_height">@*android:dimen/navigation_bar_height</dimen>
+ <color name="screen_pinning_primary_text">@*android:color/primary_text_default_material_light</color>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 7a0d655..d70f4e3 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -899,4 +899,16 @@
<!-- Accessibility string for current zen mode and selected exit condition. A template that simply concatenates existing mode string and the current condition description. [CHAR LIMIT=20] -->
<string name="zen_mode_and_condition"><xliff:g id="zen_mode" example="Priority interruptions only">%1$s</xliff:g>. <xliff:g id="exit_condition" example="For one hour">%2$s</xliff:g></string>
+
+ <!-- Screen pinning dialog title. -->
+ <string name="screen_pinning_title">Screen is pinned</string>
+ <!-- Screen pinning dialog description. -->
+ <string name="screen_pinning_description">This keeps it in view until you unpin. Touch and hold Back and Overview at the same time to unpin.</string>
+ <!-- Screen pinning dialog description when in accessibility mode. -->
+ <string name="screen_pinning_description_accessible">This keeps it in view until you unpin. Touch and hold Overview to unpin.</string>
+ <!-- Screen pinning positive response. -->
+ <string name="screen_pinning_positive">Got it</string>
+ <!-- Screen pinning negative response. -->
+ <string name="screen_pinning_negative">No thanks</string>
+
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java
new file mode 100644
index 0000000..9e5c2c8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2014 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.animation.ArgbEvaluator;
+import android.animation.ValueAnimator;
+import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Configuration;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
+import android.view.animation.DecelerateInterpolator;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+import com.android.systemui.recents.model.RecentsTaskLoader;
+
+import java.util.ArrayList;
+
+public class ScreenPinningRequest implements View.OnClickListener {
+ private final Context mContext;
+
+ private final AccessibilityManager mAccessibilityService;
+ private final WindowManager mWindowManager;
+
+ private RequestWindowView mRequestWindow;
+
+ public ScreenPinningRequest(Context context) {
+ mContext = context;
+ mAccessibilityService = (AccessibilityManager)
+ mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
+ mWindowManager = (WindowManager)
+ mContext.getSystemService(Context.WINDOW_SERVICE);
+ }
+
+ public void clearPrompt() {
+ if (mRequestWindow != null) {
+ mWindowManager.removeView(mRequestWindow);
+ mRequestWindow = null;
+ }
+ }
+
+ public void showPrompt(boolean allowCancel) {
+ clearPrompt();
+
+ mRequestWindow = new RequestWindowView(mContext, allowCancel);
+
+ mRequestWindow.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+
+ // show the confirmation
+ WindowManager.LayoutParams lp = getWindowLayoutParams();
+ mWindowManager.addView(mRequestWindow, lp);
+ }
+
+ public void onConfigurationChanged() {
+ if (mRequestWindow != null) {
+ mRequestWindow.onConfigurationChanged();
+ }
+ }
+
+ private WindowManager.LayoutParams getWindowLayoutParams() {
+ final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+ 0
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
+ ,
+ PixelFormat.TRANSLUCENT);
+ lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ lp.setTitle("ScreenPinningConfirmation");
+ lp.gravity = Gravity.FILL;
+ return lp;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.screen_pinning_ok_button || mRequestWindow == v) {
+ try {
+ ActivityManagerNative.getDefault().startLockTaskModeOnCurrent();
+ } catch (RemoteException e) {}
+ }
+ clearPrompt();
+ }
+
+ public FrameLayout.LayoutParams getRequestLayoutParams(boolean isLandscape) {
+ return new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ isLandscape ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT)
+ : (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
+ }
+
+ private class RequestWindowView extends FrameLayout {
+ private static final int OFFSET_DP = 96;
+
+ private final ColorDrawable mColor = new ColorDrawable(0);
+ private ValueAnimator mColorAnim;
+ private ViewGroup mLayout;
+ private boolean mShowCancel;
+
+ public RequestWindowView(Context context, boolean showCancel) {
+ super(context);
+ setClickable(true);
+ setOnClickListener(ScreenPinningRequest.this);
+ setBackground(mColor);
+ mShowCancel = showCancel;
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ DisplayMetrics metrics = new DisplayMetrics();
+ mWindowManager.getDefaultDisplay().getMetrics(metrics);
+ float density = metrics.density;
+ boolean isLandscape = isLandscapePhone(mContext);
+
+ inflateView(isLandscape);
+ int bgColor = mContext.getResources().getColor(
+ R.color.screen_pinning_request_window_bg);
+ if (ActivityManager.isHighEndGfx()) {
+ mLayout.setAlpha(0f);
+ if (isLandscape) {
+ mLayout.setTranslationX(OFFSET_DP * density);
+ } else {
+ mLayout.setTranslationY(OFFSET_DP * density);
+ }
+ mLayout.animate()
+ .alpha(1f)
+ .translationX(0)
+ .translationY(0)
+ .setDuration(300)
+ .setInterpolator(new DecelerateInterpolator())
+ .start();
+
+ mColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), 0, bgColor);
+ mColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ final int c = (Integer) animation.getAnimatedValue();
+ mColor.setColor(c);
+ }
+ });
+ mColorAnim.setDuration(1000);
+ mColorAnim.start();
+ } else {
+ mColor.setColor(bgColor);
+ }
+
+ IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED);
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ mContext.registerReceiver(mReceiver, filter);
+ }
+
+ private boolean isLandscapePhone(Context context) {
+ Configuration config = mContext.getResources().getConfiguration();
+ return config.orientation == Configuration.ORIENTATION_LANDSCAPE
+ && config.smallestScreenWidthDp < 600;
+ }
+
+ private void inflateView(boolean isLandscape) {
+ // We only want this landscape orientation on <600dp, so rather than handle
+ // resource overlay for -land and -sw600dp-land, just inflate this
+ // other view for this single case.
+ mLayout = (ViewGroup) View.inflate(getContext(), isLandscape
+ ? R.layout.screen_pinning_request_land_phone : R.layout.screen_pinning_request,
+ null);
+ // Catch touches so they don't trigger cancel/activate, like outside does.
+ mLayout.setClickable(true);
+ // Status bar is always on the right.
+ mLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+ // Buttons and text do switch sides though.
+ View buttons = mLayout.findViewById(R.id.screen_pinning_buttons);
+ buttons.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
+ mLayout.findViewById(R.id.screen_pinning_text_area)
+ .setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
+ swapChildrenIfRtlAndVertical(buttons);
+
+ ((Button) mLayout.findViewById(R.id.screen_pinning_ok_button))
+ .setOnClickListener(ScreenPinningRequest.this);
+ if (mShowCancel) {
+ ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
+ .setOnClickListener(ScreenPinningRequest.this);
+ } else {
+ ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
+ .setVisibility(View.INVISIBLE);
+ }
+
+ final int description = mAccessibilityService.isEnabled()
+ ? R.string.screen_pinning_description_accessible
+ : R.string.screen_pinning_description;
+ ((TextView) mLayout.findViewById(R.id.screen_pinning_description))
+ .setText(description);
+ final int backBgVisibility =
+ mAccessibilityService.isEnabled() ? View.INVISIBLE : View.VISIBLE;
+ mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility);
+ mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility);
+
+ addView(mLayout, getRequestLayoutParams(isLandscape));
+ }
+
+ private void swapChildrenIfRtlAndVertical(View group) {
+ if (mContext.getResources().getConfiguration().getLayoutDirection()
+ != View.LAYOUT_DIRECTION_RTL) {
+ return;
+ }
+ LinearLayout linearLayout = (LinearLayout) group;
+ if (linearLayout.getOrientation() == LinearLayout.VERTICAL) {
+ int childCount = linearLayout.getChildCount();
+ ArrayList<View> childList = new ArrayList<>(childCount);
+ for (int i = 0; i < childCount; i++) {
+ childList.add(linearLayout.getChildAt(i));
+ }
+ linearLayout.removeAllViews();
+ for (int i = childCount - 1; i >= 0; i--) {
+ linearLayout.addView(childList.get(i));
+ }
+ }
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ mContext.unregisterReceiver(mReceiver);
+ }
+
+ protected void onConfigurationChanged() {
+ removeAllViews();
+ inflateView(isLandscapePhone(mContext));
+ }
+
+ private final Runnable mUpdateLayoutRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mLayout != null && mLayout.getParent() != null) {
+ mLayout.setLayoutParams(getRequestLayoutParams(isLandscapePhone(mContext)));
+ }
+ }
+ };
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
+ post(mUpdateLayoutRunnable);
+ } else if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED)
+ || intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
+ clearPrompt();
+ }
+ }
+ };
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index f8d981f..de95ae8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -37,6 +37,7 @@
import android.view.View;
import android.view.ViewStub;
import android.widget.Toast;
+
import com.android.systemui.R;
import com.android.systemui.recents.misc.DebugTrigger;
import com.android.systemui.recents.misc.ReferenceCountedTrigger;
@@ -50,6 +51,8 @@
import com.android.systemui.recents.views.RecentsView;
import com.android.systemui.recents.views.SystemBarScrimViews;
import com.android.systemui.recents.views.ViewAnimation;
+import com.android.systemui.statusbar.phone.PhoneStatusBar;
+import com.android.systemui.SystemUIApplication;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
@@ -82,6 +85,8 @@
// Runnables to finish the Recents activity
FinishRecentsRunnable mFinishLaunchHomeRunnable;
+ private PhoneStatusBar mStatusBar;
+
/**
* A common Runnable to finish Recents either by calling finish() (with a custom animation) or
* launching Home with some ActivityOptions. Generally we always launch home when we exit
@@ -430,6 +435,9 @@
}
});
}
+
+ mStatusBar = ((SystemUIApplication) getApplication())
+ .getComponent(PhoneStatusBar.class);
}
/** Inflates the debug overlay if debug mode is enabled. */
@@ -631,6 +639,13 @@
mFinishLaunchHomeRunnable.run();
}
+ @Override
+ public void onScreenPinningRequest() {
+ if (mStatusBar != null) {
+ mStatusBar.showScreenPinningRequest(false);
+ }
+ }
+
/**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 646d701..51b3fb5 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -495,17 +495,6 @@
}
/**
- * Locks the current task.
- */
- public void lockCurrentTask() {
- if (mIam == null) return;
-
- try {
- mIam.startLockTaskModeOnCurrent();
- } catch (RemoteException e) {}
- }
-
- /**
* Takes a screenshot of the current surface.
*/
public Bitmap takeScreenshot() {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 81ee839..6093584 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -31,6 +31,7 @@
import android.view.View;
import android.view.WindowInsets;
import android.widget.FrameLayout;
+
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -54,6 +55,7 @@
public void onTaskLaunchFailed();
public void onAllTaskViewsDismissed();
public void onExitToHomeAnimationTriggered();
+ public void onScreenPinningRequest();
}
RecentsConfiguration mConfig;
@@ -461,7 +463,7 @@
postDelayed(new Runnable() {
@Override
public void run() {
- ssp.lockCurrentTask();
+ mCb.onScreenPinningRequest();
}
}, 350);
mTriggered = true;
@@ -485,7 +487,7 @@
if (ssp.startActivityFromRecents(getContext(), task.key.id,
task.activityLabel, launchOpts)) {
if (launchOpts == null && lockToTask) {
- ssp.lockCurrentTask();
+ mCb.onScreenPinningRequest();
}
} else {
// Dismiss the task and return the user to home if we fail to
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 1485bde..820aadf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -123,6 +123,7 @@
import com.android.systemui.doze.DozeLog;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.qs.QSPanel;
+import com.android.systemui.recent.ScreenPinningRequest;
import com.android.systemui.statusbar.ActivatableNotificationView;
import com.android.systemui.statusbar.BackDropView;
import com.android.systemui.statusbar.BaseStatusBar;
@@ -356,6 +357,8 @@
? new GestureRecorder("/sdcard/statusbar_gestures.dat")
: null;
+ private ScreenPinningRequest mScreenPinningRequest;
+
private int mNavigationIconHints = 0;
// ensure quick settings is disabled until the current user makes it through the setup wizard
@@ -597,6 +600,8 @@
setControllerUsers();
notifyUserAboutHiddenNotifications();
+
+ mScreenPinningRequest = new ScreenPinningRequest(mContext);
}
// ================================================================================
@@ -3144,6 +3149,7 @@
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
updateShowSearchHoldoff();
updateRowStates();
+ mScreenPinningRequest.onConfigurationChanged();
}
@Override
@@ -4038,7 +4044,16 @@
@Override
public void showScreenPinningRequest() {
- // TODO: Show request.
+ if (mKeyguardMonitor.isShowing()) {
+ // Don't allow apps to trigger this from keyguard.
+ return;
+ }
+ // Show screen pinning request, since this comes from an app, show 'no thanks', button.
+ showScreenPinningRequest(true);
+ }
+
+ public void showScreenPinningRequest(boolean allowCancel) {
+ mScreenPinningRequest.showPrompt(allowCancel);
}
public boolean hasActiveNotifications() {
diff --git a/services/core/java/com/android/server/am/LockToAppRequestDialog.java b/services/core/java/com/android/server/am/LockToAppRequestDialog.java
deleted file mode 100644
index 739fd0a..0000000
--- a/services/core/java/com/android/server/am/LockToAppRequestDialog.java
+++ /dev/null
@@ -1,141 +0,0 @@
-
-package com.android.server.am;
-
-import android.app.AlertDialog;
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.res.Resources;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
-import android.util.Slog;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityManager;
-import android.widget.CheckBox;
-
-import com.android.internal.R;
-import com.android.internal.widget.ILockSettings;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.LockPatternUtilsCache;
-
-public class LockToAppRequestDialog implements OnClickListener {
- private static final String TAG = "ActivityManager";
-
- final private Context mContext;
- final private ActivityManagerService mService;
-
- private AlertDialog mDialog;
- private TaskRecord mRequestedTask;
-
- private CheckBox mCheckbox;
-
- private ILockSettings mLockSettingsService;
-
- private AccessibilityManager mAccessibilityService;
-
- public LockToAppRequestDialog(Context context, ActivityManagerService activityManagerService) {
- mContext = context;
- mAccessibilityService = (AccessibilityManager)
- mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
- mService = activityManagerService;
- }
-
- private ILockSettings getLockSettings() {
- if (mLockSettingsService == null) {
- mLockSettingsService = LockPatternUtilsCache.getInstance(
- ILockSettings.Stub.asInterface(ServiceManager.getService("lock_settings")));
- }
- return mLockSettingsService;
- }
-
- private int getLockString(int userId) {
- try {
- int quality = (int) getLockSettings().getLong(LockPatternUtils.PASSWORD_TYPE_KEY,
- DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, userId);
- switch (quality) {
- case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
- case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
- return R.string.lock_to_app_unlock_pin;
- case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
- case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
- case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
- return R.string.lock_to_app_unlock_password;
- case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
- if (getLockSettings().getBoolean(Settings.Secure.LOCK_PATTERN_ENABLED, false,
- userId)) {
- return R.string.lock_to_app_unlock_pattern;
- }
- }
- } catch (RemoteException e) {
- }
- return 0;
- }
-
- public void clearPrompt() {
- if (mDialog != null) {
- mDialog.dismiss();
- mDialog = null;
- }
- }
-
- public void showLockTaskPrompt(TaskRecord task) {
- clearPrompt();
- mRequestedTask = task;
- final int unlockStringId = getLockString(task.userId);
-
- final Resources r = Resources.getSystem();
- final String description= r.getString(mAccessibilityService.isEnabled()
- ? R.string.lock_to_app_description_accessible
- : R.string.lock_to_app_description);
- AlertDialog.Builder builder = new AlertDialog.Builder(mContext)
- .setTitle(r.getString(R.string.lock_to_app_title))
- .setMessage(description)
- .setPositiveButton(r.getString(R.string.lock_to_app_positive), this)
- .setNegativeButton(r.getString(R.string.lock_to_app_negative), this);
- if (unlockStringId != 0) {
- builder.setView(R.layout.lock_to_app_checkbox);
- }
- mDialog = builder.create();
-
- mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- mDialog.getWindow().getAttributes().privateFlags |=
- WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
- mDialog.show();
-
- if (unlockStringId != 0) {
- String unlockString = mContext.getString(unlockStringId);
- mCheckbox = (CheckBox) mDialog.findViewById(R.id.lock_to_app_checkbox);
- mCheckbox.setText(unlockString);
-
- // Remember state.
- try {
- boolean useLock = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0;
- mCheckbox.setChecked(useLock);
- } catch (SettingNotFoundException e) {
- }
- } else {
- mCheckbox = null;
- }
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (DialogInterface.BUTTON_POSITIVE == which) {
- Slog.d(TAG, "accept lock-to-app request");
- // Set whether to use the lock screen when exiting.
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
- mCheckbox != null && mCheckbox.isChecked() ? 1 : 0);
-
- // Start lock-to-app.
- mService.startLockTaskMode(mRequestedTask);
- } else {
- Slog.d(TAG, "ignore lock-to-app request");
- }
- }
-
-}