Merge "Merge hasFunctors & pushStaging into prepareTree"
diff --git a/api/current.txt b/api/current.txt
index d7664b9..bc02fed 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1132,6 +1132,7 @@
field public static final int textAppearanceLargeInverse = 16842819; // 0x1010043
field public static final int textAppearanceLargePopupMenu = 16843521; // 0x1010301
field public static final int textAppearanceListItem = 16843678; // 0x101039e
+ field public static final int textAppearanceListItemSecondary = 16843838; // 0x101043e
field public static final int textAppearanceListItemSmall = 16843679; // 0x101039f
field public static final int textAppearanceMedium = 16842817; // 0x1010041
field public static final int textAppearanceMediumInverse = 16842820; // 0x1010044
diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java
index 144c909..56d5617 100644
--- a/core/java/android/preference/Preference.java
+++ b/core/java/android/preference/Preference.java
@@ -533,8 +533,7 @@
* @see #onCreateView(ViewGroup)
*/
protected void onBindView(View view) {
- final TextView titleView = (TextView) view.findViewById(
- com.android.internal.R.id.title);
+ final TextView titleView = (TextView) view.findViewById(com.android.internal.R.id.title);
if (titleView != null) {
final CharSequence title = getTitle();
if (!TextUtils.isEmpty(title)) {
@@ -557,7 +556,7 @@
}
}
- ImageView imageView = (ImageView) view.findViewById(com.android.internal.R.id.icon);
+ final ImageView imageView = (ImageView) view.findViewById(com.android.internal.R.id.icon);
if (imageView != null) {
if (mIconResId != 0 || mIcon != null) {
if (mIcon == null) {
@@ -570,6 +569,11 @@
imageView.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
}
+ final View imageFrame = view.findViewById(com.android.internal.R.id.icon_frame);
+ if (imageFrame != null) {
+ imageFrame.setVisibility(mIcon != null ? View.VISIBLE : View.GONE);
+ }
+
if (mShouldDisableView) {
setEnabledStateOnViews(view, isEnabled());
}
diff --git a/core/res/res/layout/preference_category_quantum.xml b/core/res/res/layout/preference_category_quantum.xml
new file mode 100644
index 0000000..032e09d
--- /dev/null
+++ b/core/res/res/layout/preference_category_quantum.xml
@@ -0,0 +1,28 @@
+<?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.
+-->
+
+<!-- Layout used for PreferenceCategory in a PreferenceActivity. -->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+android:id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:textAppearance="@style/TextAppearance.Quantum.Body2"
+ android:textColor="?android:attr/textColorSecondary"
+ android:textStyle="bold"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
+ android:paddingTop="16dip" />
diff --git a/core/res/res/layout/preference_child_quantum.xml b/core/res/res/layout/preference_child_quantum.xml
new file mode 100644
index 0000000..690d64a
--- /dev/null
+++ b/core/res/res/layout/preference_child_quantum.xml
@@ -0,0 +1,73 @@
+<?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.
+-->
+
+<!-- Layout for a visually child-like Preference in a PreferenceActivity. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/listPreferredItemPaddingStart"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd">
+
+ <LinearLayout
+ android:id="@+android:id/icon_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="58dip"
+ android:gravity="left|center_vertical"
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="8dip" />
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingTop="16dip"
+ android:paddingBottom="16dip">
+
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceListItem" />
+
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/title"
+ android:layout_alignStart="@android:id/title"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary"
+ android:maxLines="10" />
+
+ </RelativeLayout>
+
+ <!-- Preference should place its actual preference widget here. -->
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="58dip"
+ android:gravity="right|center_vertical"
+ android:orientation="vertical" />
+
+</LinearLayout>
diff --git a/core/res/res/layout/preference_information_quantum.xml b/core/res/res/layout/preference_information_quantum.xml
new file mode 100644
index 0000000..f21640fc
--- /dev/null
+++ b/core/res/res/layout/preference_information_quantum.xml
@@ -0,0 +1,74 @@
+<?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.
+-->
+
+<!-- Layout for a Preference in a PreferenceActivity. The
+ Preference is able to place a specific widget for its particular
+ type in the "widget_frame" layout. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
+ android:gravity="center_vertical"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd">
+
+ <LinearLayout
+ android:id="@+android:id/icon_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="58dip"
+ android:gravity="left|center_vertical"
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="8dip" />
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingTop="16dip"
+ android:paddingBottom="16dip">
+
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceListItem" />
+
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/title"
+ android:layout_alignStart="@android:id/title"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary"
+ android:maxLines="10" />
+
+ </RelativeLayout>
+
+ <!-- Preference should place its actual preference widget here. -->
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="58dip"
+ android:gravity="right|center_vertical"
+ android:orientation="vertical" />
+
+</LinearLayout>
diff --git a/core/res/res/layout/preference_quantum.xml b/core/res/res/layout/preference_quantum.xml
new file mode 100644
index 0000000..a4fe73d
--- /dev/null
+++ b/core/res/res/layout/preference_quantum.xml
@@ -0,0 +1,77 @@
+<?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.
+-->
+
+<!-- Layout for a Preference in a PreferenceActivity. The
+ Preference is able to place a specific widget for its particular
+ type in the "widget_frame" layout. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
+ android:gravity="center_vertical"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
+ android:background="?android:attr/activatedBackgroundIndicator">
+
+ <LinearLayout
+ android:id="@+android:id/icon_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="58dip"
+ android:gravity="left|center_vertical"
+ android:orientation="horizontal">
+ <ImageView
+ android:id="@+android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:scaleType="centerInside"
+ android:layout_marginEnd="8dip" />
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingTop="16dip"
+ android:paddingBottom="16dip">
+
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceListItem"
+ android:ellipsize="marquee" />
+
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/title"
+ android:layout_alignStart="@android:id/title"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary"
+ android:maxLines="10" />
+
+ </RelativeLayout>
+
+ <!-- Preference should place its actual preference widget here. -->
+ <LinearLayout android:id="@+android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:minWidth="58dip"
+ android:gravity="right|center_vertical"
+ android:orientation="vertical" />
+
+</LinearLayout>
diff --git a/core/res/res/layout/preference_widget_checkbox.xml b/core/res/res/layout/preference_widget_checkbox.xml
index 33a43f4..bfd7f0a 100644
--- a/core/res/res/layout/preference_widget_checkbox.xml
+++ b/core/res/res/layout/preference_widget_checkbox.xml
@@ -20,6 +20,5 @@
android:id="@+android:id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center"
android:focusable="false"
android:clickable="false" />
diff --git a/core/res/res/layout/preference_widget_switch.xml b/core/res/res/layout/preference_widget_switch.xml
index 83ef097..534c7ec 100644
--- a/core/res/res/layout/preference_widget_switch.xml
+++ b/core/res/res/layout/preference_widget_switch.xml
@@ -20,6 +20,5 @@
android:id="@+android:id/switchWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center"
android:padding="16dip"
android:focusable="false" />
diff --git a/core/res/res/layout/simple_list_item_1.xml b/core/res/res/layout/simple_list_item_1.xml
index 4249d10..43a5635 100644
--- a/core/res/res/layout/simple_list_item_1.xml
+++ b/core/res/res/layout/simple_list_item_1.xml
@@ -22,5 +22,4 @@
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:minHeight="?android:attr/listPreferredItemHeightSmall"
-/>
+ android:minHeight="?android:attr/listPreferredItemHeightSmall" />
diff --git a/core/res/res/layout/simple_list_item_2.xml b/core/res/res/layout/simple_list_item_2.xml
index 63c542b..b47a3465 100644
--- a/core/res/res/layout/simple_list_item_2.xml
+++ b/core/res/res/layout/simple_list_item_2.xml
@@ -20,22 +20,19 @@
android:minHeight="?android:attr/listPreferredItemHeight"
android:mode="twoLine"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
->
-
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
<TextView android:id="@android:id/text1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dip"
- android:textAppearance="?android:attr/textAppearanceListItem"
- />
-
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:textAppearance="?android:attr/textAppearanceListItem" />
+
<TextView android:id="@android:id/text2"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@android:id/text1"
- android:layout_alignStart="@android:id/text1"
- android:textAppearance="?android:attr/textAppearanceSmall"
- />
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/text1"
+ android:layout_alignStart="@android:id/text1"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary" />
</TwoLineListItem>
diff --git a/core/res/res/layout/simple_list_item_2_single_choice.xml b/core/res/res/layout/simple_list_item_2_single_choice.xml
index 5629567..65c5856 100644
--- a/core/res/res/layout/simple_list_item_2_single_choice.xml
+++ b/core/res/res/layout/simple_list_item_2_single_choice.xml
@@ -22,31 +22,34 @@
android:paddingStart="16dip"
android:paddingEnd="12dip"
android:minHeight="?android:attr/listPreferredItemHeightSmall">
+
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center_vertical">
+
<TextView android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAppearance="?android:attr/textAppearanceListItem"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical|start"
android:singleLine="true"
- android:ellipsize="marquee"
- />
+ android:ellipsize="marquee" />
+
<TextView android:id="@android:id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical|start"
android:singleLine="true"
- android:ellipsize="marquee"
- />
+ android:ellipsize="marquee" />
+
</LinearLayout>
+
<RadioButton
android:id="@+id/radio"
android:layout_width="35dip"
@@ -54,6 +57,6 @@
android:paddingEnd="12dip"
android:gravity="center_vertical"
android:focusable="false"
- android:clickable="false"
- />
+ android:clickable="false" />
+
</LinearLayout>
diff --git a/core/res/res/layout/simple_list_item_activated_1.xml b/core/res/res/layout/simple_list_item_activated_1.xml
index 41155e4..9b778d7 100644
--- a/core/res/res/layout/simple_list_item_activated_1.xml
+++ b/core/res/res/layout/simple_list_item_activated_1.xml
@@ -23,5 +23,4 @@
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:background="?android:attr/activatedBackgroundIndicator"
- android:minHeight="?android:attr/listPreferredItemHeightSmall"
-/>
+ android:minHeight="?android:attr/listPreferredItemHeightSmall" />
diff --git a/core/res/res/layout/simple_list_item_activated_2.xml b/core/res/res/layout/simple_list_item_activated_2.xml
index 725697d..5036813 100644
--- a/core/res/res/layout/simple_list_item_activated_2.xml
+++ b/core/res/res/layout/simple_list_item_activated_2.xml
@@ -21,23 +21,20 @@
android:layout_height="wrap_content"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeight"
- android:mode="twoLine"
->
+ android:mode="twoLine">
<TextView android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
android:layout_marginTop="6dip"
- android:textAppearance="?android:attr/textAppearanceListItem"
- />
+ android:textAppearance="?android:attr/textAppearanceListItem" />
<TextView android:id="@android:id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@android:id/text1"
android:layout_alignStart="@android:id/text1"
- android:textAppearance="?android:attr/textAppearanceSmall"
- />
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary" />
</TwoLineListItem>
diff --git a/core/res/res/layout/simple_list_item_checked.xml b/core/res/res/layout/simple_list_item_checked.xml
index 0c497d6..4673e27 100644
--- a/core/res/res/layout/simple_list_item_checked.xml
+++ b/core/res/res/layout/simple_list_item_checked.xml
@@ -22,5 +22,4 @@
android:gravity="center_vertical"
android:checkMark="?android:attr/textCheckMark"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-/>
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" />
diff --git a/core/res/res/layout/simple_list_item_multiple_choice.xml b/core/res/res/layout/simple_list_item_multiple_choice.xml
index 076d8c6..440b6fd 100644
--- a/core/res/res/layout/simple_list_item_multiple_choice.xml
+++ b/core/res/res/layout/simple_list_item_multiple_choice.xml
@@ -22,5 +22,4 @@
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-/>
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" />
diff --git a/core/res/res/layout/simple_list_item_single_choice.xml b/core/res/res/layout/simple_list_item_single_choice.xml
index 4c1af09..02cb7f7 100644
--- a/core/res/res/layout/simple_list_item_single_choice.xml
+++ b/core/res/res/layout/simple_list_item_single_choice.xml
@@ -22,5 +22,4 @@
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-/>
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" />
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index e100a4d..f364bd0 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -245,6 +245,8 @@
<!-- The preferred TextAppearance for the primary text of list items. -->
<attr name="textAppearanceListItem" format="reference" />
+ <!-- The preferred TextAppearance for the secondary text of list items. -->
+ <attr name="textAppearanceListItemSecondary" format="reference" />
<!-- The preferred TextAppearance for the primary text of small list items. -->
<attr name="textAppearanceListItemSmall" format="reference" />
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index acdf926..d3bee28 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2148,6 +2148,7 @@
<public type="attr" name="subtitleTextAppearance" />
<public type="attr" name="slideEdge" />
<public type="attr" name="actionBarTheme" />
+ <public type="attr" name="textAppearanceListItemSecondary" />
<public-padding type="dimen" name="l_resource_pad" end="0x01050010" />
diff --git a/core/res/res/values/styles_quantum.xml b/core/res/res/values/styles_quantum.xml
index dd148c4..2720d61 100644
--- a/core/res/res/values/styles_quantum.xml
+++ b/core/res/res/values/styles_quantum.xml
@@ -33,7 +33,7 @@
<eat-comment/>
<style name="Preference.Quantum">
- <item name="layout">@layout/preference_holo</item>
+ <item name="layout">@layout/preference_quantum</item>
</style>
<style name="PreferenceFragment.Quantum">
@@ -42,13 +42,13 @@
</style>
<style name="Preference.Quantum.Information">
- <item name="layout">@layout/preference_information_holo</item>
+ <item name="layout">@layout/preference_information_quantum</item>
<item name="enabled">false</item>
<item name="shouldDisableView">false</item>
</style>
<style name="Preference.Quantum.Category">
- <item name="layout">@layout/preference_category_holo</item>
+ <item name="layout">@layout/preference_category_quantum</item>
<!-- The title should not dim if the category is disabled, instead only the preference children should dim. -->
<item name="shouldDisableView">false</item>
<item name="selectable">false</item>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index b011483..ac6c15d 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1835,5 +1835,6 @@
<java-symbol type="attr" name="titleTextAppearance" />
<java-symbol type="attr" name="subtitleTextAppearance" />
<java-symbol type="drawable" name="ic_lock_bugreport" />
+ <java-symbol type="id" name="icon_frame" />
</resources>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 37a903a..6f9e55b 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -126,6 +126,7 @@
<item name="dropdownListPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
<item name="textAppearanceListItem">?android:attr/textAppearanceLarge</item>
<item name="textAppearanceListItemSmall">?android:attr/textAppearanceLarge</item>
+ <item name="textAppearanceListItemSecondary">?android:attr/textAppearanceSmall</item>
<item name="listPreferredItemPaddingLeft">6dip</item>
<item name="listPreferredItemPaddingRight">6dip</item>
<item name="listPreferredItemPaddingStart">6dip</item>
@@ -702,6 +703,7 @@
<item name="itemTextAppearance">@android:style/TextAppearance.Large.Inverse</item>
<item name="textAppearanceListItem">@android:style/TextAppearance.Large.Inverse</item>
<item name="textAppearanceListItemSmall">@android:style/TextAppearance.Large.Inverse</item>
+ <item name="textAppearanceListItemSecondary">@android:style/TextAppearance.Small.Inverse</item>
</style>
<!-- Default heme for the TimePicker dialog windows, which is used by the
@@ -1007,6 +1009,7 @@
<item name="listPreferredItemHeightLarge">80dip</item>
<item name="dropdownListPreferredItemHeight">?android:attr/listPreferredItemHeightSmall</item>
<item name="textAppearanceListItemSmall">?android:attr/textAppearanceMedium</item>
+ <item name="textAppearanceListItemSecondary">?android:attr/textAppearanceSmall</item>
<item name="listPreferredItemPaddingLeft">8dip</item>
<item name="listPreferredItemPaddingRight">8dip</item>
<item name="listPreferredItemPaddingStart">8dip</item>
@@ -1337,6 +1340,7 @@
<item name="listPreferredItemHeightLarge">80dip</item>
<item name="dropdownListPreferredItemHeight">?android:attr/listPreferredItemHeightSmall</item>
<item name="textAppearanceListItemSmall">?android:attr/textAppearanceMedium</item>
+ <item name="textAppearanceListItemSecondary">?android:attr/textAppearanceSmall</item>
<item name="listPreferredItemPaddingLeft">8dip</item>
<item name="listPreferredItemPaddingRight">8dip</item>
<item name="listPreferredItemPaddingStart">8dip</item>
diff --git a/core/res/res/values/themes_quantum.xml b/core/res/res/values/themes_quantum.xml
index 2a80c81..9e235d6 100644
--- a/core/res/res/values/themes_quantum.xml
+++ b/core/res/res/values/themes_quantum.xml
@@ -109,11 +109,13 @@
<item name="listPreferredItemHeightSmall">48dip</item>
<item name="listPreferredItemHeightLarge">80dip</item>
<item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item>
- <item name="textAppearanceListItemSmall">?attr/textAppearanceMedium</item>
- <item name="listPreferredItemPaddingLeft">8dip</item>
- <item name="listPreferredItemPaddingRight">8dip</item>
- <item name="listPreferredItemPaddingStart">8dip</item>
- <item name="listPreferredItemPaddingEnd">8dip</item>
+ <item name="textAppearanceListItem">@style/TextAppearance.Quantum.Subhead</item>
+ <item name="textAppearanceListItemSmall">@style/TextAppearance.Quantum.Subhead</item>
+ <item name="textAppearanceListItemSecondary">@style/TextAppearance.Quantum.Body1</item>
+ <item name="listPreferredItemPaddingLeft">16dip</item>
+ <item name="listPreferredItemPaddingRight">16dip</item>
+ <item name="listPreferredItemPaddingStart">16dip</item>
+ <item name="listPreferredItemPaddingEnd">16dip</item>
<!-- @hide -->
<item name="searchResultListItemHeight">58dip</item>
@@ -269,6 +271,7 @@
<!-- Preference styles -->
<item name="preferenceScreenStyle">@style/Preference.Quantum.PreferenceScreen</item>
<item name="preferenceFragmentStyle">@style/PreferenceFragment.Quantum</item>
+ <item name="preferenceFragmentPaddingSide">0dip</item>
<item name="preferenceCategoryStyle">@style/Preference.Quantum.Category</item>
<item name="preferenceStyle">@style/Preference.Quantum</item>
<item name="preferenceInformationStyle">@style/Preference.Quantum.Information</item>
@@ -278,7 +281,7 @@
<item name="dialogPreferenceStyle">@style/Preference.Quantum.DialogPreference</item>
<item name="editTextPreferenceStyle">@style/Preference.Quantum.DialogPreference.EditTextPreference</item>
<item name="ringtonePreferenceStyle">@style/Preference.Quantum.RingtonePreference</item>
- <item name="preferenceLayoutChild">@layout/preference_child_holo</item>
+ <item name="preferenceLayoutChild">@layout/preference_child_quantum</item>
<item name="detailsElementBackground">?attr/colorBackground</item>
<!-- Search widget styles -->
@@ -442,11 +445,13 @@
<item name="listPreferredItemHeightSmall">48dip</item>
<item name="listPreferredItemHeightLarge">80dip</item>
<item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item>
- <item name="textAppearanceListItemSmall">?attr/textAppearanceMedium</item>
- <item name="listPreferredItemPaddingLeft">8dip</item>
- <item name="listPreferredItemPaddingRight">8dip</item>
- <item name="listPreferredItemPaddingStart">8dip</item>
- <item name="listPreferredItemPaddingEnd">8dip</item>
+ <item name="textAppearanceListItem">@style/TextAppearance.Quantum.Subhead</item>
+ <item name="textAppearanceListItemSmall">@style/TextAppearance.Quantum.Subhead</item>
+ <item name="textAppearanceListItemSecondary">@style/TextAppearance.Quantum.Body1</item>
+ <item name="listPreferredItemPaddingLeft">16dip</item>
+ <item name="listPreferredItemPaddingRight">16dip</item>
+ <item name="listPreferredItemPaddingStart">16dip</item>
+ <item name="listPreferredItemPaddingEnd">16dip</item>
<!-- @hide -->
<item name="searchResultListItemHeight">58dip</item>
@@ -601,6 +606,7 @@
<!-- Preference styles -->
<item name="preferenceScreenStyle">@style/Preference.Quantum.PreferenceScreen</item>
<item name="preferenceFragmentStyle">@style/PreferenceFragment.Quantum</item>
+ <item name="preferenceFragmentPaddingSide">0dip</item>
<item name="preferenceCategoryStyle">@style/Preference.Quantum.Category</item>
<item name="preferenceStyle">@style/Preference.Quantum</item>
<item name="preferenceInformationStyle">@style/Preference.Quantum.Information</item>
@@ -610,7 +616,7 @@
<item name="dialogPreferenceStyle">@style/Preference.Quantum.DialogPreference</item>
<item name="editTextPreferenceStyle">@style/Preference.Quantum.DialogPreference.EditTextPreference</item>
<item name="ringtonePreferenceStyle">@style/Preference.Quantum.RingtonePreference</item>
- <item name="preferenceLayoutChild">@layout/preference_child_holo</item>
+ <item name="preferenceLayoutChild">@layout/preference_child_quantum</item>
<item name="detailsElementBackground">?attr/colorBackground</item>
<!-- PreferenceFrameLayout attributes -->
diff --git a/packages/SystemUI/res/layout/recents_task_view.xml b/packages/SystemUI/res/layout/recents_task_view.xml
index 96da21f..8297878 100644
--- a/packages/SystemUI/res/layout/recents_task_view.xml
+++ b/packages/SystemUI/res/layout/recents_task_view.xml
@@ -43,7 +43,11 @@
android:textSize="24sp"
android:textColor="#ffffffff"
android:text="@string/recents_empty_message"
- android:fontFamily="sans-serif-thin" />
+ android:fontFamily="sans-serif-thin"
+ android:singleLine="true"
+ android:maxLines="2"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
<ImageView
android:id="@+id/activity_icon"
android:layout_width="@dimen/recents_task_view_activity_icon_size"
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 77944c8..672c1d0 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -112,5 +112,7 @@
<integer name="recents_filter_animate_current_views_min_duration">175</integer>
<!-- The min animation duration for animating views that are newly visible. -->
<integer name="recents_filter_animate_new_views_min_duration">125</integer>
+ <!-- The min animation duration for animating views that are newly visible. -->
+ <integer name="recents_animate_task_bar_enter_duration">200</integer>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
index 8543b97..4fb90cb 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
@@ -44,6 +44,7 @@
import android.view.WindowManager;
import com.android.systemui.R;
+import java.util.Iterator;
import java.util.List;
/** A proxy implementation for the recents component */
@@ -57,8 +58,11 @@
Resources res = mContext.getResources();
float statusBarHeight = res.getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height);
- mFirstTaskRect = (Rect) msg.getData().getParcelable("taskRect");
- mFirstTaskRect.offset(0, (int) statusBarHeight);
+ Bundle replyData = msg.getData().getParcelable(KEY_CONFIGURATION_DATA);
+ mSingleCountFirstTaskRect = replyData.getParcelable(KEY_SINGLE_TASK_STACK_RECT);
+ mSingleCountFirstTaskRect.offset(0, (int) statusBarHeight);
+ mMultipleCountFirstTaskRect = replyData.getParcelable(KEY_MULTIPLE_TASK_STACK_RECT);
+ mMultipleCountFirstTaskRect.offset(0, (int) statusBarHeight);
}
}
}
@@ -89,12 +93,20 @@
}
}
- final static int MSG_UPDATE_FOR_CONFIGURATION = 0;
- final static int MSG_UPDATE_TASK_THUMBNAIL = 1;
- final static int MSG_PRELOAD_TASKS = 2;
- final static int MSG_CANCEL_PRELOAD_TASKS = 3;
- final static int MSG_CLOSE_RECENTS = 4;
- final static int MSG_TOGGLE_RECENTS = 5;
+ final public static int MSG_UPDATE_FOR_CONFIGURATION = 0;
+ final public static int MSG_UPDATE_TASK_THUMBNAIL = 1;
+ final public static int MSG_PRELOAD_TASKS = 2;
+ final public static int MSG_CANCEL_PRELOAD_TASKS = 3;
+ final public static int MSG_CLOSE_RECENTS = 4;
+ final public static int MSG_TOGGLE_RECENTS = 5;
+
+ final public static String EXTRA_ANIMATING_WITH_THUMBNAIL = "recents.animatingWithThumbnail";
+ final public static String KEY_CONFIGURATION_DATA = "recents.data.updateForConfiguration";
+ final public static String KEY_WINDOW_RECT = "recents.windowRect";
+ final public static String KEY_SYSTEM_INSETS = "recents.systemInsets";
+ final public static String KEY_SINGLE_TASK_STACK_RECT = "recents.singleCountTaskRect";
+ final public static String KEY_MULTIPLE_TASK_STACK_RECT = "recents.multipleCountTaskRect";
+
final static int sMinToggleDelay = 425;
@@ -114,7 +126,8 @@
RecentsServiceConnection mConnection = new RecentsServiceConnection();
View mStatusBarView;
- Rect mFirstTaskRect = new Rect();
+ Rect mSingleCountFirstTaskRect = new Rect();
+ Rect mMultipleCountFirstTaskRect = new Rect();
long mLastToggleTime;
public AlternateRecentsComponent(Context context) {
@@ -190,8 +203,8 @@
// Try and update the recents configuration
try {
Bundle data = new Bundle();
- data.putParcelable("windowRect", rect);
- data.putParcelable("systemInsets", new Rect(0, statusBarHeight, 0, 0));
+ data.putParcelable(KEY_WINDOW_RECT, rect);
+ data.putParcelable(KEY_SYSTEM_INSETS, new Rect(0, statusBarHeight, 0, 0));
Message msg = Message.obtain(null, MSG_UPDATE_FOR_CONFIGURATION, 0, 0);
msg.setData(data);
msg.replyTo = mMessenger;
@@ -221,26 +234,29 @@
return null;
}
- Bitmap thumbnail = ssp.getTaskThumbnail(t.persistentId);
- return thumbnail;
+ return ssp.getTaskThumbnail(t.persistentId);
}
return null;
}
- /** Returns whether there is a first task */
- boolean hasFirstTask() {
+ /** Returns whether there is are multiple recents tasks */
+ boolean hasMultipleRecentsTask() {
+ // NOTE: Currently there's no method to get the number of non-home tasks, so we have to
+ // compute this ourselves
SystemServicesProxy ssp = mSystemServicesProxy;
- List<ActivityManager.RecentTaskInfo> tasks = ssp.getRecentTasks(1,
+ List<ActivityManager.RecentTaskInfo> tasks = ssp.getRecentTasks(4,
UserHandle.CURRENT.getIdentifier());
- for (ActivityManager.RecentTaskInfo t : tasks) {
+ Iterator<ActivityManager.RecentTaskInfo> iter = tasks.iterator();
+ while (iter.hasNext()) {
+ ActivityManager.RecentTaskInfo t = iter.next();
+
// Skip tasks in the home stack
if (ssp.isInHomeStack(t.persistentId)) {
+ iter.remove();
continue;
}
-
- return true;
}
- return false;
+ return (tasks.size() > 1);
}
/** Converts from the device rotation to the degree */
@@ -287,8 +303,10 @@
// to launch the first task or dismiss itself
SystemServicesProxy ssp = mSystemServicesProxy;
List<ActivityManager.RunningTaskInfo> tasks = ssp.getRunningTasks(1);
+ boolean isTopTaskHome = false;
if (!tasks.isEmpty()) {
- ComponentName topActivity = tasks.get(0).topActivity;
+ ActivityManager.RunningTaskInfo topTask = tasks.get(0);
+ ComponentName topActivity = topTask.topActivity;
// Check if the front most activity is recents
if (topActivity.getPackageName().equals(sRecentsPackage) &&
@@ -311,16 +329,30 @@
mLastToggleTime = System.currentTimeMillis();
return;
}
+
+ // Determine whether the top task is currently home
+ isTopTaskHome = ssp.isInHomeStack(topTask.id);
}
// Otherwise, Recents is not the front-most activity and we should animate into it
- Rect taskRect = mFirstTaskRect;
- if (taskRect != null && taskRect.width() > 0 && taskRect.height() > 0 && hasFirstTask()) {
+ boolean hasMultipleTasks = hasMultipleRecentsTask();
+ Rect taskRect = hasMultipleTasks ? mMultipleCountFirstTaskRect : mSingleCountFirstTaskRect;
+ if (!isTopTaskHome && taskRect != null && taskRect.width() > 0 && taskRect.height() > 0) {
// Loading from thumbnail
Bitmap thumbnail;
Bitmap firstThumbnail = loadFirstTaskThumbnail();
- if (firstThumbnail == null) {
- // Load the thumbnail from the screenshot
+ if (firstThumbnail != null) {// Create the thumbnail
+ thumbnail = Bitmap.createBitmap(taskRect.width(), taskRect.height(),
+ Bitmap.Config.ARGB_8888);
+ int size = Math.min(firstThumbnail.getWidth(), firstThumbnail.getHeight());
+ Canvas c = new Canvas(thumbnail);
+ c.drawBitmap(firstThumbnail, new Rect(0, 0, size, size),
+ new Rect(0, 0, taskRect.width(), taskRect.height()), null);
+ c.setBitmap(null);
+ // Recycle the old thumbnail
+ firstThumbnail.recycle();
+ } else {
+ // Load the thumbnail from the screenshot if can't get one from the system
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Bitmap screenshot = takeScreenshot(display);
@@ -328,35 +360,24 @@
int size = Math.min(screenshot.getWidth(), screenshot.getHeight());
int statusBarHeight = res.getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height);
- thumbnail = Bitmap.createBitmap(mFirstTaskRect.width(), mFirstTaskRect.height(),
+ thumbnail = Bitmap.createBitmap(taskRect.width(), taskRect.height(),
Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(thumbnail);
c.drawBitmap(screenshot, new Rect(0, statusBarHeight, size, statusBarHeight + size),
- new Rect(0, 0, mFirstTaskRect.width(), mFirstTaskRect.height()), null);
+ new Rect(0, 0, taskRect.width(), taskRect.height()), null);
c.setBitmap(null);
- // Recycle the old screenshot
+ // Recycle the temporary screenshot
screenshot.recycle();
- } else {
- // Create the thumbnail
- thumbnail = Bitmap.createBitmap(mFirstTaskRect.width(), mFirstTaskRect.height(),
- Bitmap.Config.ARGB_8888);
- int size = Math.min(firstThumbnail.getWidth(), firstThumbnail.getHeight());
- Canvas c = new Canvas(thumbnail);
- c.drawBitmap(firstThumbnail, new Rect(0, 0, size, size),
- new Rect(0, 0, mFirstTaskRect.width(), mFirstTaskRect.height()), null);
- c.setBitmap(null);
- // Recycle the old thumbnail
- firstThumbnail.recycle();
}
ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation(mStatusBarView,
- thumbnail, mFirstTaskRect.left, mFirstTaskRect.top, null);
- startAlternateRecentsActivity(opts);
+ thumbnail, taskRect.left, taskRect.top, null);
+ startAlternateRecentsActivity(opts, true);
} else {
ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
R.anim.recents_from_launcher_enter,
R.anim.recents_from_launcher_exit);
- startAlternateRecentsActivity(opts);
+ startAlternateRecentsActivity(opts, false);
}
Console.logTraceTime(Constants.DebugFlags.App.TimeRecentsStartup,
@@ -365,11 +386,12 @@
}
/** Starts the recents activity */
- void startAlternateRecentsActivity(ActivityOptions opts) {
+ void startAlternateRecentsActivity(ActivityOptions opts, boolean animatingWithThumbnail) {
Intent intent = new Intent(sToggleRecentsAction);
intent.setClassName(sRecentsPackage, sRecentsActivity);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ intent.putExtra(EXTRA_ANIMATING_WITH_THUMBNAIL, animatingWithThumbnail);
if (opts != null) {
mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
UserHandle.USER_CURRENT));
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
index 86f188e..cde17f5e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
@@ -72,8 +72,6 @@
public static class Window {
// The dark background dim is set behind the empty recents view
public static final float DarkBackgroundDim = 0.5f;
- // The background dim is set behind the card stack
- public static final float BackgroundDim = 0.35f;
}
public static class RecentsTaskLoader {
@@ -98,11 +96,8 @@
}
public static class TaskView {
- public static final boolean AnimateFrontTaskIconOnEnterRecents = true;
- public static final boolean AnimateFrontTaskIconOnLeavingRecents = true;
-
- public static final boolean UseRoundedCorners = false;
- public static final float RoundedCornerRadiusDps = 3;
+ public static final boolean AnimateFrontTaskBarOnEnterRecents = true;
+ public static final boolean AnimateFrontTaskBarOnLeavingRecents = true;
}
}
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index 64c67b1..f61c28c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -73,7 +73,12 @@
};
/** Updates the set of recent tasks */
- void updateRecentsTasks() {
+ void updateRecentsTasks(Intent launchIntent) {
+ // Update the configuration based on the launch intent
+ RecentsConfiguration config = RecentsConfiguration.getInstance();
+ config.launchedWithThumbnailAnimation = launchIntent.getBooleanExtra(
+ AlternateRecentsComponent.EXTRA_ANIMATING_WITH_THUMBNAIL, false);
+
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
SpaceNode root = loader.reload(this, Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount);
ArrayList<TaskStack> stacks = root.getStacks();
@@ -137,7 +142,7 @@
setContentView(mContainerView);
// Update the recent tasks
- updateRecentsTasks();
+ updateRecentsTasks(getIntent());
}
@Override
@@ -157,7 +162,7 @@
RecentsConfiguration.reinitialize(this);
// Update the recent tasks
- updateRecentsTasks();
+ updateRecentsTasks(intent);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index 94a655f..21460bb 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -39,6 +39,9 @@
public int filteringCurrentViewsMinAnimDuration;
public int filteringNewViewsMinAnimDuration;
+ public int taskBarEnterAnimDuration;
+
+ public boolean launchedWithThumbnailAnimation;
/** Private constructor */
private RecentsConfiguration() {}
@@ -76,6 +79,8 @@
res.getInteger(R.integer.recents_filter_animate_current_views_min_duration);
filteringNewViewsMinAnimDuration =
res.getInteger(R.integer.recents_filter_animate_new_views_min_duration);
+ taskBarEnterAnimDuration =
+ res.getInteger(R.integer.recents_animate_task_bar_enter_duration);
}
public void updateSystemInsets(Rect insets) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsService.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsService.java
index 22363bb..f78a999 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsService.java
@@ -26,6 +26,7 @@
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
+import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack;
import com.android.systemui.recents.views.TaskStackView;
import com.android.systemui.recents.views.TaskViewTransform;
@@ -50,36 +51,51 @@
Context context = mContext.get();
if (context == null) return;
- if (msg.what == RecentsService.MSG_UPDATE_RECENTS_FOR_CONFIGURATION) {
+ if (msg.what == AlternateRecentsComponent.MSG_UPDATE_FOR_CONFIGURATION) {
RecentsTaskLoader.initialize(context);
RecentsConfiguration.reinitialize(context);
try {
Bundle data = msg.getData();
- Rect windowRect = (Rect) data.getParcelable("windowRect");
- Rect systemInsets = (Rect) data.getParcelable("systemInsets");
+ Rect windowRect = data.getParcelable(AlternateRecentsComponent.KEY_WINDOW_RECT);
+ Rect systemInsets = data.getParcelable(AlternateRecentsComponent.KEY_SYSTEM_INSETS);
// Create a dummy task stack & compute the rect for the thumbnail to animate to
TaskStack stack = new TaskStack(context);
TaskStackView tsv = new TaskStackView(context, stack);
- // Since the nav bar height is already accounted for in the windowRect, don't pass
- // in a bottom inset
+ Bundle replyData = new Bundle();
+ TaskViewTransform transform;
+
+ // Calculate the target task rect for when there is one task
+ // NOTE: Since the nav bar height is already accounted for in the windowRect, don't
+ // pass in a bottom inset
+ stack.addTask(new Task());
tsv.computeRects(windowRect.width(), windowRect.height() - systemInsets.top, 0);
tsv.boundScroll();
- TaskViewTransform transform = tsv.getStackTransform(0, tsv.getStackScroll());
- Rect taskRect = new Rect(transform.rect);
+ transform = tsv.getStackTransform(0, tsv.getStackScroll());
+ replyData.putParcelable(AlternateRecentsComponent.KEY_SINGLE_TASK_STACK_RECT,
+ new Rect(transform.rect));
- data.putParcelable("taskRect", taskRect);
+ // Also calculate the target task rect when there are multiple tasks
+ stack.addTask(new Task());
+ tsv.computeRects(windowRect.width(), windowRect.height() - systemInsets.top, 0);
+ tsv.setStackScrollRaw(Integer.MAX_VALUE);
+ tsv.boundScroll();
+ transform = tsv.getStackTransform(1, tsv.getStackScroll());
+ replyData.putParcelable(AlternateRecentsComponent.KEY_MULTIPLE_TASK_STACK_RECT,
+ new Rect(transform.rect));
+
+ data.putParcelable(AlternateRecentsComponent.KEY_CONFIGURATION_DATA, replyData);
Message reply = Message.obtain(null,
- RecentsService.MSG_UPDATE_RECENTS_FOR_CONFIGURATION, 0, 0);
+ AlternateRecentsComponent.MSG_UPDATE_FOR_CONFIGURATION, 0, 0);
reply.setData(data);
msg.replyTo.send(reply);
} catch (RemoteException re) {
re.printStackTrace();
}
- } else if (msg.what == RecentsService.MSG_CLOSE_RECENTS) {
+ } else if (msg.what == AlternateRecentsComponent.MSG_CLOSE_RECENTS) {
// Do nothing
- } else if (msg.what == RecentsService.MSG_TOGGLE_RECENTS) {
+ } else if (msg.what == AlternateRecentsComponent.MSG_TOGGLE_RECENTS) {
// Send a broadcast to toggle recents
Intent intent = new Intent(RecentsService.ACTION_TOGGLE_RECENTS_ACTIVITY);
intent.setPackage(context.getPackageName());
@@ -99,11 +115,6 @@
final static String ACTION_FINISH_RECENTS_ACTIVITY = "action_finish_recents_activity";
final static String ACTION_TOGGLE_RECENTS_ACTIVITY = "action_toggle_recents_activity";
- // XXX: This should be getting the message from recents definition
- final static int MSG_UPDATE_RECENTS_FOR_CONFIGURATION = 0;
- final static int MSG_CLOSE_RECENTS = 4;
- final static int MSG_TOGGLE_RECENTS = 5;
-
Messenger mSystemUIMessenger = new Messenger(new SystemUIMessageHandler(this));
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsTaskLoader.java
index 754d956..3c34e90 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsTaskLoader.java
@@ -358,18 +358,9 @@
return mSystemServicesProxy;
}
- /** Reload the set of recent tasks */
- SpaceNode reload(Context context, int preloadCount) {
- Console.log(Constants.DebugFlags.App.TaskDataLoader, "[RecentsTaskLoader|reload]");
- Resources res = context.getResources();
- ArrayList<Task> tasksToForceLoad = new ArrayList<Task>();
- TaskStack stack = new TaskStack(context);
- SpaceNode root = new SpaceNode(context);
- root.setStack(stack);
-
+ private List<ActivityManager.RecentTaskInfo> getRecentTasks(Context context) {
long t1 = System.currentTimeMillis();
- // Get the recent tasks
SystemServicesProxy ssp = mSystemServicesProxy;
List<ActivityManager.RecentTaskInfo> tasks =
ssp.getRecentTasks(25, UserHandle.CURRENT.getIdentifier());
@@ -397,6 +388,24 @@
}
}
+ return tasks;
+ }
+
+ /** Reload the set of recent tasks */
+ SpaceNode reload(Context context, int preloadCount) {
+ long t1 = System.currentTimeMillis();
+
+ Console.log(Constants.DebugFlags.App.TaskDataLoader, "[RecentsTaskLoader|reload]");
+ Resources res = context.getResources();
+ ArrayList<Task> tasksToForceLoad = new ArrayList<Task>();
+ TaskStack stack = new TaskStack(context);
+ SpaceNode root = new SpaceNode(context);
+ root.setStack(stack);
+
+ // Get the recent tasks
+ SystemServicesProxy ssp = mSystemServicesProxy;
+ List<ActivityManager.RecentTaskInfo> tasks = getRecentTasks(context);
+
// Add each task to the task stack
t1 = System.currentTimeMillis();
int taskCount = tasks.size();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
index a0ff3b7..189f358 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
@@ -69,6 +69,10 @@
TaskCallbacks mCb;
+ public Task() {
+ // Only used by RecentsService for task rect calculations.
+ }
+
public Task(int id, boolean isActive, Intent intent, String activityTitle,
Bitmap activityIcon, int userId) {
this.key = new TaskKey(id, intent);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
index a0e5b6a..21e2c1d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
@@ -43,7 +43,13 @@
ArrayList<Task> prevFilteredTasks = new ArrayList<Task>(mFilteredTasks);
mFilter = filter;
updateFilteredTasks();
- return !prevFilteredTasks.equals(mFilteredTasks);
+ if (!prevFilteredTasks.equals(mFilteredTasks)) {
+ return true;
+ } else {
+ // If the tasks are exactly the same pre/post filter, then just reset it
+ mFilter = null;
+ return false;
+ }
}
/** Removes the task filter and returns the previous touch state */
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 141d870..ec28379 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -277,7 +277,7 @@
Constants.DebugFlags.App.TimeRecentsLaunchKey, "onTaskLaunched");
// Launch the app right away if there is no task view, otherwise, animate the icon out first
- if (tv == null || !Constants.Values.TaskView.AnimateFrontTaskIconOnLeavingRecents) {
+ if (tv == null || !Constants.Values.TaskView.AnimateFrontTaskBarOnLeavingRecents) {
post(launchRunnable);
} else {
tv.animateOnLeavingRecents(launchRunnable);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index c9a491e..728aaad 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -171,7 +171,7 @@
transform.visible = false;
} else {
transform.rect.offset(0, transform.translationY);
- Utilities.scaleRectAboutCenter(transform.rect, scale);
+ Utilities.scaleRectAboutCenter(transform.rect, transform.scale);
transform.visible = Rect.intersects(mRect, transform.rect);
}
transform.t = t;
@@ -388,8 +388,14 @@
int stackHeight = mStackRectSansPeek.height();
int maxScrollHeight = taskHeight + (int) ((numTasks - 1) *
Constants.Values.TaskStackView.StackOverlapPct * taskHeight);
- mMinScroll = Math.min(stackHeight, maxScrollHeight) - stackHeight;
- mMaxScroll = maxScrollHeight - stackHeight;
+
+ if (numTasks <= 1) {
+ // If there is only one task, then center the task in the stack rect (sans peek)
+ mMinScroll = mMaxScroll = -(stackHeight - taskHeight) / 2;
+ } else {
+ mMinScroll = Math.min(stackHeight, maxScrollHeight) - stackHeight;
+ mMaxScroll = maxScrollHeight - stackHeight;
+ }
// Debug logging
if (Constants.DebugFlags.UI.MeasureAndLayout) {
@@ -479,8 +485,8 @@
// Clip against the next view (if we aren't animating its alpha)
nextTv = (TaskView) getChildAt(curIndex + 1);
if (nextTv.getAlpha() == 1f) {
- Rect curRect = tv.getClippingRect(mTmpRect, false);
- Rect nextRect = nextTv.getClippingRect(mTmpRect2, true);
+ Rect curRect = tv.getClippingRect(mTmpRect);
+ Rect nextRect = nextTv.getClippingRect(mTmpRect2);
RecentsConfiguration config = RecentsConfiguration.getInstance();
// The hit rects are relative to the task view, which needs to be offset by the
// system bar height
@@ -523,7 +529,6 @@
int minHeight = (int) (mStackRect.height() -
(Constants.Values.TaskStackView.StackPeekHeightPct * mStackRect.height()));
int size = Math.min(minHeight, Math.min(mStackRect.width(), mStackRect.height()));
- int centerX = mStackRect.centerX();
mTaskRect.set(mStackRect.left, mStackRectSansPeek.top,
mStackRect.right, mStackRectSansPeek.top + size);
@@ -558,8 +563,9 @@
requestSynchronizeStackViewsWithModel();
synchronizeStackViewsWithModel();
- // Animate the icon of the first task view
- if (Constants.Values.TaskView.AnimateFrontTaskIconOnEnterRecents) {
+ // Animate the task bar of the first task view
+ if (config.launchedWithThumbnailAnimation &&
+ Constants.Values.TaskView.AnimateFrontTaskBarOnEnterRecents) {
TaskView tv = (TaskView) getChildAt(getChildCount() - 1);
if (tv != null) {
tv.animateOnEnterRecents();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index e99fecb..a3056ec 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -20,9 +20,8 @@
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
-import android.graphics.Color;
+import android.graphics.Outline;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -36,8 +35,6 @@
import com.android.systemui.recents.Utilities;
import com.android.systemui.recents.model.Task;
-import java.util.Random;
-
/* A task view */
public class TaskView extends FrameLayout implements View.OnClickListener, Task.TaskCallbacks {
@@ -54,8 +51,6 @@
TaskBarView mBarView;
TaskViewCallbacks mCb;
- Path mRoundedRectClipPath = new Path();
-
public TaskView(Context context) {
this(context, null);
@@ -71,7 +66,6 @@
public TaskView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- setWillNotDraw(false);
}
@Override
@@ -85,31 +79,6 @@
}
}
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- // Update the rounded rect clip path
- RecentsConfiguration config = RecentsConfiguration.getInstance();
- float radius = config.pxFromDp(Constants.Values.TaskView.RoundedCornerRadiusDps);
- mRoundedRectClipPath.reset();
- mRoundedRectClipPath.addRoundRect(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()),
- radius, radius, Path.Direction.CW);
- }
-
- @Override
- protected void dispatchDraw(Canvas canvas) {
- int restoreCount = 0;
- if (Constants.Values.TaskView.UseRoundedCorners) {
- restoreCount = canvas.save();
- canvas.clipPath(mRoundedRectClipPath);
- }
- super.dispatchDraw(canvas);
- if (Constants.Values.TaskView.UseRoundedCorners) {
- canvas.restoreToCount(restoreCount);
- }
- }
-
/** Set callback */
void setCallbacks(TaskViewCallbacks cb) {
mCb = cb;
@@ -195,7 +164,7 @@
.translationY(0)
.setStartDelay(235)
.setInterpolator(BakedBezierInterpolator.INSTANCE)
- .setDuration(Utilities.calculateTranslationAnimationDuration(translate))
+ .setDuration(config.taskBarEnterAnimDuration)
.withLayer()
.start();
}
@@ -214,23 +183,21 @@
.setInterpolator(BakedBezierInterpolator.INSTANCE)
.setDuration(Utilities.calculateTranslationAnimationDuration(translate))
.withLayer()
- .withEndAction(r)
+ .withEndAction(new Runnable() {
+ @Override
+ public void run() {
+ post(r);
+ }
+ })
.start();
}
/** Returns the rect we want to clip (it may not be the full rect) */
- Rect getClippingRect(Rect outRect, boolean accountForRoundedRects) {
+ Rect getClippingRect(Rect outRect) {
getHitRect(outRect);
// XXX: We should get the hit rect of the thumbnail view and intersect, but this is faster
outRect.right = outRect.left + mThumbnailView.getRight();
outRect.bottom = outRect.top + mThumbnailView.getBottom();
- // We need to shrink the next rect by the rounded corners since those are draw on
- // top of the current view
- if (accountForRoundedRects) {
- RecentsConfiguration config = RecentsConfiguration.getInstance();
- float radius = config.pxFromDp(Constants.Values.TaskView.RoundedCornerRadiusDps);
- outRect.inset((int) radius, (int) radius);
- }
return outRect;
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 35f873e..c3db55e 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -3176,8 +3176,9 @@
// The active window also determined events from which
// windows are delivered.
synchronized (mLock) {
+ mFocusedWindowId = getFocusedWindowId();
if (mWindowsForAccessibilityCallback == null
- && windowId == getFocusedWindowId()) {
+ && windowId == mFocusedWindowId) {
mActiveWindowId = windowId;
}
}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
index 2ef3d5f..7c3ab6f 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
@@ -115,6 +115,7 @@
"android.database.ContentObserver", // for Digital clock
"com.android.i18n.phonenumbers.*", // for TextView with autolink attribute
"android.app.DatePickerDialog", // b.android.com/28318
+ "android.app.TimePickerDialog", // b.android.com/61515
},
excludeClasses,
new String[] {