Merge "Fix jump cut when dismissing items in Recents" into jb-mr1-dev
diff --git a/api/17.txt b/api/17.txt
index 5406157..6079818 100644
--- a/api/17.txt
+++ b/api/17.txt
@@ -5827,6 +5827,7 @@
field public static final java.lang.String ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
field public static final java.lang.String ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY";
field public static final java.lang.String ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED";
+ field public static final java.lang.String ACTION_QUICK_CLOCK = "android.intent.action.QUICK_CLOCK";
field public static final java.lang.String ACTION_REBOOT = "android.intent.action.REBOOT";
field public static final java.lang.String ACTION_RUN = "android.intent.action.RUN";
field public static final java.lang.String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
diff --git a/api/current.txt b/api/current.txt
index 5205856..d6c75d1 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5832,6 +5832,7 @@
field public static final java.lang.String ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
field public static final java.lang.String ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY";
field public static final java.lang.String ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED";
+ field public static final java.lang.String ACTION_QUICK_CLOCK = "android.intent.action.QUICK_CLOCK";
field public static final java.lang.String ACTION_REBOOT = "android.intent.action.REBOOT";
field public static final java.lang.String ACTION_RUN = "android.intent.action.RUN";
field public static final java.lang.String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 6ef3651..ef9f6d4 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2700,6 +2700,7 @@
r.activity.mStartedActivity = false;
}
try {
+ r.activity.mFragments.noteStateNotSaved();
if (r.pendingIntents != null) {
deliverNewIntents(r, r.pendingIntents);
r.pendingIntents = null;
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index d4f6c06..c14a703 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2414,6 +2414,12 @@
public static final String ACTION_USER_INFO_CHANGED =
"android.intent.action.USER_INFO_CHANGED";
+ /**
+ * Sent when the user taps on the clock widget in the system's "quick settings" area.
+ */
+ public static final String ACTION_QUICK_CLOCK =
+ "android.intent.action.QUICK_CLOCK";
+
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Standard intent categories (see addCategory()).
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index f97354f..03b685b 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -47,24 +47,30 @@
*
* <p>Dreams should be declared in the manifest as follows:</p>
* <pre>
- * {@code
- * <service
+ * <service
* android:name=".MyDream"
* android:exported="true"
* android:icon="@drawable/my_icon"
* android:label="@string/my_dream_label" >
*
- * <intent-filter>
- * <action android:name="android.intent.action.MAIN" />
- * <category android:name="android.intent.category.DREAM" />
- * </intent-filter>
+ * <intent-filter>
+ * <action android:name="android.service.dreams.DreamService" />
+ * <category android:name="android.intent.category.DEFAULT" />
+ * </intent-filter>
*
- * <!-- Point to additional information for this dream (optional) -->
- * <meta-data
+ * <!-- Point to additional information for this dream (optional) -->
+ * <meta-data
* android:name="android.service.dream"
* android:resource="@xml/my_dream" />
- * </service>
- * }
+ * </service>
+ * </pre>
+ * <p>If specified, additional information for the dream is defined using the
+ * <code><{@link android.R.styleable#Dream dream}></code> element. For example:</p>
+ * <pre>
+ * (in res/xml/my_dream.xml)
+ *
+ * <dream xmlns:android="http://schemas.android.com/apk/res/android"
+ * android:settingsActivity="com.example.app/.MyDreamSettingsActivity" />
* </pre>
*/
public class DreamService extends Service implements Window.Callback {
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 63ec577..3ed47ea 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6466,11 +6466,6 @@
if (viewRootImpl != null) {
viewRootImpl.setAccessibilityFocus(this, null);
}
- if (mAttachInfo != null) {
- Rect rectangle = mAttachInfo.mTmpInvalRect;
- getDrawingRect(rectangle);
- requestRectangleOnScreen(rectangle);
- }
invalidate();
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
notifyAccessibilityStateChanged();
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index ba8cea4..4669c37 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -111,7 +111,7 @@
// Compute advances and store them
mShaper->computeValues(value.get(), paint,
- reinterpret_cast<const UChar*>(text), start, count,
+ reinterpret_cast<const UChar*>(key.getText()), start, count,
size_t(contextCount), int(dirFlags));
if (mDebugEnabled) {
@@ -139,15 +139,12 @@
// Update current cache size
mSize += size;
- // Copy the text when we insert the new entry
- key.internalTextCopy();
-
bool putOne = mCache.put(key, value);
LOG_ALWAYS_FATAL_IF(!putOne, "Failed to put an entry into the cache. "
"This indicates that the cache already has an entry with the "
"same key but it should not since we checked earlier!"
" - start = %d, count = %d, contextCount = %d - Text = '%s'",
- start, count, contextCount, String8(text + start, count).string());
+ start, count, contextCount, String8(key.getText() + start, count).string());
if (mDebugEnabled) {
nsecs_t totalTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime;
@@ -158,7 +155,7 @@
value.get(), start, count, contextCount, size, mMaxSize - mSize,
value->getElapsedTime() * 0.000001f,
(totalTime - value->getElapsedTime()) * 0.000001f,
- String8(text + start, count).string());
+ String8(key.getText() + start, count).string());
}
} else {
if (mDebugEnabled) {
@@ -168,7 +165,7 @@
" - Compute time %0.6f ms - Text = '%s'",
start, count, contextCount, size, mMaxSize - mSize,
value->getElapsedTime() * 0.000001f,
- String8(text + start, count).string());
+ String8(key.getText() + start, count).string());
}
}
} else {
@@ -188,7 +185,7 @@
value->getElapsedTime() * 0.000001f,
elapsedTimeThruCacheGet * 0.000001f,
deltaPercent,
- String8(text + start, count).string());
+ String8(key.getText() + start, count).string());
}
if (mCacheHitCount % DEFAULT_DUMP_STATS_CACHE_HIT_INTERVAL == 0) {
dumpCacheStats();
@@ -225,15 +222,16 @@
/**
* TextLayoutCacheKey
*/
-TextLayoutCacheKey::TextLayoutCacheKey(): text(NULL), start(0), count(0), contextCount(0),
+TextLayoutCacheKey::TextLayoutCacheKey(): start(0), count(0), contextCount(0),
dirFlags(0), typeface(NULL), textSize(0), textSkewX(0), textScaleX(0), flags(0),
hinting(SkPaint::kNo_Hinting), variant(SkPaint::kDefault_Variant), language() {
}
TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint, const UChar* text,
size_t start, size_t count, size_t contextCount, int dirFlags) :
- text(text), start(start), count(count), contextCount(contextCount),
+ start(start), count(count), contextCount(contextCount),
dirFlags(dirFlags) {
+ textCopy.setTo(text, contextCount);
typeface = paint->getTypeface();
textSize = paint->getTextSize();
textSkewX = paint->getTextSkewX();
@@ -245,7 +243,6 @@
}
TextLayoutCacheKey::TextLayoutCacheKey(const TextLayoutCacheKey& other) :
- text(NULL),
textCopy(other.textCopy),
start(other.start),
count(other.count),
@@ -259,9 +256,6 @@
hinting(other.hinting),
variant(other.variant),
language(other.language) {
- if (other.text) {
- textCopy.setTo(other.text, other.contextCount);
- }
}
int TextLayoutCacheKey::compare(const TextLayoutCacheKey& lhs, const TextLayoutCacheKey& rhs) {
@@ -304,11 +298,6 @@
return memcmp(lhs.getText(), rhs.getText(), lhs.contextCount * sizeof(UChar));
}
-void TextLayoutCacheKey::internalTextCopy() {
- textCopy.setTo(text, contextCount);
- text = NULL;
-}
-
size_t TextLayoutCacheKey::getSize() const {
return sizeof(TextLayoutCacheKey) + sizeof(UChar) * contextCount;
}
diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h
index 1f4e22c..9994393 100644
--- a/core/jni/android/graphics/TextLayoutCache.h
+++ b/core/jni/android/graphics/TextLayoutCache.h
@@ -77,20 +77,15 @@
TextLayoutCacheKey(const TextLayoutCacheKey& other);
/**
- * We need to copy the text when we insert the key into the cache itself.
- * We don't need to copy the text when we are only comparing keys.
- */
- void internalTextCopy();
-
- /**
* Get the size of the Cache key.
*/
size_t getSize() const;
static int compare(const TextLayoutCacheKey& lhs, const TextLayoutCacheKey& rhs);
+ inline const UChar* getText() const { return textCopy.string(); }
+
private:
- const UChar* text; // if text is NULL, use textCopy
String16 textCopy;
size_t start;
size_t count;
@@ -105,8 +100,6 @@
SkPaint::FontVariant variant;
SkLanguage language;
- inline const UChar* getText() const { return text ? text : textCopy.string(); }
-
}; // TextLayoutCacheKey
inline int strictly_order_type(const TextLayoutCacheKey& lhs, const TextLayoutCacheKey& rhs) {
@@ -316,6 +309,12 @@
TextLayoutEngine();
virtual ~TextLayoutEngine();
+ /**
+ * Note: this method currently does a defensive copy of the text argument, in case
+ * there is concurrent mutation of it. The contract may change, and may in the
+ * future require the caller to guarantee that the contents will not change during
+ * the call. Be careful of this when doing optimization.
+ **/
sp<TextLayoutValue> getValue(const SkPaint* paint, const jchar* text, jint start,
jint count, jint contextCount, jint dirFlags);
diff --git a/core/res/res/layout-land/keyguard_host_view.xml b/core/res/res/layout-land/keyguard_host_view.xml
index 18e23f0..ac943cb 100644
--- a/core/res/res/layout-land/keyguard_host_view.xml
+++ b/core/res/res/layout-land/keyguard_host_view.xml
@@ -28,17 +28,16 @@
android:orientation="horizontal">
<include layout="@layout/keyguard_widget_region"
- android:layout_width="0dip"
- android:layout_height="230dip"
- android:layout_weight=".45"/>
+ android:layout_width="0dp"
+ android:layout_weight=".45" />
<com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper
android:id="@+id/view_flipper"
- android:layout_width="0dip"
+ android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.55"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:gravity="center">
<!-- SelectorView is always used, so add it here. The rest are loaded dynamically -->
diff --git a/core/res/res/layout/keyguard_multi_user_avatar.xml b/core/res/res/layout/keyguard_multi_user_avatar.xml
index a3621c0..df3ee00 100644
--- a/core/res/res/layout/keyguard_multi_user_avatar.xml
+++ b/core/res/res/layout/keyguard_multi_user_avatar.xml
@@ -37,4 +37,4 @@
android:textSize="12sp"
android:background="#99FFFFFF"
android:textColor="#ff000000"/>
-</com.android.internal.policy.impl.keyguard.KeyguardMultiUserAvatar>
\ No newline at end of file
+</com.android.internal.policy.impl.keyguard.KeyguardMultiUserAvatar>
diff --git a/core/res/res/layout/keyguard_selector_view.xml b/core/res/res/layout/keyguard_selector_view.xml
index 710a78e..8ef3b75 100644
--- a/core/res/res/layout/keyguard_selector_view.xml
+++ b/core/res/res/layout/keyguard_selector_view.xml
@@ -29,10 +29,7 @@
<include layout="@layout/keyguard_widget_region"
android:layout_width="match_parent"
android:layout_height="0dip"
- android:layout_weight="0.45"
- android:layout_marginTop="35dip"
- android:layout_marginLeft="33dip"
- android:layout_marginRight="33dip"/>
+ android:layout_weight="0.45" />
<RelativeLayout
android:layout_width="wrap_content"
diff --git a/core/res/res/layout/keyguard_status_view.xml b/core/res/res/layout/keyguard_status_view.xml
index d8adc93..dc596f9 100644
--- a/core/res/res/layout/keyguard_status_view.xml
+++ b/core/res/res/layout/keyguard_status_view.xml
@@ -20,9 +20,9 @@
<!-- This is a view that shows general status information in Keyguard. -->
<com.android.internal.policy.impl.keyguard.KeyguardWidgetFrame
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/keyguard_status_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:id="@+id/keyguard_status_view"
android:gravity="center_horizontal">
<com.android.internal.policy.impl.keyguard.KeyguardStatusView
diff --git a/core/res/res/layout/keyguard_widget_region.xml b/core/res/res/layout/keyguard_widget_region.xml
index 123d105..42bf42b 100644
--- a/core/res/res/layout/keyguard_widget_region.xml
+++ b/core/res/res/layout/keyguard_widget_region.xml
@@ -25,43 +25,47 @@
android:visibility="gone"
android:gravity="center"
android:orientation="vertical">
- <Space
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1" />
<com.android.internal.policy.impl.keyguard.KeyguardWidgetPager
android:id="@+id/app_widget_container"
android:layout_width="match_parent"
- android:layout_height="@dimen/kg_widget_container_height">
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:clipChildren="false"
+ android:clipToPadding="false">
<!-- TODO: Remove this when supported as a widget -->
<include layout="@layout/keyguard_status_view"/>
<include layout="@layout/keyguard_transport_control_view"/>
</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
<LinearLayout
android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:orientation="horizontal">
+ android:layout_height="10dp"
+ android:orientation="horizontal"
+ android:paddingLeft="@dimen/kg_widget_pager_horizontal_padding"
+ android:paddingRight="@dimen/kg_widget_pager_horizontal_padding">
<com.android.internal.policy.impl.keyguard.KeyguardGlowStripView
android:id="@+id/left_strip"
- android:layout_width="0dip"
+ android:paddingTop="@dimen/kg_runway_lights_vertical_padding"
+ android:paddingBottom="@dimen/kg_runway_lights_vertical_padding"
+ android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
prvandroid:numDots="5"
- prvandroid:dotSize="7dip"
+ prvandroid:dotSize="@dimen/kg_runway_lights_height"
prvandroid:leftToRight="false"
prvandroid:glowDot="@*android:drawable/ic_lockscreen_glowdot" />
<Space
- android:layout_width="0dip"
+ android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.6"/>
<com.android.internal.policy.impl.keyguard.KeyguardGlowStripView
android:id="@+id/right_strip"
- android:layout_width="0dip"
+ android:paddingTop="@dimen/kg_runway_lights_vertical_padding"
+ android:paddingBottom="@dimen/kg_runway_lights_vertical_padding"
+ android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
prvandroid:numDots="5"
- prvandroid:dotSize="7dip"
+ prvandroid:dotSize="@dimen/kg_runway_lights_height"
prvandroid:leftToRight="true"
prvandroid:glowDot="@*android:drawable/ic_lockscreen_glowdot" />
</LinearLayout>
diff --git a/core/res/res/values-mcc310/config.xml b/core/res/res/values-mcc310/config.xml
new file mode 100644
index 0000000..df398f9
--- /dev/null
+++ b/core/res/res/values-mcc310/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Whether safe headphone volume is enabled or not (country specific). -->
+ <bool name="config_safe_media_volume_enabled">false</bool>
+
+</resources>
diff --git a/core/res/res/values-mcc311/config.xml b/core/res/res/values-mcc311/config.xml
new file mode 100644
index 0000000..df398f9
--- /dev/null
+++ b/core/res/res/values-mcc311/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Whether safe headphone volume is enabled or not (country specific). -->
+ <bool name="config_safe_media_volume_enabled">false</bool>
+
+</resources>
diff --git a/core/res/res/values-mcc312/config.xml b/core/res/res/values-mcc312/config.xml
new file mode 100644
index 0000000..df398f9
--- /dev/null
+++ b/core/res/res/values-mcc312/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Whether safe headphone volume is enabled or not (country specific). -->
+ <bool name="config_safe_media_volume_enabled">false</bool>
+
+</resources>
diff --git a/core/res/res/values-mcc313/config.xml b/core/res/res/values-mcc313/config.xml
new file mode 100644
index 0000000..df398f9
--- /dev/null
+++ b/core/res/res/values-mcc313/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Whether safe headphone volume is enabled or not (country specific). -->
+ <bool name="config_safe_media_volume_enabled">false</bool>
+
+</resources>
diff --git a/core/res/res/values-mcc314/config.xml b/core/res/res/values-mcc314/config.xml
new file mode 100644
index 0000000..df398f9
--- /dev/null
+++ b/core/res/res/values-mcc314/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Whether safe headphone volume is enabled or not (country specific). -->
+ <bool name="config_safe_media_volume_enabled">false</bool>
+
+</resources>
diff --git a/core/res/res/values-mcc315/config.xml b/core/res/res/values-mcc315/config.xml
new file mode 100644
index 0000000..df398f9
--- /dev/null
+++ b/core/res/res/values-mcc315/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Whether safe headphone volume is enabled or not (country specific). -->
+ <bool name="config_safe_media_volume_enabled">false</bool>
+
+</resources>
diff --git a/core/res/res/values-mcc316/config.xml b/core/res/res/values-mcc316/config.xml
new file mode 100644
index 0000000..df398f9
--- /dev/null
+++ b/core/res/res/values-mcc316/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Whether safe headphone volume is enabled or not (country specific). -->
+ <bool name="config_safe_media_volume_enabled">false</bool>
+
+</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index f143d50..d3d994f 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -964,4 +964,7 @@
on the headphone/microphone jack. When false use the older uevent framework. -->
<bool name="config_useDevInputEventForAudioJack">false</bool>
+ <!-- Whether safe headphone volume is enabled or not (country specific). -->
+ <bool name="config_safe_media_volume_enabled">true</bool>
+
</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 01a35b0..289adf4 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -254,9 +254,6 @@
<!-- Height of widget view in keyguard. -->
<dimen name="kg_widget_view_height">0dp</dimen>
- <!-- Padding surrounding each widget page -->
- <dimen name="kg_widget_page_padding">10dp</dimen>
-
<!-- Size of the clock font in keyguard's status view -->
<dimen name="kg_status_clock_font_size">94dp</dimen>
@@ -285,8 +282,20 @@
<!-- Space reserved at the bottom of secure views (pin/pattern/password/SIM pin/SIM puk) -->
<dimen name="kg_secure_padding_height">46dp</dimen>
- <!-- The height of the widget container -->
- <dimen name="kg_widget_container_height">200dp</dimen>
+ <!-- The height of the runway lights strip -->
+ <dimen name="kg_runway_lights_height">7dp</dimen>
+
+ <!-- The height of the runway lights strip -->
+ <dimen name="kg_runway_lights_vertical_padding">3dp</dimen>
+
+ <!-- Horizontal padding for the widget pager -->
+ <dimen name="kg_widget_pager_horizontal_padding">16dp</dimen>
+
+ <!-- Top padding for the widget pager -->
+ <dimen name="kg_widget_pager_top_padding">16dp</dimen>
+
+ <!-- Bottom padding for the widget pager -->
+ <dimen name="kg_widget_pager_bottom_padding">6dp</dimen>
<!-- Touch slop for the global toggle accessibility gesture -->
<dimen name="accessibility_touch_slop">80dip</dimen>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 0b30324..eb2b5a6 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -272,7 +272,8 @@
<java-symbol type="bool" name="config_bluetooth_default_profiles" />
<java-symbol type="bool" name="config_enableWifiDisplay" />
<java-symbol type="bool" name="config_useDevInputEventForAudioJack" />
-
+ <java-symbol type="bool" name="config_safe_media_volume_enabled" />
+
<java-symbol type="integer" name="config_cursorWindowSize" />
<java-symbol type="integer" name="config_longPressOnPowerBehavior" />
<java-symbol type="integer" name="config_max_pan_devices" />
@@ -1184,7 +1185,9 @@
<java-symbol type="dimen" name="navigation_bar_height_landscape" />
<java-symbol type="dimen" name="navigation_bar_width" />
<java-symbol type="dimen" name="status_bar_height" />
- <java-symbol type="dimen" name="kg_widget_page_padding" />
+ <java-symbol type="dimen" name="kg_widget_pager_horizontal_padding" />
+ <java-symbol type="dimen" name="kg_widget_pager_top_padding" />
+ <java-symbol type="dimen" name="kg_widget_pager_bottom_padding" />
<java-symbol type="drawable" name="ic_jog_dial_sound_off" />
<java-symbol type="drawable" name="ic_jog_dial_sound_on" />
<java-symbol type="drawable" name="ic_jog_dial_unlock" />
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index a754ef3..fdb6818 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -63,6 +63,7 @@
import android.provider.Settings.System;
import android.speech.RecognizerIntent;
import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
@@ -155,6 +156,8 @@
private static final int MSG_SET_FORCE_RSX_USE = 24; // force remote submix audio routing
private static final int MSG_CHECK_MUSIC_ACTIVE = 25;
private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 26;
+ private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 27;
+ private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 28;
// flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be
// persisted
@@ -429,6 +432,8 @@
AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET |
AudioSystem.DEVICE_OUT_ALL_USB;
+ private final boolean mMonitorOrientation;
+
///////////////////////////////////////////////////////////////////////////
// Construction
///////////////////////////////////////////////////////////////////////////
@@ -439,8 +444,6 @@
mContentResolver = context.getContentResolver();
mVoiceCapable = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_voice_capable);
- mSafeMediaVolumeIndex = mContext.getResources().getInteger(
- com.android.internal.R.integer.config_safe_media_volume_index) * 10;
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
@@ -465,13 +468,10 @@
updateStreamVolumeAlias(false /*updateVolumes*/);
createStreamStates();
- mSafeMediaVolumeEnabled = new Boolean(true);
- synchronized (mSafeMediaVolumeEnabled) {
- enforceSafeMediaVolume();
- }
-
mMediaServerOk = true;
+ mSafeMediaVolumeState = new Integer(SAFE_MEDIA_VOLUME_NOT_CONFIGURED);
+
// Call setRingerModeInt() to apply correct mute
// state on streams affected by ringer mode.
mRingerModeMutedStreams = 0;
@@ -491,11 +491,12 @@
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
intentFilter.addAction(Intent.ACTION_USER_SWITCHED);
+ intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
// Register a configuration change listener only if requested by system properties
// to monitor orientation changes (off by default)
- if (SystemProperties.getBoolean("ro.audio.monitorOrientation", false)) {
+ mMonitorOrientation = SystemProperties.getBoolean("ro.audio.monitorOrientation", false);
+ if (mMonitorOrientation) {
Log.v(TAG, "monitoring device orientation");
- intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
// initialize orientation in AudioSystem
setOrientationForAudioSystem();
}
@@ -1748,8 +1749,8 @@
checkAllAliasStreamVolumes();
- synchronized (mSafeMediaVolumeEnabled) {
- if (mSafeMediaVolumeEnabled) {
+ synchronized (mSafeMediaVolumeState) {
+ if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) {
enforceSafeMediaVolume();
}
}
@@ -2212,8 +2213,8 @@
}
private void onCheckMusicActive() {
- synchronized (mSafeMediaVolumeEnabled) {
- if (!mSafeMediaVolumeEnabled) {
+ synchronized (mSafeMediaVolumeState) {
+ if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE) {
int device = getDeviceForStream(AudioSystem.STREAM_MUSIC);
if ((device & mSafeMediaVolumeDevices) != 0) {
@@ -2241,6 +2242,25 @@
}
}
+ private void onConfigureSafeVolume(boolean force) {
+ synchronized (mSafeMediaVolumeState) {
+ int mcc = mContext.getResources().getConfiguration().mcc;
+ if ((mMcc != mcc) || ((mMcc == 0) && force)) {
+ mSafeMediaVolumeIndex = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_safe_media_volume_index) * 10;
+ boolean safeMediaVolumeEnabled = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_safe_media_volume_enabled);
+ if (safeMediaVolumeEnabled) {
+ mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE;
+ enforceSafeMediaVolume();
+ } else {
+ mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_DISABLED;
+ }
+ mMcc = mcc;
+ }
+ }
+ }
+
///////////////////////////////////////////////////////////////////////////
// Internal methods
///////////////////////////////////////////////////////////////////////////
@@ -3185,7 +3205,7 @@
restoreMasterVolume();
// Reset device orientation (if monitored for this device)
- if (SystemProperties.getBoolean("ro.audio.monitorOrientation", false)) {
+ if (mMonitorOrientation) {
setOrientationForAudioSystem();
}
@@ -3290,6 +3310,11 @@
case MSG_BROADCAST_AUDIO_BECOMING_NOISY:
onSendBecomingNoisyIntent();
break;
+
+ case MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED:
+ case MSG_CONFIGURE_SAFE_MEDIA_VOLUME:
+ onConfigureSafeVolume((msg.what == MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED));
+ break;
}
}
}
@@ -3739,6 +3764,14 @@
adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
BluetoothProfile.A2DP);
}
+
+ sendMsg(mAudioHandler,
+ MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED,
+ SENDMSG_REPLACE,
+ 0,
+ 0,
+ null,
+ SAFE_VOLUME_CONFIGURE_TIMEOUT_MS);
} else if (action.equals(Intent.ACTION_PACKAGE_REMOVED)) {
if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
// a package is being removed, not replaced
@@ -5512,11 +5545,21 @@
try {
// reading new orientation "safely" (i.e. under try catch) in case anything
// goes wrong when obtaining resources and configuration
- int newOrientation = context.getResources().getConfiguration().orientation;
- if (newOrientation != mDeviceOrientation) {
- mDeviceOrientation = newOrientation;
- setOrientationForAudioSystem();
+ Configuration config = context.getResources().getConfiguration();
+ if (mMonitorOrientation) {
+ int newOrientation = config.orientation;
+ if (newOrientation != mDeviceOrientation) {
+ mDeviceOrientation = newOrientation;
+ setOrientationForAudioSystem();
+ }
}
+ sendMsg(mAudioHandler,
+ MSG_CONFIGURE_SAFE_MEDIA_VOLUME,
+ SENDMSG_REPLACE,
+ 0,
+ 0,
+ null,
+ 0);
} catch (Exception e) {
Log.e(TAG, "Error retrieving device orientation: " + e);
}
@@ -5587,12 +5630,21 @@
// overlay.
//==========================================================================================
- // mSafeMediaVolumeEnabled indicates whether the media volume is limited over headphones.
- // It is true by default when headphones or a headset are inserted and can be overriden by
- // calling AudioService.disableSafeMediaVolume() (when user opts out).
- private Boolean mSafeMediaVolumeEnabled;
+ // mSafeMediaVolumeState indicates whether the media volume is limited over headphones.
+ // It is SAFE_MEDIA_VOLUME_NOT_CONFIGURED at boot time until a network service is connected
+ // or the configure time is elapsed. It is then set to SAFE_MEDIA_VOLUME_ACTIVE or
+ // SAFE_MEDIA_VOLUME_DISABLED according to country option. If not SAFE_MEDIA_VOLUME_DISABLED, it
+ // can be set to SAFE_MEDIA_VOLUME_INACTIVE by calling AudioService.disableSafeMediaVolume()
+ // (when user opts out).
+ private final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0;
+ private final int SAFE_MEDIA_VOLUME_DISABLED = 1;
+ private final int SAFE_MEDIA_VOLUME_INACTIVE = 2;
+ private final int SAFE_MEDIA_VOLUME_ACTIVE = 3;
+ private Integer mSafeMediaVolumeState;
+
+ private int mMcc = 0;
// mSafeMediaVolumeIndex is the cached value of config_safe_media_volume_index property
- private final int mSafeMediaVolumeIndex;
+ private int mSafeMediaVolumeIndex;
// mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced,
private final int mSafeMediaVolumeDevices = AudioSystem.DEVICE_OUT_WIRED_HEADSET |
AudioSystem.DEVICE_OUT_WIRED_HEADPHONE;
@@ -5602,22 +5654,27 @@
private int mMusicActiveMs;
private static final int UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX = (20 * 3600 * 1000); // 20 hours
private static final int MUSIC_ACTIVE_POLL_PERIOD_MS = 60000; // 1 minute polling interval
+ private static final int SAFE_VOLUME_CONFIGURE_TIMEOUT_MS = 30000; // 30s after boot completed
private void setSafeMediaVolumeEnabled(boolean on) {
- synchronized (mSafeMediaVolumeEnabled) {
- if (on && !mSafeMediaVolumeEnabled) {
- enforceSafeMediaVolume();
- } else if (!on && mSafeMediaVolumeEnabled) {
- mMusicActiveMs = 0;
- sendMsg(mAudioHandler,
- MSG_CHECK_MUSIC_ACTIVE,
- SENDMSG_REPLACE,
- 0,
- 0,
- null,
- MUSIC_ACTIVE_POLL_PERIOD_MS);
+ synchronized (mSafeMediaVolumeState) {
+ if ((mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_NOT_CONFIGURED) &&
+ (mSafeMediaVolumeState != SAFE_MEDIA_VOLUME_DISABLED)) {
+ if (on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_INACTIVE)) {
+ mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE;
+ enforceSafeMediaVolume();
+ } else if (!on && (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE)) {
+ mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_INACTIVE;
+ mMusicActiveMs = 0;
+ sendMsg(mAudioHandler,
+ MSG_CHECK_MUSIC_ACTIVE,
+ SENDMSG_REPLACE,
+ 0,
+ 0,
+ null,
+ MUSIC_ACTIVE_POLL_PERIOD_MS);
+ }
}
- mSafeMediaVolumeEnabled = on;
}
}
@@ -5659,8 +5716,8 @@
}
private boolean checkSafeMediaVolume(int streamType, int index, int device) {
- synchronized (mSafeMediaVolumeEnabled) {
- if (mSafeMediaVolumeEnabled &&
+ synchronized (mSafeMediaVolumeState) {
+ if ((mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE) &&
(mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) &&
((device & mSafeMediaVolumeDevices) != 0) &&
(index > mSafeMediaVolumeIndex)) {
@@ -5672,7 +5729,7 @@
}
public void disableSafeMediaVolume() {
- synchronized (mSafeMediaVolumeEnabled) {
+ synchronized (mSafeMediaVolumeState) {
setSafeMediaVolumeEnabled(false);
}
}
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
index c293fe6..10e313e 100644
--- a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
@@ -24,13 +24,16 @@
android:layout_width="wrap_content"
android:paddingLeft="@dimen/status_bar_recents_item_padding"
android:paddingRight="@dimen/status_bar_recents_item_padding"
- android:importantForAccessibility="no">
+ android:importantForAccessibility="no"
+ android:clipChildren="false">
<RelativeLayout android:id="@+id/recent_item"
android:layout_gravity="center_vertical"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:paddingTop="@*android:dimen/status_bar_height">
+ android:paddingTop="@*android:dimen/status_bar_height"
+ android:clipChildren="false"
+ android:clipToPadding="false">
<FrameLayout android:id="@+id/app_thumbnail"
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index ffcead0..7f6098a 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -29,6 +29,12 @@
android:layout_marginLeft="@dimen/notification_panel_margin_left"
>
+ <View
+ android:id="@+id/handle"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/close_handle_height"
+ />
+
<include
layout="@layout/carrier_label"
android:layout_height="@dimen/carrier_label_height"
@@ -75,10 +81,4 @@
/>
</ScrollView>
</LinearLayout>
-
- <View
- android:id="@+id/handle"
- android:layout_width="match_parent"
- android:layout_height="@dimen/close_handle_height"
- />
</com.android.systemui.statusbar.phone.NotificationPanelView><!-- end of sliding panel -->
diff --git a/packages/SystemUI/res/layout/status_bar_recent_item.xml b/packages/SystemUI/res/layout/status_bar_recent_item.xml
index fc247d6..e2b5723 100644
--- a/packages/SystemUI/res/layout/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout/status_bar_recent_item.xml
@@ -24,12 +24,14 @@
android:layout_width="match_parent"
android:paddingTop="@dimen/status_bar_recents_item_padding"
android:paddingBottom="@dimen/status_bar_recents_item_padding"
+ android:clipChildren="false"
android:importantForAccessibility="no">
<RelativeLayout android:id="@+id/recent_item"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content"
- android:layout_width="wrap_content">
+ android:layout_width="wrap_content"
+ android:clipChildren="false">
<TextView android:id="@+id/app_label"
android:layout_width="@dimen/status_bar_recents_app_label_width"
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 62289fb..5023d23 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -50,6 +50,10 @@
<dimen name="status_bar_recents_app_label_left_margin">0dip</dimen>
<!-- Padding between recents items -->
<dimen name="status_bar_recents_item_padding">0dip</dimen>
+ <!-- When recents first appears, how far the icon and label of the primary activity
+ travel -->
+ <dimen name="status_bar_recents_app_icon_translate_distance">100dp</dimen>
+
<!-- Where to place the app icon over the thumbnail -->
<dimen name="status_bar_recents_app_icon_left_margin">0dp</dimen>
<dimen name="status_bar_recents_app_icon_top_margin">8dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 58f749a..2b74f56 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -399,7 +399,7 @@
<string name="jelly_bean_dream_name">BeanFlinger</string>
<!-- Name of the launcher shortcut icon that allows dreams to be started immediately [CHAR LIMIT=20] -->
- <string name="start_dreams">Start dreams</string>
+ <string name="start_dreams">Sleep Now</string>
<!-- Textual description of Ethernet connections -->
<string name="ethernet_label">Ethernet</string>
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index f97d4ff..c120690 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -19,9 +19,12 @@
import android.app.Application;
import com.android.systemui.recent.RecentTasksLoader;
+import com.android.systemui.recent.RecentsActivity;
public class SystemUIApplication extends Application {
private RecentTasksLoader mRecentTasksLoader;
+ private boolean mWaitingForWinAnimStart;
+ private RecentsActivity.WindowAnimationStartListener mWinAnimStartListener;
public RecentTasksLoader getRecentTasksLoader() {
if (mRecentTasksLoader == null) {
@@ -29,4 +32,28 @@
}
return mRecentTasksLoader;
}
+
+ public void setWaitingForWinAnimStart(boolean waiting) {
+ mWaitingForWinAnimStart = waiting;
+ }
+
+ public void setWindowAnimationStartListener(
+ RecentsActivity.WindowAnimationStartListener startListener) {
+ mWinAnimStartListener = startListener;
+ }
+
+ public RecentsActivity.WindowAnimationStartListener getWindowAnimationListener() {
+ return mWinAnimStartListener;
+ }
+
+ public void onWindowAnimationStart() {
+ if (mWinAnimStartListener != null) {
+ mWinAnimStartListener.onWindowAnimationStart();
+ }
+ mWaitingForWinAnimStart = false;
+ }
+
+ public boolean isWaitingForWindowAnimationStart() {
+ return mWaitingForWinAnimStart;
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
index 7ff7b17..f93da08 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
@@ -51,6 +51,10 @@
}
};
+ public static interface WindowAnimationStartListener {
+ void onWindowAnimationStart();
+ }
+
public class TouchOutsideListener implements View.OnTouchListener {
private StatusBarPanel mPanel;
@@ -88,15 +92,15 @@
@Override
public void onStart() {
mShowing = true;
+ if (mRecentsPanel != null) {
+ mRecentsPanel.refreshViews();
+ }
super.onStart();
}
@Override
public void onResume() {
mForeground = true;
- if (mRecentsPanel != null) {
- mRecentsPanel.refreshViews();
- }
super.onResume();
}
@@ -150,6 +154,7 @@
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(CLOSE_RECENTS_INTENT);
registerReceiver(mIntentReceiver, mIntentFilter);
+ app.setWindowAnimationStartListener(mRecentsPanel);
super.onCreate(savedInstanceState);
}
@@ -164,6 +169,7 @@
final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader();
recentTasksLoader.setRecentsPanel(null, mRecentsPanel);
unregisterReceiver(mIntentReceiver);
+ app.setWindowAnimationStartListener(null);
super.onDestroy();
}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index 005b4a2..3a89059 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -18,12 +18,15 @@
import android.animation.Animator;
import android.animation.LayoutTransition;
+import android.animation.TimeInterpolator;
+import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.ActivityOptions;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
@@ -45,6 +48,7 @@
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.AnimationUtils;
+import android.view.animation.DecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
@@ -55,6 +59,7 @@
import android.widget.TextView;
import com.android.systemui.R;
+import com.android.systemui.SystemUIApplication;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.tablet.StatusBarPanel;
@@ -63,7 +68,7 @@
import java.util.ArrayList;
public class RecentsPanelView extends FrameLayout implements OnItemClickListener, RecentsCallback,
- StatusBarPanel, Animator.AnimatorListener {
+ StatusBarPanel, Animator.AnimatorListener, RecentsActivity.WindowAnimationStartListener {
static final String TAG = "RecentsPanelView";
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
private PopupMenu mPopup;
@@ -75,6 +80,7 @@
private boolean mShowing;
private boolean mWaitingToShow;
private int mNumItemsWaitingForThumbnailsAndIcons;
+ private ViewHolder mItemToAnimateInWhenWindowAnimationIsFinished;
private RecentTasksLoader mRecentTasksLoader;
private ArrayList<TaskDescription> mRecentTaskDescriptions;
@@ -109,6 +115,7 @@
ImageView iconView;
TextView labelView;
TextView descriptionView;
+ View calloutLine;
TaskDescription taskDescription;
boolean loadedThumbnailAndIcon;
}
@@ -148,6 +155,7 @@
holder.iconView.setImageBitmap(mRecentTasksLoader.getDefaultIcon());
}
holder.labelView = (TextView) convertView.findViewById(R.id.app_label);
+ holder.calloutLine = convertView.findViewById(R.id.recents_callout_line);
holder.descriptionView = (TextView) convertView.findViewById(R.id.app_description);
convertView.setTag(holder);
@@ -173,6 +181,28 @@
updateIcon(holder, td.getIcon(), true, false);
mNumItemsWaitingForThumbnailsAndIcons--;
}
+ if (index == 0) {
+ final Activity activity = (Activity) RecentsPanelView.this.getContext();
+ final SystemUIApplication app = (SystemUIApplication) activity.getApplication();
+ if (app.isWaitingForWindowAnimationStart()) {
+ mItemToAnimateInWhenWindowAnimationIsFinished = holder;
+ final int translation = -getResources().getDimensionPixelSize(
+ R.dimen.status_bar_recents_app_icon_translate_distance);
+ final Configuration config = getResources().getConfiguration();
+ if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ for (View v :
+ new View[] { holder.iconView, holder.labelView, holder.calloutLine }) {
+ if (v != null) {
+ v.setAlpha(0f);
+ v.setTranslationX(translation);
+ }
+ }
+ } else {
+ holder.iconView.setAlpha(0f);
+ holder.iconView.setTranslationY(translation);
+ }
+ }
+ }
holder.thumbnailView.setTag(td);
holder.thumbnailView.setOnLongClickListener(new OnLongClickDelegate(convertView));
@@ -506,6 +536,23 @@
return null;
}
+ public void onWindowAnimationStart() {
+ if (mItemToAnimateInWhenWindowAnimationIsFinished != null) {
+ final int startDelay = 100;
+ final int duration = 250;
+ final ViewHolder holder = mItemToAnimateInWhenWindowAnimationIsFinished;
+ final TimeInterpolator cubic = new DecelerateInterpolator(1.5f);
+ for (View v :
+ new View[] { holder.iconView, holder.labelView, holder.calloutLine }) {
+ if (v != null) {
+ v.animate().translationX(0).translationY(0).alpha(1f).setStartDelay(startDelay)
+ .setDuration(duration).setInterpolator(cubic);
+ }
+ }
+ mItemToAnimateInWhenWindowAnimationIsFinished = null;
+ }
+ }
+
public void clearRecentTasksList() {
// Clear memory used by screenshots
if (mRecentTaskDescriptions != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
index a0f197dd..5e0df49 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
@@ -165,19 +165,18 @@
}
setLayoutTransition(transitioner);
- // Scroll to end after layout.
- final ViewTreeObserver observer = getViewTreeObserver();
-
+ // Scroll to end after initial layout.
final OnGlobalLayoutListener updateScroll = new OnGlobalLayoutListener() {
public void onGlobalLayout() {
mLastScrollPosition = scrollPositionOfMostRecent();
scrollTo(0, mLastScrollPosition);
+ final ViewTreeObserver observer = getViewTreeObserver();
if (observer.isAlive()) {
observer.removeOnGlobalLayoutListener(this);
}
}
};
- observer.addOnGlobalLayoutListener(updateScroll);
+ getViewTreeObserver().addOnGlobalLayoutListener(updateScroll);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index d7b1b35..e88f9cd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -544,7 +544,7 @@
- p.getFontMetricsInt().top;
float descriptionTextSize = res
.getDimensionPixelSize(R.dimen.status_bar_recents_app_description_text_size);
- p.setTextSize(labelTextSize);
+ p.setTextSize(descriptionTextSize);
float descriptionTextHeight = p.getFontMetricsInt().bottom
- p.getFontMetricsInt().top;
@@ -567,10 +567,17 @@
+ recentsItemTopPadding + thumbBgPadding + statusBarHeight);
}
+ final SystemUIApplication app =
+ (SystemUIApplication) ((Service) mContext).getApplication();
+ app.setWaitingForWinAnimStart(true);
ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation(
getStatusBarView(),
first, x, y,
- null);
+ new ActivityOptions.OnAnimationStartedListener() {
+ public void onAnimationStarted() {
+ app.onWindowAnimationStart();
+ }
+ });
mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
UserHandle.USER_CURRENT));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
index d63d517..c31e138 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -275,7 +275,8 @@
timeTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- startSettingsActivity(android.provider.Settings.ACTION_DATE_SETTINGS);
+ // Quick. Clock. Quick. Clock. Quick. Clock.
+ startSettingsActivity(Intent.ACTION_QUICK_CLOCK);
}
});
mModel.addTimeTile(timeTile, new QuickSettingsModel.RefreshCallback() {
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
index 70a6ffa..d17c128 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java
@@ -33,7 +33,6 @@
public class KeyguardWidgetFrame extends FrameLayout {
private final static PorterDuffXfermode sAddBlendMode =
new PorterDuffXfermode(PorterDuff.Mode.ADD);
- private static int sWidgetPagePadding;
private static Drawable sLeftOverscrollDrawable;
private static Drawable sRightOverscrollDrawable;
@@ -52,13 +51,16 @@
public KeyguardWidgetFrame(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+ Resources res = context.getResources();
if (sLeftOverscrollDrawable == null) {
- Resources res = context.getResources();
sLeftOverscrollDrawable = res.getDrawable(R.drawable.kg_widget_overscroll_layer_left);
sRightOverscrollDrawable = res.getDrawable(R.drawable.kg_widget_overscroll_layer_right);
- sWidgetPagePadding = res.getDimensionPixelSize(R.dimen.kg_widget_page_padding);
}
- setPadding(sWidgetPagePadding, sWidgetPagePadding, sWidgetPagePadding, sWidgetPagePadding);
+
+ int hPadding = res.getDimensionPixelSize(R.dimen.kg_widget_pager_horizontal_padding);
+ int topPadding = res.getDimensionPixelSize(R.dimen.kg_widget_pager_top_padding);
+ int bottomPadding = res.getDimensionPixelSize(R.dimen.kg_widget_pager_bottom_padding);
+ setPadding(hPadding, topPadding, hPadding, bottomPadding);
}
@Override
@@ -76,8 +78,8 @@
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
- mForegroundRect.set(sWidgetPagePadding, sWidgetPagePadding,
- w - sWidgetPagePadding, h - sWidgetPagePadding);
+ mForegroundRect.set(getPaddingLeft(), getPaddingTop(),
+ w - getPaddingRight(), h - getPaddingBottom());
}
void setOverScrollAmount(float r, boolean left) {
diff --git a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
index f1a03de..eb414fa 100644
--- a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
+++ b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -119,13 +119,16 @@
mCurrentDeviceId = deviceId;
}
mPm.userActivity(event.getEventTime(), false);
- MotionEvent motionEvent = (MotionEvent) event;
- mEventHandler.onMotionEvent(motionEvent, policyFlags);
+ MotionEvent rawEvent = (MotionEvent) event;
+ MotionEvent transformedEvent = MotionEvent.obtain(rawEvent);
+ mEventHandler.onMotionEvent(transformedEvent, rawEvent, policyFlags);
+ transformedEvent.recycle();
}
@Override
- public void onMotionEvent(MotionEvent event, int policyFlags) {
- sendInputEvent(event, policyFlags);
+ public void onMotionEvent(MotionEvent transformedEvent, MotionEvent rawEvent,
+ int policyFlags) {
+ sendInputEvent(transformedEvent, policyFlags);
}
@Override
diff --git a/services/java/com/android/server/accessibility/EventStreamTransformation.java b/services/java/com/android/server/accessibility/EventStreamTransformation.java
index b715570..3289a15 100644
--- a/services/java/com/android/server/accessibility/EventStreamTransformation.java
+++ b/services/java/com/android/server/accessibility/EventStreamTransformation.java
@@ -57,12 +57,15 @@
interface EventStreamTransformation {
/**
- * Receives a motion event.
+ * Receives motion event. Passed are the event transformed by previous
+ * transformations and the raw event to which no transformations have
+ * been applied.
*
- * @param event The motion event.
+ * @param event The transformed motion event.
+ * @param rawEvent The raw motion event.
* @param policyFlags Policy flags for the event.
*/
- public void onMotionEvent(MotionEvent event, int policyFlags);
+ public void onMotionEvent(MotionEvent event, MotionEvent rawEvent, int policyFlags);
/**
* Receives an accessibility event.
diff --git a/services/java/com/android/server/accessibility/ScreenMagnifier.java b/services/java/com/android/server/accessibility/ScreenMagnifier.java
index b7327080..f20eff1 100644
--- a/services/java/com/android/server/accessibility/ScreenMagnifier.java
+++ b/services/java/com/android/server/accessibility/ScreenMagnifier.java
@@ -203,14 +203,15 @@
}
@Override
- public void onMotionEvent(MotionEvent event, int policyFlags) {
+ public void onMotionEvent(MotionEvent event, MotionEvent rawEvent,
+ int policyFlags) {
mMagnifiedContentInteractonStateHandler.onMotionEvent(event);
switch (mCurrentState) {
case STATE_DELEGATING: {
- handleMotionEventStateDelegating(event, policyFlags);
+ handleMotionEventStateDelegating(event, rawEvent, policyFlags);
} break;
case STATE_DETECTING: {
- mDetectingStateHandler.onMotionEvent(event, policyFlags);
+ mDetectingStateHandler.onMotionEvent(event, rawEvent, policyFlags);
} break;
case STATE_VIEWPORT_DRAGGING: {
mStateViewportDraggingHandler.onMotionEvent(event, policyFlags);
@@ -259,7 +260,8 @@
mScreenStateObserver.destroy();
}
- private void handleMotionEventStateDelegating(MotionEvent event, int policyFlags) {
+ private void handleMotionEventStateDelegating(MotionEvent event,
+ MotionEvent rawEvent, int policyFlags) {
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
if (mDetectingStateHandler.mDelayedEventQueue == null) {
transitionToState(STATE_DETECTING);
@@ -290,7 +292,7 @@
coords, 0, 0, 1.0f, 1.0f, event.getDeviceId(), 0, event.getSource(),
event.getFlags());
}
- mNext.onMotionEvent(event, policyFlags);
+ mNext.onMotionEvent(event, rawEvent, policyFlags);
}
}
@@ -533,8 +535,8 @@
}
};
- public void onMotionEvent(MotionEvent event, int policyFlags) {
- cacheDelayedMotionEvent(event, policyFlags);
+ public void onMotionEvent(MotionEvent event, MotionEvent rawEvent, int policyFlags) {
+ cacheDelayedMotionEvent(event, rawEvent, policyFlags);
final int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN: {
@@ -640,8 +642,10 @@
}
}
- private void cacheDelayedMotionEvent(MotionEvent event, int policyFlags) {
- MotionEventInfo info = MotionEventInfo.obtain(event, policyFlags);
+ private void cacheDelayedMotionEvent(MotionEvent event, MotionEvent rawEvent,
+ int policyFlags) {
+ MotionEventInfo info = MotionEventInfo.obtain(event, rawEvent,
+ policyFlags);
if (mDelayedEventQueue == null) {
mDelayedEventQueue = info;
} else {
@@ -657,7 +661,8 @@
while (mDelayedEventQueue != null) {
MotionEventInfo info = mDelayedEventQueue;
mDelayedEventQueue = info.mNext;
- ScreenMagnifier.this.onMotionEvent(info.mEvent, info.mPolicyFlags);
+ ScreenMagnifier.this.onMotionEvent(info.mEvent, info.mRawEvent,
+ info.mPolicyFlags);
info.recycle();
}
}
@@ -738,9 +743,11 @@
private boolean mInPool;
public MotionEvent mEvent;
+ public MotionEvent mRawEvent;
public int mPolicyFlags;
- public static MotionEventInfo obtain(MotionEvent event, int policyFlags) {
+ public static MotionEventInfo obtain(MotionEvent event, MotionEvent rawEvent,
+ int policyFlags) {
synchronized (sLock) {
MotionEventInfo info;
if (sPoolSize > 0) {
@@ -752,13 +759,15 @@
} else {
info = new MotionEventInfo();
}
- info.initialize(event, policyFlags);
+ info.initialize(event, rawEvent, policyFlags);
return info;
}
}
- private void initialize(MotionEvent event, int policyFlags) {
+ private void initialize(MotionEvent event, MotionEvent rawEvent,
+ int policyFlags) {
mEvent = MotionEvent.obtain(event);
+ mRawEvent = MotionEvent.obtain(rawEvent);
mPolicyFlags = policyFlags;
}
@@ -780,6 +789,8 @@
private void clear() {
mEvent.recycle();
mEvent = null;
+ mRawEvent.recycle();
+ mRawEvent = null;
mPolicyFlags = 0;
}
}
diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java
index 6e57d1f..616bc13 100644
--- a/services/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/java/com/android/server/accessibility/TouchExplorer.java
@@ -162,7 +162,7 @@
private EventStreamTransformation mNext;
// Helper to track gesture velocity.
- private VelocityTracker mVelocityTracker;
+ private final VelocityTracker mVelocityTracker = VelocityTracker.obtain();
// Helper class to track received pointers.
private final ReceivedPointerTracker mReceivedPointerTracker;
@@ -309,18 +309,18 @@
}
@Override
- public void onMotionEvent(MotionEvent event, int policyFlags) {
+ public void onMotionEvent(MotionEvent event, MotionEvent rawEvent, int policyFlags) {
if (DEBUG) {
Slog.d(LOG_TAG, "Received event: " + event + ", policyFlags=0x"
+ Integer.toHexString(policyFlags));
Slog.d(LOG_TAG, getStateSymbolicName(mCurrentState));
}
- mReceivedPointerTracker.onMotionEvent(event);
+ mReceivedPointerTracker.onMotionEvent(rawEvent);
switch(mCurrentState) {
case STATE_TOUCH_EXPLORING: {
- handleMotionEventStateTouchExploring(event, policyFlags);
+ handleMotionEventStateTouchExploring(event, rawEvent, policyFlags);
} break;
case STATE_DRAGGING: {
handleMotionEventStateDragging(event, policyFlags);
@@ -329,7 +329,7 @@
handleMotionEventStateDelegating(event, policyFlags);
} break;
case STATE_GESTURE_DETECTING: {
- handleMotionEventGestureDetecting(event, policyFlags);
+ handleMotionEventGestureDetecting(rawEvent, policyFlags);
} break;
default:
throw new IllegalStateException("Illegal state: " + mCurrentState);
@@ -382,16 +382,15 @@
* Handles a motion event in touch exploring state.
*
* @param event The event to be handled.
+ * @param rawEvent The raw (unmodified) motion event.
* @param policyFlags The policy flags associated with the event.
*/
- private void handleMotionEventStateTouchExploring(MotionEvent event, int policyFlags) {
+ private void handleMotionEventStateTouchExploring(MotionEvent event, MotionEvent rawEvent,
+ int policyFlags) {
ReceivedPointerTracker receivedTracker = mReceivedPointerTracker;
final int activePointerCount = receivedTracker.getActivePointerCount();
- if (mVelocityTracker == null) {
- mVelocityTracker = VelocityTracker.obtain();
- }
- mVelocityTracker.addMovement(event);
+ mVelocityTracker.addMovement(rawEvent);
mDoubleTapDetector.onMotionEvent(event, policyFlags);
@@ -410,7 +409,7 @@
// have a distance slop before getting into gesture detection
// mode and not using the points within this slop significantly
// decreases the quality of gesture recognition.
- handleMotionEventGestureDetecting(event, policyFlags);
+ handleMotionEventGestureDetecting(rawEvent, policyFlags);
//$FALL-THROUGH$
case MotionEvent.ACTION_POINTER_DOWN: {
switch (activePointerCount) {
@@ -471,12 +470,13 @@
// have a distance slop before getting into gesture detection
// mode and not using the points within this slop significantly
// decreases the quality of gesture recognition.
- handleMotionEventGestureDetecting(event, policyFlags);
-
+ handleMotionEventGestureDetecting(rawEvent, policyFlags);
+ // It is *important* to use the distance traveled by the pointers
+ // on the screen which may or may not be magnified.
final float deltaX = receivedTracker.getReceivedPointerDownX(pointerId)
- - event.getX(pointerIndex);
+ - rawEvent.getX(pointerIndex);
final float deltaY = receivedTracker.getReceivedPointerDownY(pointerId)
- - event.getY(pointerIndex);
+ - rawEvent.getY(pointerIndex);
final double moveDelta = Math.hypot(deltaX, deltaY);
// The user has moved enough for us to decide.
if (moveDelta > mDoubleTapSlop) {
@@ -491,6 +491,7 @@
// We have to perform gesture detection, so
// clear the current state and try to detect.
mCurrentState = STATE_GESTURE_DETECTING;
+ mVelocityTracker.clear();
mSendHoverEnterDelayed.remove();
mSendHoverExitDelayed.remove();
mPerformLongPressDelayed.remove();
@@ -535,10 +536,12 @@
// If the user is touch exploring the second pointer may be
// performing a double tap to activate an item without need
// for the user to lift his exploring finger.
+ // It is *important* to use the distance traveled by the pointers
+ // on the screen which may or may not be magnified.
final float deltaX = receivedTracker.getReceivedPointerDownX(pointerId)
- - event.getX(pointerIndex);
+ - rawEvent.getX(pointerIndex);
final float deltaY = receivedTracker.getReceivedPointerDownY(pointerId)
- - event.getY(pointerIndex);
+ - rawEvent.getY(pointerIndex);
final double moveDelta = Math.hypot(deltaX, deltaY);
if (moveDelta < mDoubleTapSlop) {
break;
@@ -565,6 +568,7 @@
mCurrentState = STATE_DELEGATING;
sendDownForAllActiveNotInjectedPointers(event, policyFlags);
}
+ mVelocityTracker.clear();
} break;
default: {
// More than one pointer so the user is not touch exploring
@@ -585,6 +589,7 @@
// More than two pointers are delegated to the view hierarchy.
mCurrentState = STATE_DELEGATING;
sendDownForAllActiveNotInjectedPointers(event, policyFlags);
+ mVelocityTracker.clear();
}
}
} break;
@@ -615,10 +620,7 @@
}
} break;
}
- if (mVelocityTracker != null) {
- mVelocityTracker.clear();
- mVelocityTracker = null;
- }
+ mVelocityTracker.clear();
} break;
case MotionEvent.ACTION_CANCEL: {
clear(event, policyFlags);
@@ -1046,7 +1048,10 @@
// Make sure that the user will see the event.
policyFlags |= WindowManagerPolicy.FLAG_PASS_TO_USER;
if (mNext != null) {
- mNext.onMotionEvent(event, policyFlags);
+ // TODO: For now pass null for the raw event since the touch
+ // explorer is the last event transformation and it does
+ // not care about the raw event.
+ mNext.onMotionEvent(event, null, policyFlags);
}
mInjectedPointerTracker.onMotionEvent(event);
diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java
index d533c94..39d042f 100644
--- a/services/java/com/android/server/display/WifiDisplayController.java
+++ b/services/java/com/android/server/display/WifiDisplayController.java
@@ -639,9 +639,9 @@
}
private void handlePeersChanged() {
- if (mWfdEnabled) {
- requestPeers();
- }
+ // Even if wfd is disabled, it is best to get the latest set of peers to
+ // keep in sync with the p2p framework
+ requestPeers();
}
private void handleConnectionChanged(NetworkInfo networkInfo) {