summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/content/res/Configuration.java49
-rw-r--r--core/java/android/net/DhcpStateMachine.java25
-rw-r--r--core/java/android/net/NetworkPolicyManager.java23
-rw-r--r--core/java/android/provider/ContactsContract.java9
-rw-r--r--core/java/android/provider/VoicemailContract.java2
-rw-r--r--core/java/android/speech/tts/SynthesisRequest.java2
-rw-r--r--core/java/android/util/LocaleUtil.java115
-rw-r--r--core/java/android/view/GLES20Canvas.java3
-rw-r--r--core/java/android/view/GLES20TextureLayer.java4
-rw-r--r--core/java/android/view/HardwareRenderer.java13
-rw-r--r--core/java/android/view/TextureView.java10
-rw-r--r--core/java/android/view/View.java15
-rw-r--r--core/java/android/view/ViewAncestor.java13
-rw-r--r--core/java/android/view/ViewGroup.java5
-rw-r--r--core/java/android/webkit/WebView.java8
-rw-r--r--core/java/android/widget/CompoundButton.java7
-rw-r--r--core/java/android/widget/TextView.java10
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl1
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl1
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp14
-rw-r--r--core/jni/android_view_TextureView.cpp10
-rw-r--r--core/jni/com_google_android_gles_jni_EGLImpl.cpp7
-rw-r--r--core/res/res/values-de/donottranslate-cldr.xml2
-rwxr-xr-xcore/res/res/values/attrs.xml4
-rwxr-xr-xcore/res/res/values/config.xml13
-rwxr-xr-xcore/res/res/values/strings.xml16
-rw-r--r--core/tests/coretests/src/android/content/res/ConfigurationTest.java198
-rw-r--r--core/tests/coretests/src/android/util/LocaleUtilTest.java202
-rw-r--r--graphics/java/android/graphics/SurfaceTexture.java5
-rw-r--r--include/utils/BlobCache.h3
-rw-r--r--libs/utils/BlobCache.cpp14
-rwxr-xr-xmedia/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java315
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java51
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java74
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java20
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java69
-rwxr-xr-xmedia/tests/contents/media_api/goldenThumbnail.pngbin0 -> 18211 bytes
-rwxr-xr-xmedia/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17.mp3bin0 -> 1242272 bytes
-rw-r--r--media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3bin0 -> 1243008 bytes
-rw-r--r--media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3bin0 -> 1243008 bytes
-rw-r--r--media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3bin0 -> 1455117 bytes
-rw-r--r--media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3bin0 -> 3146594 bytes
-rw-r--r--media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3bin0 -> 1512064 bytes
-rw-r--r--media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3bin0 -> 1243008 bytes
-rwxr-xr-xmedia/tests/contents/media_api/music/SHORTMP3.mp3bin0 -> 5040 bytes
-rwxr-xr-xmedia/tests/contents/media_api/music/ants.midbin0 -> 2956 bytes
-rwxr-xr-xmedia/tests/contents/media_api/music/bzk_chic.wavbin0 -> 47060 bytes
-rwxr-xr-xmedia/tests/contents/media_api/music/sine_200+1000Hz_44K_mo.wavbin0 -> 265214 bytes
-rwxr-xr-xmedia/tests/contents/media_api/music/test_amr_ietf.amrbin0 -> 59910 bytes
-rwxr-xr-xmedia/tests/contents/media_api/video/big-buck-bunny_trailer.webmbin0 -> 2165175 bytes
-rw-r--r--opengl/java/com/google/android/gles_jni/EGLImpl.java4
-rw-r--r--packages/SystemUI/AndroidManifest.xml7
-rw-r--r--packages/SystemUI/res/drawable-hdpi/compat_mode_help_diagram.pngbin0 -> 14071 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/compat_mode_help_divider_bottom.9.pngbin0 -> 1654 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/compat_mode_help_divider_top.9.pngbin0 -> 150 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/compat_mode_help_icon.pngbin0 -> 2941 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/compat_mode_help_top_divider.9.pngbin0 -> 155 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.pngbin3981 -> 1750 bytes
-rw-r--r--packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.pngbin0 -> 1753 bytes
-rw-r--r--packages/SystemUI/res/drawable-large-hdpi/app_icon.pngbin7310 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-large-hdpi/recents_bg_protect_tile.pngbin10841 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-large-mdpi/app_icon.pngbin5167 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-large-mdpi/recents_bg_protect_tile.pngbin7927 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-large-mdpi/recents_blue_glow.9.pngbin9784 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-large-mdpi/recents_callout_line.pngbin114 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-large-mdpi/recents_thumbnail_bg.pngbin3981 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-large-mdpi/recents_thumbnail_bg_press.pngbin2056 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/compat_mode_help_diagram.pngbin0 -> 8649 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/compat_mode_help_divider_bottom.9.pngbin0 -> 689 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/compat_mode_help_divider_top.9.pngbin0 -> 142 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/compat_mode_help_icon.pngbin0 -> 2043 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.pngbin3981 -> 1750 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.pngbin2056 -> 1753 bytes
-rw-r--r--packages/SystemUI/res/drawable-nodpi/compat_mode_help_bg.pngbin134055 -> 2561 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw600dp-hdpi/app_icon.pngbin7310 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw600dp-mdpi/app_icon.pngbin5167 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable/compat_mode_help_bg.pngbin0 -> 2067 bytes
-rw-r--r--packages/SystemUI/res/drawable/compat_mode_help_diagram.pngbin27765 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable/compat_mode_help_icon.pngbin9667 -> 0 bytes
-rw-r--r--packages/SystemUI/res/layout-land/status_bar_recent_item.xml8
-rw-r--r--packages/SystemUI/res/layout-land/status_bar_recent_panel.xml3
-rw-r--r--packages/SystemUI/res/layout-port/status_bar_recent_item.xml (renamed from packages/SystemUI/res/layout/status_bar_recent_item.xml)49
-rw-r--r--packages/SystemUI/res/layout-port/status_bar_recent_panel.xml (renamed from packages/SystemUI/res/layout/status_bar_recent_panel.xml)10
-rw-r--r--packages/SystemUI/res/layout-sw600dp/compat_mode_help.xml55
-rw-r--r--packages/SystemUI/res/layout-sw600dp/status_bar_compat_mode_panel.xml8
-rw-r--r--packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml46
-rw-r--r--packages/SystemUI/res/layout/recent_apps_activity.xml55
-rw-r--r--packages/SystemUI/res/layout/recents_detail_view.xml40
-rw-r--r--packages/SystemUI/res/values-hdpi/dimens.xml24
-rw-r--r--packages/SystemUI/res/values-land/dimens.xml12
-rw-r--r--packages/SystemUI/res/values-large/dimens.xml26
-rw-r--r--packages/SystemUI/res/values-mdpi/dimens.xml24
-rw-r--r--packages/SystemUI/res/values-port/dimens.xml34
-rw-r--r--packages/SystemUI/res/values-sw600dp/dimens.xml36
-rw-r--r--packages/SystemUI/res/values/dimens.xml16
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/Choreographer.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java66
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsActivity.java532
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsCarouselView.java39
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java125
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java146
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/CompatModePanel.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java63
-rw-r--r--packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java9
-rw-r--r--packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java8
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java22
-rw-r--r--services/camera/libcameraservice/CameraService.cpp8
-rw-r--r--services/java/com/android/server/AppWidgetService.java74
-rw-r--r--services/java/com/android/server/StatusBarManagerService.java9
-rw-r--r--services/java/com/android/server/connectivity/Vpn.java23
-rw-r--r--services/java/com/android/server/net/NetworkPolicyManagerService.java26
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java26
-rw-r--r--telephony/java/com/android/internal/telephony/DataCallState.java8
-rw-r--r--telephony/java/com/android/internal/telephony/DataConnection.java4
-rwxr-xr-x[-rw-r--r--]telephony/java/com/android/internal/telephony/WapPushOverSms.java0
-rwxr-xr-x[-rw-r--r--]telephony/java/com/android/internal/telephony/WspTypeDecoder.java1
-rwxr-xr-x[-rw-r--r--]telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java51
-rwxr-xr-xtelephony/java/com/android/internal/telephony/cdma/RuimRecords.java7
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java6
-rw-r--r--tests/BiDiTests/res/layout/table_layout_locale.xml28
-rw-r--r--tests/BiDiTests/res/layout/table_layout_ltr.xml20
-rw-r--r--tests/BiDiTests/res/layout/table_layout_rtl.xml28
-rw-r--r--tests/RenderScriptTests/PerfTest/res/drawable/flares.pngbin0 -> 413 bytes
-rw-r--r--tests/RenderScriptTests/PerfTest/res/drawable/light1.jpgbin0 -> 11314 bytes
-rw-r--r--tests/RenderScriptTests/PerfTest/res/drawable/space.jpgbin0 -> 137126 bytes
-rw-r--r--tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java139
-rw-r--r--tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs265
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java27
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java13
-rw-r--r--tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java32
135 files changed, 1904 insertions, 1730 deletions
diff --git a/api/current.txt b/api/current.txt
index 7c9c851..14786d7 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -17586,6 +17586,7 @@ package android.speech.tts {
}
public final class SynthesisRequest {
+ ctor public SynthesisRequest(java.lang.String, android.os.Bundle);
method public java.lang.String getCountry();
method public java.lang.String getLanguage();
method public android.os.Bundle getParams();
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 9bd45d3..a00f790 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -19,6 +19,7 @@ package android.content.res;
import android.content.pm.ActivityInfo;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.LocaleUtil;
import java.util.Locale;
@@ -277,21 +278,6 @@ public final class Configuration implements Parcelable, Comparable<Configuration
public int compatSmallestScreenWidthDp;
/**
- * @hide Do not use. Implementation not finished.
- */
- public static final int TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE = -1;
-
- /**
- * @hide Do not use. Implementation not finished.
- */
- public static final int TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE = 0;
-
- /**
- * @hide Do not use. Implementation not finished.
- */
- public static final int TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE = 1;
-
- /**
* @hide The text layout direction associated to the current Locale
*/
public int textLayoutDirection;
@@ -359,8 +345,8 @@ public final class Configuration implements Parcelable, Comparable<Configuration
sb.append(" (no locale)");
}
switch (textLayoutDirection) {
- case TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE: sb.append(" ?layoutdir"); break;
- case TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE: sb.append(" rtl"); break;
+ case LocaleUtil.TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE: sb.append(" ?layoutdir"); break;
+ case LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE: sb.append(" rtl"); break;
default: sb.append(" layoutdir="); sb.append(textLayoutDirection); break;
}
if (smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) {
@@ -483,7 +469,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration
screenWidthDp = compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;
screenHeightDp = compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;
smallestScreenWidthDp = compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
- textLayoutDirection = TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE;
+ textLayoutDirection = LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE;
seq = 0;
}
@@ -519,7 +505,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration
changed |= ActivityInfo.CONFIG_LOCALE;
locale = delta.locale != null
? (Locale) delta.locale.clone() : null;
- textLayoutDirection = getLayoutDirectionFromLocale(locale);
+ textLayoutDirection = LocaleUtil.getLayoutDirectionFromLocale(locale);
}
if (delta.userSetLocale && (!userSetLocale || ((changed & ActivityInfo.CONFIG_LOCALE) != 0)))
{
@@ -609,31 +595,6 @@ public final class Configuration implements Parcelable, Comparable<Configuration
}
/**
- * Return the layout direction for a given Locale
- * @param locale the Locale for which we want the layout direction. Can be null.
- * @return the layout direction. This may be one of:
- * {@link #TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE} or
- * {@link #TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE} or
- * {@link #TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE}.
- *
- * @hide
- */
- public static int getLayoutDirectionFromLocale(Locale locale) {
- if (locale == null || locale.equals(Locale.ROOT)) return TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE;
- // Be careful: this code will need to be changed when vertical scripts will be supported
- // OR if ICU4C is updated to have the "likelySubtags" file
- switch(Character.getDirectionality(locale.getDisplayName(locale).charAt(0))) {
- case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
- return TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE;
- case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
- case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
- return TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE;
- default:
- return TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE;
- }
- }
-
- /**
* Return a bit mask of the differences between this Configuration
* object and the given one. Does not change the values of either. Any
* undefined fields in <var>delta</var> are ignored.
diff --git a/core/java/android/net/DhcpStateMachine.java b/core/java/android/net/DhcpStateMachine.java
index eaf087f..c49c019 100644
--- a/core/java/android/net/DhcpStateMachine.java
+++ b/core/java/android/net/DhcpStateMachine.java
@@ -66,6 +66,9 @@ public class DhcpStateMachine extends StateMachine {
private static final int DHCP_RENEW = 0;
private static final String ACTION_DHCP_RENEW = "android.net.wifi.DHCP_RENEW";
+ //Used for sanity check on setting up renewal
+ private static final int MIN_RENEWAL_TIME_SECS = 5 * 60; // 5 minutes
+
private enum DhcpAction {
START,
RENEW
@@ -331,13 +334,21 @@ public class DhcpStateMachine extends StateMachine {
if (success) {
Log.d(TAG, "DHCP succeeded on " + mInterfaceName);
- //Do it a bit earlier than half the lease duration time
- //to beat the native DHCP client and avoid extra packets
- //48% for one hour lease time = 29 minutes
- mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() +
- dhcpInfoInternal.leaseDuration * 480, //in milliseconds
- mDhcpRenewalIntent);
+ long leaseDuration = dhcpInfoInternal.leaseDuration; //int to long conversion
+
+ //Sanity check for renewal
+ //TODO: would be good to notify the user that his network configuration is
+ //bad and that the device cannot renew below MIN_RENEWAL_TIME_SECS
+ if (leaseDuration < MIN_RENEWAL_TIME_SECS) {
+ leaseDuration = MIN_RENEWAL_TIME_SECS;
+ }
+ //Do it a bit earlier than half the lease duration time
+ //to beat the native DHCP client and avoid extra packets
+ //48% for one hour lease time = 29 minutes
+ mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ SystemClock.elapsedRealtime() +
+ leaseDuration * 480, //in milliseconds
+ mDhcpRenewalIntent);
mController.obtainMessage(CMD_POST_DHCP_ACTION, DHCP_SUCCESS, 0, dhcpInfoInternal)
.sendToTarget();
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index e9d65e6..538a06e 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -19,6 +19,7 @@ package android.net;
import static android.text.format.Time.MONTH_DAY;
import android.content.Context;
+import android.content.Intent;
import android.os.RemoteException;
import android.text.format.Time;
@@ -41,6 +42,28 @@ public class NetworkPolicyManager {
/** Reject traffic on paid networks. */
public static final int RULE_REJECT_PAID = 0x1;
+ /**
+ * {@link Intent} action launched when user selects {@link NetworkPolicy}
+ * warning notification.
+ */
+ public static final String ACTION_DATA_USAGE_WARNING =
+ "android.intent.action.DATA_USAGE_WARNING";
+
+ /**
+ * {@link Intent} action launched when user selects {@link NetworkPolicy}
+ * limit notification.
+ */
+ public static final String ACTION_DATA_USAGE_LIMIT =
+ "android.intent.action.DATA_USAGE_LIMIT";
+
+ /**
+ * {@link Intent} extra included in {@link #ACTION_DATA_USAGE_WARNING} and
+ * {@link #ACTION_DATA_USAGE_LIMIT} to indicate which
+ * {@link NetworkPolicy#networkTemplate} it applies to.
+ */
+ public static final String EXTRA_NETWORK_TEMPLATE =
+ "android.intent.extra.NETWORK_TEMPLATE";
+
private INetworkPolicyManager mService;
public NetworkPolicyManager(INetworkPolicyManager service) {
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 00e2998..1816066 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -1298,6 +1298,15 @@ public final class ContactsContract {
public static final Uri CONTENT_VCARD_URI = Uri.withAppendedPath(CONTENT_URI,
"as_vcard");
+ /**
+ * Boolean parameter that may be used with {@link #CONTENT_VCARD_URI}
+ * and {@link #CONTENT_MULTI_VCARD_URI} to indicate that the returned
+ * vcard should not contain a photo.
+ *
+ * @hide
+ */
+ public static final String QUERY_PARAMETER_VCARD_NO_PHOTO = "nophoto";
+
/**
* Base {@link Uri} for referencing multiple {@link Contacts} entry,
* created by appending {@link #LOOKUP_KEY} using
diff --git a/core/java/android/provider/VoicemailContract.java b/core/java/android/provider/VoicemailContract.java
index 376e0bb..ae41876 100644
--- a/core/java/android/provider/VoicemailContract.java
+++ b/core/java/android/provider/VoicemailContract.java
@@ -127,7 +127,7 @@ public class VoicemailContract {
* <P>Type: TEXT</P>
* <P> Note that this is NOT the voicemail media content data.
*/
- public static final String SOURCE_DATA = "provider_data";
+ public static final String SOURCE_DATA = "source_data";
/**
* Whether the media content for this voicemail is available for
* consumption.
diff --git a/core/java/android/speech/tts/SynthesisRequest.java b/core/java/android/speech/tts/SynthesisRequest.java
index ef1704c..6398d3d 100644
--- a/core/java/android/speech/tts/SynthesisRequest.java
+++ b/core/java/android/speech/tts/SynthesisRequest.java
@@ -42,7 +42,7 @@ public final class SynthesisRequest {
private int mSpeechRate;
private int mPitch;
- SynthesisRequest(String text, Bundle params) {
+ public SynthesisRequest(String text, Bundle params) {
mText = text;
// Makes a copy of params.
mParams = new Bundle(params);
diff --git a/core/java/android/util/LocaleUtil.java b/core/java/android/util/LocaleUtil.java
new file mode 100644
index 0000000..e767a85
--- /dev/null
+++ b/core/java/android/util/LocaleUtil.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+import java.util.Locale;
+
+import libcore.icu.ICU;
+
+/**
+ * Various utilities for Locales
+ *
+ * @hide
+ */
+public class LocaleUtil {
+
+ private LocaleUtil() { /* cannot be instantiated */ }
+
+ /**
+ * @hide Do not use. Implementation not finished.
+ */
+ public static final int TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE = -1;
+
+ /**
+ * @hide Do not use. Implementation not finished.
+ */
+ public static final int TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE = 0;
+
+ /**
+ * @hide Do not use. Implementation not finished.
+ */
+ public static final int TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE = 1;
+
+ private static final char UNDERSCORE_CHAR = '_';
+
+ private static String ARAB_SCRIPT_SUBTAG = "Arab";
+ private static String HEBR_SCRIPT_SUBTAG = "Hebr";
+
+ /**
+ * Return the layout direction for a given Locale
+ *
+ * @param locale the Locale for which we want the layout direction. Can be null.
+ * @return the layout direction. This may be one of:
+ * {@link #TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE} or
+ * {@link #TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE} or
+ * {@link #TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE}.
+ *
+ * Be careful: this code will need to be changed when vertical scripts will be supported
+ *
+ * @hide
+ */
+ public static int getLayoutDirectionFromLocale(Locale locale) {
+ if (locale == null || locale.equals(Locale.ROOT)) {
+ return TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE;
+ }
+
+ final String localeWithSubtags = ICU.addLikelySubtags(locale.toString());
+ if (localeWithSubtags == null) return getLayoutDirectionFromFirstChar(locale);
+
+ // Need to check if we can extract the script subtag. For example, "Latn" in "en_Latn_US"
+ if (localeWithSubtags.length() <= 7
+ || localeWithSubtags.charAt(2) != UNDERSCORE_CHAR
+ || localeWithSubtags.charAt(7) != UNDERSCORE_CHAR) {
+ return getLayoutDirectionFromFirstChar(locale);
+ }
+ // Extract the script subtag
+ final String scriptSubtag = localeWithSubtags.substring(3, 7);
+
+ if (scriptSubtag.equalsIgnoreCase(ARAB_SCRIPT_SUBTAG) ||
+ scriptSubtag.equalsIgnoreCase(HEBR_SCRIPT_SUBTAG)) {
+ return TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE;
+ }
+ return TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE;
+ }
+
+ /**
+ * Fallback algorithm to detect the locale direction. Rely on the fist char of the
+ * localized locale name. This will not work if the localized locale name is in English
+ * (this is the case for ICU 4.4 and "Urdu" script)
+ *
+ * @param locale
+ * @return the layout direction. This may be one of:
+ * {@link #TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE} or
+ * {@link #TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE} or
+ * {@link #TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE}.
+ *
+ * Be careful: this code will need to be changed when vertical scripts will be supported
+ *
+ * @hide
+ */
+ private static int getLayoutDirectionFromFirstChar(Locale locale) {
+ switch(Character.getDirectionality(locale.getDisplayName(locale).charAt(0))) {
+ case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
+ return TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE;
+ case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
+ case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
+ return TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE;
+ default:
+ return TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE;
+ }
+ }
+}
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 383bfb3..5216c49 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -29,6 +29,7 @@ import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.Shader;
+import android.graphics.SurfaceTexture;
import android.graphics.TemporaryBuffer;
import android.text.GraphicsOperations;
import android.text.SpannableString;
@@ -163,7 +164,7 @@ class GLES20Canvas extends HardwareCanvas {
static native int nCreateTextureLayer(int[] layerInfo);
static native int nCreateLayer(int width, int height, boolean isOpaque, int[] layerInfo);
static native void nResizeLayer(int layerId, int width, int height, int[] layerInfo);
- static native void nUpdateTextureLayer(int layerId, int width, int height, int surface);
+ static native void nUpdateTextureLayer(int layerId, int width, int height, SurfaceTexture surface);
static native void nDestroyLayer(int layerId);
static native void nDestroyLayerDeferred(int layerId);
static native boolean nCopyLayer(int layerId, int bitmap);
diff --git a/core/java/android/view/GLES20TextureLayer.java b/core/java/android/view/GLES20TextureLayer.java
index fcf421b..063eee7 100644
--- a/core/java/android/view/GLES20TextureLayer.java
+++ b/core/java/android/view/GLES20TextureLayer.java
@@ -70,7 +70,7 @@ class GLES20TextureLayer extends GLES20Layer {
return mSurface;
}
- void update(int width, int height, int surface) {
- GLES20Canvas.nUpdateTextureLayer(mLayer, width, height, surface);
+ void update(int width, int height) {
+ GLES20Canvas.nUpdateTextureLayer(mLayer, width, height, mSurface);
}
}
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 5944bd4..5ceb12a 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -194,7 +194,7 @@ public abstract class HardwareRenderer {
*
* @return A {@link SurfaceTexture}
*/
- abstract SurfaceTexture createSuraceTexture(HardwareLayer layer);
+ abstract SurfaceTexture createSurfaceTexture(HardwareLayer layer);
/**
* Updates the specified layer.
@@ -202,10 +202,8 @@ public abstract class HardwareRenderer {
* @param layer The hardware layer to update
* @param width The layer's width
* @param height The layer's height
- * @param surface The surface to update
*/
- abstract void updateTextureLayer(HardwareLayer layer, int width, int height,
- SurfaceTexture surface);
+ abstract void updateTextureLayer(HardwareLayer layer, int width, int height);
/**
* Copies the content of the specified layer into the specified bitmap.
@@ -815,14 +813,13 @@ public abstract class HardwareRenderer {
}
@Override
- SurfaceTexture createSuraceTexture(HardwareLayer layer) {
+ SurfaceTexture createSurfaceTexture(HardwareLayer layer) {
return ((GLES20TextureLayer) layer).getSurfaceTexture();
}
@Override
- void updateTextureLayer(HardwareLayer layer, int width, int height,
- SurfaceTexture surface) {
- ((GLES20TextureLayer) layer).update(width, height, surface.mSurfaceTexture);
+ void updateTextureLayer(HardwareLayer layer, int width, int height) {
+ ((GLES20TextureLayer) layer).update(width, height);
}
@Override
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index 4daa892..164c657 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -232,7 +232,7 @@ public class TextureView extends View {
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mSurface != null) {
- nSetDefaultBufferSize(mSurface.mSurfaceTexture, getWidth(), getHeight());
+ nSetDefaultBufferSize(mSurface, getWidth(), getHeight());
if (mListener != null) {
mListener.onSurfaceTextureSizeChanged(mSurface, getWidth(), getHeight());
}
@@ -247,8 +247,8 @@ public class TextureView extends View {
if (mLayer == null) {
mLayer = mAttachInfo.mHardwareRenderer.createHardwareLayer();
- mSurface = mAttachInfo.mHardwareRenderer.createSuraceTexture(mLayer);
- nSetDefaultBufferSize(mSurface.mSurfaceTexture, getWidth(), getHeight());
+ mSurface = mAttachInfo.mHardwareRenderer.createSurfaceTexture(mLayer);
+ nSetDefaultBufferSize(mSurface, getWidth(), getHeight());
mUpdateListener = new SurfaceTexture.OnFrameAvailableListener() {
@Override
@@ -290,7 +290,7 @@ public class TextureView extends View {
return;
}
- mAttachInfo.mHardwareRenderer.updateTextureLayer(mLayer, getWidth(), getHeight(), mSurface);
+ mAttachInfo.mHardwareRenderer.updateTextureLayer(mLayer, getWidth(), getHeight());
invalidate();
}
@@ -447,5 +447,5 @@ public class TextureView extends View {
public void onSurfaceTextureDestroyed(SurfaceTexture surface);
}
- private static native void nSetDefaultBufferSize(int surfaceTexture, int width, int height);
+ private static native void nSetDefaultBufferSize(SurfaceTexture surfaceTexture, int width, int height);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 1dfb858..b0e651a 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -17,6 +17,7 @@
package android.view;
import android.util.FloatProperty;
+import android.util.LocaleUtil;
import android.util.Property;
import com.android.internal.R;
import com.android.internal.util.Predicate;
@@ -8772,18 +8773,8 @@ public class View implements Drawable.Callback2, KeyEvent.Callback, Accessibilit
* @return true if a Locale is corresponding to a RTL script.
*/
private static boolean isLayoutDirectionRtl(Locale locale) {
- if (locale == null || locale.equals(Locale.ROOT)) return false;
- // Be careful: this code will need to be changed when vertical scripts will be supported
- // OR if ICU4C is updated to have the "likelySubtags" file
- switch(Character.getDirectionality(locale.getDisplayName(locale).charAt(0))) {
- case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
- return false;
- case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
- case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
- return true;
- default:
- return false;
- }
+ return (LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE ==
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
}
/**
diff --git a/core/java/android/view/ViewAncestor.java b/core/java/android/view/ViewAncestor.java
index 914973e..ba3ae58 100644
--- a/core/java/android/view/ViewAncestor.java
+++ b/core/java/android/view/ViewAncestor.java
@@ -4407,7 +4407,7 @@ public final class ViewAncestor extends Handler implements ViewParent,
predicate.init(accessibilityId);
View root = ViewAncestor.this.mView;
View target = root.findViewByPredicate(predicate);
- if (target != null) {
+ if (target != null && target.isShown()) {
info = target.createAccessibilityNodeInfo();
}
} finally {
@@ -4439,7 +4439,7 @@ public final class ViewAncestor extends Handler implements ViewParent,
try {
View root = ViewAncestor.this.mView;
View target = root.findViewById(viewId);
- if (target != null) {
+ if (target != null && target.isShown()) {
info = target.createAccessibilityNodeInfo();
}
} finally {
@@ -4486,7 +4486,7 @@ public final class ViewAncestor extends Handler implements ViewParent,
root = ViewAncestor.this.mView;
}
- if (root == null) {
+ if (root == null || !root.isShown()) {
return;
}
@@ -4501,7 +4501,9 @@ public final class ViewAncestor extends Handler implements ViewParent,
final int viewCount = foundViews.size();
for (int i = 0; i < viewCount; i++) {
View foundView = foundViews.get(i);
- infos.add(foundView.createAccessibilityNodeInfo());
+ if (foundView.isShown()) {
+ infos.add(foundView.createAccessibilityNodeInfo());
+ }
}
} finally {
try {
@@ -4611,7 +4613,8 @@ public final class ViewAncestor extends Handler implements ViewParent,
return null;
}
mFindByAccessibilityIdPredicate.init(accessibilityId);
- return root.findViewByPredicate(mFindByAccessibilityIdPredicate);
+ View foundView = root.findViewByPredicate(mFindByAccessibilityIdPredicate);
+ return (foundView != null && foundView.isShown()) ? foundView : null;
}
private final class FindByAccessibilitytIdPredicate implements Predicate<View> {
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 57ee8a0..a6bce75 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2023,10 +2023,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
-
for (int i = 0, count = mChildrenCount; i < count; i++) {
View child = mChildren[i];
- info.addChild(child);
+ if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {
+ info.addChild(child);
+ }
}
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index bfab8a9..c56e6db 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -3062,6 +3062,13 @@ public class WebView extends AbsoluteLayout
}
/**
+ * @hide
+ */
+ public int getPageBackgroundColor() {
+ return nativeGetBackgroundColor();
+ }
+
+ /**
* Pause all layout, parsing, and JavaScript timers for all webviews. This
* is a global requests, not restricted to just this webview. This can be
* useful if the application has been paused.
@@ -9216,4 +9223,5 @@ public class WebView extends AbsoluteLayout
* @return True if the layer is successfully scrolled.
*/
private native boolean nativeScrollLayer(int layer, int newX, int newY);
+ private native int nativeGetBackgroundColor();
}
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index a730018..2410eb2 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -28,6 +28,7 @@ import android.util.AttributeSet;
import android.view.Gravity;
import android.view.ViewDebug;
import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
/**
* <p>
@@ -214,6 +215,12 @@ public abstract class CompoundButton extends Button implements Checkable {
}
@Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ info.setChecked(mChecked);
+ }
+
+ @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 470a23d..02c2b8f 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8574,11 +8574,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final String originalText = mText.subSequence(spanStart, spanEnd).toString();
((Editable) mText).replace(spanStart, spanEnd, suggestion);
- // Swap text content between actual text and Suggestion span
- String[] suggestions = suggestionInfo.suggestionSpan.getSuggestions();
- suggestions[suggestionInfo.suggestionIndex] = originalText;
-
- // Notify source IME of the suggestion pick
+ // Notify source IME of the suggestion pick. Do this before swaping texts.
if (!TextUtils.isEmpty(
suggestionInfo.suggestionSpan.getNotificationTargetClassName())) {
InputMethodManager imm = InputMethodManager.peekInstance();
@@ -8586,6 +8582,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
suggestionInfo.suggestionIndex);
}
+ // Swap text content between actual text and Suggestion span
+ String[] suggestions = suggestionInfo.suggestionSpan.getSuggestions();
+ suggestions[suggestionInfo.suggestionIndex] = originalText;
+
// Restore previous SuggestionSpans
final int lengthDifference = suggestion.length() - (spanEnd - spanStart);
for (int i = 0; i < length; i++) {
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 2ff0413..c11fc10 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -35,5 +35,6 @@ oneway interface IStatusBar
void setImeWindowStatus(in IBinder token, int vis, int backDisposition);
void setHardKeyboardStatus(boolean available, boolean enabled);
void userActivity();
+ void toggleRecentApps();
}
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 3f2b1ef..a9e5057 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -47,4 +47,5 @@ interface IStatusBarService
void setSystemUiVisibility(int vis);
void setHardKeyboardEnabled(boolean enabled);
void userActivity();
+ void toggleRecentApps();
}
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index 7e82efb..e301e44 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -22,6 +22,7 @@
#include "GraphicsJNI.h"
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
+#include <android_runtime/android_graphics_SurfaceTexture.h>
#include <utils/ResourceTypes.h>
#include <gui/SurfaceTexture.h>
@@ -644,11 +645,13 @@ static void android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz,
}
static void android_view_GLES20Canvas_updateTextureLayer(JNIEnv* env, jobject clazz,
- Layer* layer, jint width, jint height, SurfaceTexture* surface) {
+ Layer* layer, jint width, jint height, jobject surface) {
float transform[16];
- surface->updateTexImage();
- surface->getTransformMatrix(transform);
- GLenum renderTarget = surface->getCurrentTextureTarget();
+ sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface));
+
+ surfaceTexture->updateTexImage();
+ surfaceTexture->getTransformMatrix(transform);
+ GLenum renderTarget = surfaceTexture->getCurrentTextureTarget();
LayerRenderer::updateTextureLayer(layer, width, height, renderTarget, transform);
}
@@ -793,7 +796,8 @@ static JNINativeMethod gMethods[] = {
{ "nCreateLayer", "(IIZ[I)I", (void*) android_view_GLES20Canvas_createLayer },
{ "nResizeLayer", "(III[I)V" , (void*) android_view_GLES20Canvas_resizeLayer },
{ "nCreateTextureLayer", "([I)I", (void*) android_view_GLES20Canvas_createTextureLayer },
- { "nUpdateTextureLayer", "(IIII)V", (void*) android_view_GLES20Canvas_updateTextureLayer },
+ { "nUpdateTextureLayer", "(IIILandroid/graphics/SurfaceTexture;)V",
+ (void*) android_view_GLES20Canvas_updateTextureLayer },
{ "nDestroyLayer", "(I)V", (void*) android_view_GLES20Canvas_destroyLayer },
{ "nDestroyLayerDeferred", "(I)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred },
{ "nDrawLayer", "(IIFFI)V", (void*) android_view_GLES20Canvas_drawLayer },
diff --git a/core/jni/android_view_TextureView.cpp b/core/jni/android_view_TextureView.cpp
index c5d86c8..b046b23 100644
--- a/core/jni/android_view_TextureView.cpp
+++ b/core/jni/android_view_TextureView.cpp
@@ -17,6 +17,7 @@
#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
+#include <android_runtime/android_graphics_SurfaceTexture.h>
#include <gui/SurfaceTexture.h>
@@ -27,10 +28,10 @@ namespace android {
// ----------------------------------------------------------------------------
static void android_view_TextureView_setDefaultBufferSize(JNIEnv* env, jobject,
- jint surfaceTexture, jint width, jint height) {
+ jobject surface, jint width, jint height) {
- sp<SurfaceTexture> surface = reinterpret_cast<SurfaceTexture*>(surfaceTexture);
- surface->setDefaultBufferSize(width, height);
+ sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface));
+ surfaceTexture->setDefaultBufferSize(width, height);
}
// ----------------------------------------------------------------------------
@@ -40,7 +41,8 @@ static void android_view_TextureView_setDefaultBufferSize(JNIEnv* env, jobject,
const char* const kClassPathName = "android/view/TextureView";
static JNINativeMethod gMethods[] = {
- { "nSetDefaultBufferSize", "(III)V", (void*) android_view_TextureView_setDefaultBufferSize }
+ { "nSetDefaultBufferSize", "(Landroid/graphics/SurfaceTexture;II)V",
+ (void*) android_view_TextureView_setDefaultBufferSize }
};
int register_android_view_TextureView(JNIEnv* env) {
diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
index f777527..02974f9 100644
--- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
@@ -18,6 +18,7 @@
#include "JNIHelp.h"
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>
+#include <android_runtime/android_graphics_SurfaceTexture.h>
#include <utils/misc.h>
#include <EGL/egl.h>
@@ -323,7 +324,7 @@ not_valid_surface:
}
static jint jni_eglCreateWindowSurfaceTexture(JNIEnv *_env, jobject _this, jobject display,
- jobject config, jint native_window, jintArray attrib_list) {
+ jobject config, jobject native_window, jintArray attrib_list) {
if (display == NULL || config == NULL
|| !validAttribList(_env, attrib_list)) {
jniThrowException(_env, "java/lang/IllegalArgumentException", NULL);
@@ -339,7 +340,7 @@ not_valid_surface:
return 0;
}
- sp<SurfaceTexture> surfaceTexture = reinterpret_cast<SurfaceTexture*>(native_window);
+ sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(_env, native_window));
window = new SurfaceTextureClient(surfaceTexture);
if (window == NULL)
@@ -540,7 +541,7 @@ static JNINativeMethod methods[] = {
{"_eglCreatePbufferSurface","(" DISPLAY CONFIG "[I)I", (void*)jni_eglCreatePbufferSurface },
{"_eglCreatePixmapSurface", "(" SURFACE DISPLAY CONFIG OBJECT "[I)V", (void*)jni_eglCreatePixmapSurface },
{"_eglCreateWindowSurface", "(" DISPLAY CONFIG OBJECT "[I)I", (void*)jni_eglCreateWindowSurface },
-{"_eglCreateWindowSurfaceTexture", "(" DISPLAY CONFIG "I[I)I", (void*)jni_eglCreateWindowSurfaceTexture },
+{"_eglCreateWindowSurfaceTexture", "(" DISPLAY CONFIG OBJECT "[I)I", (void*)jni_eglCreateWindowSurfaceTexture },
{"eglDestroyContext", "(" DISPLAY CONTEXT ")Z", (void*)jni_eglDestroyContext },
{"eglDestroySurface", "(" DISPLAY SURFACE ")Z", (void*)jni_eglDestroySurface },
{"eglMakeCurrent", "(" DISPLAY SURFACE SURFACE CONTEXT")Z", (void*)jni_eglMakeCurrent },
diff --git a/core/res/res/values-de/donottranslate-cldr.xml b/core/res/res/values-de/donottranslate-cldr.xml
index fffcf26..6b4bf5c 100644
--- a/core/res/res/values-de/donottranslate-cldr.xml
+++ b/core/res/res/values-de/donottranslate-cldr.xml
@@ -31,7 +31,7 @@
<string name="month_medium_february">Feb.</string>
<string name="month_medium_march">Mär.</string>
<string name="month_medium_april">Apr.</string>
- <string name="month_medium_may">Mai.</string>
+ <string name="month_medium_may">Mai</string>
<string name="month_medium_june">Jun.</string>
<string name="month_medium_july">Jul.</string>
<string name="month_medium_august">Aug.</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 5d357c5..9c25ace 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1133,9 +1133,9 @@
edge, a right gravity will clip the left edge, and neither will clip both edges. -->
<flag name="clip_horizontal" value="0x08" />
<!-- Push object to the beginning of its container, not changing its size. -->
- <flag name="before" value="0x00800003" />
+ <flag name="start" value="0x00800003" />
<!-- Push object to the end of its container, not changing its size. -->
- <flag name="after" value="0x00800005" />
+ <flag name="end" value="0x00800005" />
</attr>
<!-- Controls whether links such as urls and email addresses are
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 3b4798e..e6dfc03 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -389,9 +389,11 @@
<!-- Control the behavior when the user long presses the power button.
0 - Nothing
1 - Recent apps dialog
- 2 - Recent apps activity in SystemUI
+ 2 - Recent apps view in SystemUI
+ This needs to match the constants in
+ policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
-->
- <integer name="config_longPressOnHomeBehavior">1</integer>
+ <integer name="config_longPressOnHomeBehavior">2</integer>
<!-- Array of light sensor LUX values to define our levels for auto backlight brightness support.
The N entries of this array define N + 1 zones as follows:
@@ -633,4 +635,11 @@
<!-- Set to true if the RSSI should always display CDMA signal strength even on EVDO -->
<bool name="config_alwaysUseCdmaRssi">false</bool>
+
+ <!-- If this value is true, duplicate Source/Destination port fields
+ in WDP header of some carriers OMADM wap push are supported.
+ ex: MSGTYPE-TotalSegments-CurrentSegment
+ -SourcePortDestPort-SourcePortDestPort-OMADM PDU
+ If false, not supported. -->
+ <bool name="config_duplicate_port_omadm_wappush">false</bool>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 5e13282..879892e 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -901,16 +901,16 @@
contact (address) data stored on your phone. Malicious
applications can use this to erase or modify your contact data.</string>
- <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <!-- Title of the read profile permission, listed so the user can decide whether to allow the application to read the user's personal profile data. [CHAR LIMIT=30] -->
<string name="permlab_readProfile">read profile data</string>
- <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <!-- Description of the read profile permission, listed so the user can decide whether to allow the application to read the user's personal profile data. [CHAR LIMIT=NONE] -->
<string name="permdesc_readProfile" product="default">Allows an application to read all
of your personal profile information. Malicious applications can use this to identify
you and send your personal information to other people.</string>
- <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <!-- Title of the write profile permission, listed so the user can decide whether to allow the application to write to the user's personal profile data. [CHAR LIMIT=30] -->
<string name="permlab_writeProfile">write profile data</string>
- <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <!-- Description of the write profile permission, listed so the user can decide whether to allow the application to write to the user's personal profile data. [CHAR LIMIT=NONE] -->
<string name="permdesc_writeProfile" product="default">Allows an application to modify
your personal profile information. Malicious applications can use this to erase or
modify your profile data.</string>
@@ -2774,11 +2774,13 @@
<string name="l2tp_ipsec_crt_vpn_description">Certificate based L2TP/IPSec VPN</string>
<!-- Ticker text to show when VPN is active. -->
- <string name="vpn_ticker">Activating <xliff:g id="app">%s</xliff:g> VPN...</string>
+ <string name="vpn_ticker"><xliff:g id="app" example="FooVPN client">%s</xliff:g> is activating VPN...</string>
<!-- The title of the notification when VPN is active. -->
- <string name="vpn_title"><xliff:g id="app">%s</xliff:g> VPN is active</string>
+ <string name="vpn_title">VPN is activated by <xliff:g id="app" example="FooVPN client">%s</xliff:g></string>
<!-- The text of the notification when VPN is active. -->
- <string name="vpn_text">VPN is connected to <xliff:g id="profile">%s</xliff:g>. Tap to manage the network.</string>
+ <string name="vpn_text">Tap to manage the network.</string>
+ <!-- The text of the notification when VPN is active with a session name. -->
+ <string name="vpn_text_long">Connected to <xliff:g id="session" example="office">%s</xliff:g>. Tap to manage the network.</string>
<!-- Localized strings for WebView -->
<!-- Label for button in a WebView that will open a chooser to choose a file to upload -->
diff --git a/core/tests/coretests/src/android/content/res/ConfigurationTest.java b/core/tests/coretests/src/android/content/res/ConfigurationTest.java
deleted file mode 100644
index 54a5e4e..0000000
--- a/core/tests/coretests/src/android/content/res/ConfigurationTest.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.res;
-
-import java.util.Locale;
-
-import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-
-public class ConfigurationTest extends AndroidTestCase {
-
- @TestTargetNew(
- level = TestLevel.COMPLETE,
- method = "getLayoutDirectionFromLocale",
- args = {Locale.class}
- )
- public void testGetLayoutDirectionFromLocale() {
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(null));
-
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.ENGLISH));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.CANADA));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.CANADA_FRENCH));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.FRANCE));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.FRENCH));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.GERMAN));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.GERMANY));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.ITALIAN));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.ITALY));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.UK));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.US));
-
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.ROOT));
-
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.CHINA));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.CHINESE));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.JAPAN));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.JAPANESE));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.KOREA));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.KOREAN));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.PRC));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.SIMPLIFIED_CHINESE));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.TAIWAN));
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(Locale.TRADITIONAL_CHINESE));
-
- Locale locale = new Locale("ar");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "AE");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "BH");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "DZ");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "EG");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "IQ");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "JO");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "KW");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "LB");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "LY");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "MA");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "OM");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "QA");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "SA");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "SD");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "SY");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "TN");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ar", "YE");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
-
- locale = new Locale("fa");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("fa", "AF");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("fa", "IR");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
-
- locale = new Locale("iw");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("iw", "IL");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("he");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("he", "IL");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
-
- // The following test will not pass until we are able to take care about the scrip subtag
- // thru having the "likelySubTags" file into ICU4C
-// locale = new Locale("pa_Arab");
-// assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
-// Configuration.getLayoutDirectionFromLocale(locale));
-// locale = new Locale("pa_Arab", "PK");
-// assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
-// Configuration.getLayoutDirectionFromLocale(locale));
-
- locale = new Locale("ps");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
- locale = new Locale("ps", "AF");
- assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
- Configuration.getLayoutDirectionFromLocale(locale));
-
- // The following test will not work as the localized display name would be "Urdu" with ICU 4.4
- // We will need ICU 4.6 to get the correct localized display name
-// locale = new Locale("ur");
-// assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
-// Configuration.getLayoutDirectionFromLocale(locale));
-// locale = new Locale("ur", "IN");
-// assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
-// Configuration.getLayoutDirectionFromLocale(locale));
-// locale = new Locale("ur", "PK");
-// assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
-// Configuration.getLayoutDirectionFromLocale(locale));
-
- // The following test will not pass until we are able to take care about the scrip subtag
- // thru having the "likelySubTags" file into ICU4C
-// locale = new Locale("uz_Arab");
-// assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
-// Configuration.getLayoutDirectionFromLocale(locale));
-// locale = new Locale("uz_Arab", "AF");
-// assertEquals(Configuration.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
-// Configuration.getLayoutDirectionFromLocale(locale));
- }
-}
diff --git a/core/tests/coretests/src/android/util/LocaleUtilTest.java b/core/tests/coretests/src/android/util/LocaleUtilTest.java
new file mode 100644
index 0000000..5aa99c1
--- /dev/null
+++ b/core/tests/coretests/src/android/util/LocaleUtilTest.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+import java.util.Locale;
+
+import android.content.res.Configuration;
+import android.test.AndroidTestCase;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetNew;
+
+import static android.util.LocaleUtil.TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE;
+import static android.util.LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE;
+import static android.util.LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE;
+
+public class LocaleUtilTest extends AndroidTestCase {
+
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "getLayoutDirectionFromLocale",
+ args = {Locale.class}
+ )
+ public void testGetLayoutDirectionFromLocale() {
+ assertEquals(TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(null));
+
+ assertEquals(TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.ENGLISH));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.CANADA));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.CANADA_FRENCH));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.FRANCE));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.FRENCH));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.GERMAN));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.GERMANY));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.ITALIAN));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.ITALY));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.UK));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.US));
+
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_UNDEFINED_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.ROOT));
+
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.CHINA));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.CHINESE));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.JAPAN));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.JAPANESE));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.KOREA));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.KOREAN));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.PRC));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.SIMPLIFIED_CHINESE));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.TAIWAN));
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(Locale.TRADITIONAL_CHINESE));
+
+ Locale locale = new Locale("ar");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "AE");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "BH");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "DZ");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "EG");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "IQ");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "JO");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "KW");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "LB");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "LY");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "MA");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "OM");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "QA");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "SA");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "SD");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "SY");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "TN");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ar", "YE");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+
+ locale = new Locale("fa");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("fa", "AF");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("fa", "IR");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+
+ locale = new Locale("iw");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("iw", "IL");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("he");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("he", "IL");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+
+ locale = new Locale("pa_Arab");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("pa_Arab", "PK");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+
+ locale = new Locale("ps");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ps", "AF");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+
+ locale = new Locale("ur");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ur", "IN");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("ur", "PK");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+
+ locale = new Locale("uz_Arab");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ locale = new Locale("uz_Arab", "AF");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+
+ // Locale without a real language
+ locale = new Locale("zz");
+ assertEquals(LocaleUtil.TEXT_LAYOUT_DIRECTION_LTR_DO_NOT_USE,
+ LocaleUtil.getLayoutDirectionFromLocale(locale));
+ }
+}
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index 0ffd201..6c7341f 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -66,11 +66,8 @@ public class SurfaceTexture {
/**
* This field is used by native code, do not access or modify.
- *
- * @hide
*/
- @SuppressWarnings({"UnusedDeclaration"})
- public int mSurfaceTexture;
+ private int mSurfaceTexture;
/**
* Callback interface for being notified that a new stream frame is available.
diff --git a/include/utils/BlobCache.h b/include/utils/BlobCache.h
index 8f76d72..dc45ff0 100644
--- a/include/utils/BlobCache.h
+++ b/include/utils/BlobCache.h
@@ -82,6 +82,9 @@ private:
BlobCache(const BlobCache&);
void operator=(const BlobCache&);
+ // A random function helper to get around MinGW not having nrand48()
+ long int blob_random();
+
// clean evicts a randomly chosen set of entries from the cache such that
// the total size of all remaining entries is less than mMaxTotalSize/2.
void clean();
diff --git a/libs/utils/BlobCache.cpp b/libs/utils/BlobCache.cpp
index 1298fa7..590576a 100644
--- a/libs/utils/BlobCache.cpp
+++ b/libs/utils/BlobCache.cpp
@@ -31,9 +31,13 @@ BlobCache::BlobCache(size_t maxKeySize, size_t maxValueSize, size_t maxTotalSize
mMaxTotalSize(maxTotalSize),
mTotalSize(0) {
nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
+#ifdef _WIN32
+ srand(now);
+#else
mRandState[0] = (now >> 0) & 0xFFFF;
mRandState[1] = (now >> 16) & 0xFFFF;
mRandState[2] = (now >> 32) & 0xFFFF;
+#endif
LOGV("initializing random seed using %lld", now);
}
@@ -148,11 +152,19 @@ size_t BlobCache::get(const void* key, size_t keySize, void* value,
return valueBlobSize;
}
+long int BlobCache::blob_random() {
+#ifdef _WIN32
+ return rand();
+#else
+ return nrand48(mRandState);
+#endif
+}
+
void BlobCache::clean() {
// Remove a random cache entry until the total cache size gets below half
// the maximum total cache size.
while (mTotalSize > mMaxTotalSize / 2) {
- size_t i = size_t(nrand48(mRandState) % (mCacheEntries.size()));
+ size_t i = size_t(blob_random() % (mCacheEntries.size()));
const CacheEntry& entry(mCacheEntries[i]);
mTotalSize -= entry.getKey()->getSize() + entry.getValue()->getSize();
mCacheEntries.removeAt(i);
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java
index d6e1346..f3a91c5 100755
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java
@@ -1,57 +1,54 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * 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
+ * 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.
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
*/
package com.android.mediaframeworktest;
/**
- *
- * This class has the names of the all the activity name and variables
- * in the instrumentation test.
+ *
+ * This class has the names of the all the activity name and variables in the
+ * instrumentation test.
*
*/
public class MediaNames {
- //A directory to hold all kinds of media files
+ // A directory to hold all kinds of media files
public static final String MEDIA_SAMPLE_POOL = "/sdcard/media_api/samples/";
- //Audio files
- public static final String MP3CBR = "/sdcard/media_api/music/MP3_256kbps_2ch.mp3";
- public static final String MP3VBR = "/sdcard/media_api/music/MP3_256kbps_2ch_VBR.mp3";
+ // Audio files
+ public static final String MP3CBR = "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3";
+ public static final String MP3VBR = "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3";
+ public static final String MP3ABR = "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3";
public static final String SHORTMP3 = "/sdcard/media_api/music/SHORTMP3.mp3";
public static final String MIDI = "/sdcard/media_api/music/ants.mid";
- public static final String WMA9 = "/sdcard/media_api/music/WMA9.wma";
- public static final String WMA10 = "/sdcard/media_api/music/WMA10.wma";
public static final String WAV = "/sdcard/media_api/music/rings_2ch.wav";
public static final String AMR = "/sdcard/media_api/music/test_amr_ietf.amr";
- public static final String OGG = "/sdcard/media_api/music/Revelation.ogg";
public static final String SINE_200_1000 = "/sdcard/media_api/music/sine_200+1000Hz_44K_mo.wav";
-
+ // public static final String OGG =
+ // "/sdcard/media_api/music/Revelation.ogg";
+
public static final int MP3CBR_LENGTH = 71000;
public static final int MP3VBR_LENGTH = 71000;
public static final int SHORTMP3_LENGTH = 286;
public static final int MIDI_LENGTH = 17000;
- public static final int WMA9_LENGTH = 126559;
- public static final int WMA10_LENGTH = 126559;
public static final int AMR_LENGTH = 37000;
- public static final int OGG_LENGTH = 4000;
public static final int SEEK_TIME = 10000;
-
+
public static final long PAUSE_WAIT_TIME = 3000;
public static final long WAIT_TIME = 2000;
public static final long WAIT_SNAPSHOT_TIME = 5000;
- //local video
+ // local video
public static final String VIDEO_MP4 = "/sdcard/media_api/video/MPEG4_320_AAC_64.mp4";
public static final String VIDEO_SHORT_3GP = "/sdcard/media_api/video/short.3gp";
public static final String VIDEO_LARGE_SIZE_3GP = "/sdcard/media_api/video/border_large.3gp";
@@ -59,185 +56,105 @@ public class MediaNames {
public static final String VIDEO_H263_AMR = "/sdcard/media_api/video/H263_56_AMRNB_6.3gp";
public static final String VIDEO_H264_AAC = "/sdcard/media_api/video/H264_320_AAC_64.3gp";
public static final String VIDEO_H264_AMR = "/sdcard/media_api/video/H264_320_AMRNB_6.3gp";
- public static final String VIDEO_WMV = "/sdcard/media_api/video/bugs.wmv";
public static final String VIDEO_HIGHRES_H263 = "/sdcard/media_api/video/H263_500_AMRNB_12.3gp";
public static final String VIDEO_HIGHRES_MP4 = "/sdcard/media_api/video/H264_500_AAC_128.3gp";
-
- //Media Recorder
+ public static final String VIDEO_WEBM = "/sdcard/media_api/video/big-buck-bunny_trailer.webm";
+
+ // Media Recorder
public static final String RECORDER_OUTPUT = "/sdcard/media_api/recorderOutput.amr";
- //video thumbnail
+ // video thumbnail
public static final String THUMBNAIL_OUTPUT = "/sdcard/media_api/videoThumbnail.png";
public static final String GOLDEN_THUMBNAIL_OUTPUT = "/sdcard/media_api/goldenThumbnail.png";
- public static final String GOLDEN_THUMBNAIL_OUTPUT_2 = "/sdcard/media_api/goldenThumbnail2.png";
-
- //Metadata Utility
- public static final String[] THUMBNAIL_CAPTURE_TEST_FILES = {
- "/sdcard/media_api/metadata/test.mp4",
- "/sdcard/media_api/metadata/test1.3gp",
- "/sdcard/media_api/metadata/test2.3gp",
- "/sdcard/media_api/metadata/test3.3gp",
- "/sdcard/media_api/metadata/test4.3gp",
- "/sdcard/media_api/metadata/test5.3gp",
- "/sdcard/media_api/metadata/test6.3gp",
- "/sdcard/media_api/metadata/test7.3gp",
- "/sdcard/media_api/metadata/test8.3gp",
- "/sdcard/media_api/metadata/test9.3gp",
- "/sdcard/media_api/metadata/test10.3gp",
- "/sdcard/media_api/metadata/test11.3gp",
- "/sdcard/media_api/metadata/test12.3gp",
- "/sdcard/media_api/metadata/test13.3gp",
- "/sdcard/media_api/metadata/test14.3gp",
- "/sdcard/media_api/metadata/test15.3gp",
- "/sdcard/media_api/metadata/test16.3gp",
- "/sdcard/media_api/metadata/test17.3gp",
- "/sdcard/media_api/metadata/test18.3gp",
- "/sdcard/media_api/metadata/test19.3gp",
- "/sdcard/media_api/metadata/test20.3gp",
- "/sdcard/media_api/metadata/test21.3gp",
- "/sdcard/media_api/metadata/test22.3gp",
- "/sdcard/media_api/metadata/test23.3gp",
- "/sdcard/media_api/metadata/test24.3gp",
- "/sdcard/media_api/metadata/test25.3gp",
- "/sdcard/media_api/metadata/test26.3gp",
- "/sdcard/media_api/metadata/test27.3gp",
- "/sdcard/media_api/metadata/test28.3gp",
- "/sdcard/media_api/metadata/test29.3gp",
- "/sdcard/media_api/metadata/test30.3gp",
- "/sdcard/media_api/metadata/test31.3gp",
- "/sdcard/media_api/metadata/test32.3gp",
- "/sdcard/media_api/metadata/test33.3gp",
- "/sdcard/media_api/metadata/test35.mp4",
- "/sdcard/media_api/metadata/test36.m4v",
- "/sdcard/media_api/metadata/test34.wmv",
- "/sdcard/media_api/metadata/test_metadata.mp4",
- };
-
- public static final String[] METADATA_RETRIEVAL_TEST_FILES = {
- // Raw AAC is not supported
- // "/sdcard/media_api/test_raw.aac",
- // "/sdcard/media_api/test_adts.aac",
- // "/sdcard/media_api/test_adif.aac",
- "/sdcard/media_api/metadata/test_metadata.mp4",
- "/sdcard/media_api/metadata/WMA10.wma",
- "/sdcard/media_api/metadata/Leadsol_out.wav",
- "/sdcard/media_api/metadata/test_aac.mp4",
- "/sdcard/media_api/metadata/test_amr.mp4",
- "/sdcard/media_api/metadata/test_avc_amr.mp4",
- "/sdcard/media_api/metadata/test_metadata.mp4",
- "/sdcard/media_api/metadata/test_vbr.mp3",
- "/sdcard/media_api/metadata/test_cbr.mp3",
- "/sdcard/media_api/metadata/metadata_test1.mp3",
- "/sdcard/media_api/metadata/test33.3gp",
- "/sdcard/media_api/metadata/test35.mp4",
- "/sdcard/media_api/metadata/test36.m4v",
- "/sdcard/media_api/metadata/test_m4v_amr.mp4",
- "/sdcard/media_api/metadata/test_h263_amr.mp4",
- "/sdcard/media_api/metadata/test34.wmv",
- };
-
- public static final String[] ALBUMART_TEST_FILES = {
- "/sdcard/media_api/album_photo/test_22_16_mp3.mp3",
- "/sdcard/media_api/album_photo/PD_256kbps_48khz_mono_CBR_MCA.mp3",
- "/sdcard/media_api/album_photo/PD_256kbps_44.1khz_mono_CBR_DPA.mp3",
- "/sdcard/media_api/album_photo/PD_192kbps_32khz_mono_CBR_DPA.mp3",
- "/sdcard/media_api/album_photo/NIN_256kbps_48khz_mono_CBR_MCA.mp3",
- "/sdcard/media_api/album_photo/NIN_256kbps_44.1khz_mono_CBR_MCA.mp3",
- "/sdcard/media_api/album_photo/NIN_112kbps(96kbps)_48khz_stereo_VBR_MCA.mp3",
- "/sdcard/media_api/album_photo/NIN_112kbps(96kbps)_44.1khz_stereo_VBR_MCA.mp3",
- "/sdcard/media_api/album_photo/lightGreen1.mp3",
- "/sdcard/media_api/album_photo/babyBlue2 1.mp3",
- "/sdcard/media_api/album_photo/2-01 01 NIN_56kbps(64kbps)_32khz_stereo_VBR_MCA.mp3",
- "/sdcard/media_api/album_photo/02_NIN_112kbps(80kbps)_32khz_stereo_VBR_MCA.mp3",
- "/sdcard/media_api/album_photo/No_Woman_No_Cry_128K.wma",
- "/sdcard/media_api/album_photo/Beethoven_2.wma",
- };
-
- //TEST_PATH_1: is a video and contains metadata for key "num-tracks"
- // TEST_PATH_2: any valid media file.
- // TEST_PATH_3: invalid media file
- public static final String TEST_PATH_1 = "/sdcard/media_api/metadata/test.mp4";
- public static final String TEST_PATH_3 = "/sdcard/media_api/data.txt";
- public static final String TEST_PATH_4 = "somenonexistingpathname";
- public static final String TEST_PATH_5 = "mem://012345";
-
- //Meta data expected result
- //The expected tag result in the following order
- //cd_track_number, album, artist, author, composer, date, genre
- //title, years, duration
- public static final String META_DATA_MP3 [][] = {
- {"/sdcard/media_api/metaDataTestMedias/MP3/ID3V1_ID3V2.mp3", "1/10", "ID3V2.3 Album", "ID3V2.3 Artist",
- "ID3V2.3 Lyricist", "ID3V2.3 Composer", null, "Blues",
- "ID3V2.3 Title", "1234", "295", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/ID3V2.mp3", "1/10", "ID3V2.3 Album", "ID3V2.3 Artist",
- "ID3V2.3 Lyricist", "ID3V2.3 Composer", null, "Blues",
- "ID3V2.3 Title", "1234", "287", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/ID3V1.mp3", "1", "test ID3V1 Album", "test ID3V1 Artist",
- null, null, null, "255", "test ID3V1 Title", "1234", "231332", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V1.mp3" , null, null, null,
- null, null, null, null, null, null, "231330", "1", null},
- //The corrupted TALB field in id3v2 would not switch to id3v1 tag automatically
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TALB.mp3", "01", null, "ID3V2.3 Artist",
- "ID3V2.3 Lyricist", "ID3V2.3 Composer", null,
- "Blues", "ID3V2.3 Title", "1234", "295", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TCOM.mp3", "01", "ID3V2.3 Album",
- "ID3V2.3 Artist", "ID3V2.3 Lyricist", null, null,
- "Blues", "ID3V2.3 Title", "1234", "295", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TCOM_2.mp3", "01", "ID3V2.3 Album",
- "ID3V2.3 Artist", null, null, null, "Blues", "ID3V2.3 Title", "1234", "295", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TRCK.mp3", "dd", "ID3V2.3 Album",
- "ID3V2.3 Artist", "ID3V2.3 Lyricist", "ID3V2.3 Composer", null,
- "Blues", "ID3V2.3 Title", "1234", "295", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TRCK_2.mp3", "01", "ID3V2.3 Album",
- "ID3V2.3 Artist", null, null, null, null, "ID3V2.3 Title", null, "295", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TYER.mp3", "01", "ID3V2.3 Album",
- "ID3V2.3 Artist", null, null, null, null, "ID3V2.3 Title", "9999", "295", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TYER_2.mp3", "01", "ID3V2.3 Album",
- "ID3V2.3 Artist", "ID3V2.3 Lyricist", "ID3V2.3 Composer", null,
- "Blues", "ID3V2.3 Title", null, "295", "1", null},
- {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TIT.mp3", null, null, null,
- null, null, null, null, null, null, "295", "1", null}
- };
-
- //output recorded video
-
- public static final String RECORDED_HVGA_H263 = "/sdcard/HVGA_H263.3gp";
- public static final String RECORDED_QVGA_H263 = "/sdcard/QVGA_H263.3gp";
- public static final String RECORDED_SQVGA_H263 = "/sdcard/SQVGA_H263.3gp";
- public static final String RECORDED_CIF_H263 = "/sdcard/CIF_H263.3gp";
- public static final String RECORDED_QCIF_H263 = "/sdcard/QCIF_H263.3gp";
- public static final String RECORDED_PORTRAIT_H263 = "/sdcard/QCIF_mp4.3gp";
-
- public static final String RECORDED_HVGA_MP4 = "/sdcard/HVGA_mp4.mp4";
- public static final String RECORDED_QVGA_MP4 = "/sdcard/QVGA_mp4.mp4";
- public static final String RECORDED_SQVGA_MP4 = "/sdcard/SQVGA_mp4.mp4";
- public static final String RECORDED_CIF_MP4 = "/sdcard/CIF_mp4.mp4";
- public static final String RECORDED_QCIF_MP4 = "/sdcard/QCIF_mp4.mp4";
-
- public static final String RECORDED_VIDEO_3GP = "/sdcard/temp.3gp";
-
- public static final String INVALD_VIDEO_PATH = "/sdcard/media_api/filepathdoesnotexist" +
- "/filepathdoesnotexist/temp.3gp";
-
-
- public static final long RECORDED_TIME = 5000;
- public static final long VALID_VIDEO_DURATION = 2000;
-
- //Streaming test files
- public static final byte [] STREAM_SERVER = new byte[] {(byte)75,(byte)17,(byte)48,(byte)204};
- public static final String STREAM_H264_480_360_1411k =
- "http://75.17.48.204:10088/yslau/stress_media/h264_regular.mp4";
- public static final String STREAM_WMV =
- "http://75.17.48.204:10088/yslau/stress_media/bugs.wmv";
- public static final String STREAM_H263_176x144_325k =
- "http://75.17.48.204:10088/yslau/stress_media/h263_regular.3gp";
- public static final String STREAM_H264_352x288_1536k =
- "http://75.17.48.204:10088/yslau/stress_media/h264_highBitRate.mp4";
- public static final String STREAM_MP3=
- "http://75.17.48.204:10088/yslau/stress_media/mp3_regular.mp3";
- public static final String STREAM_MPEG4_QVGA_128k =
- "http://75.17.48.204:10088/yslau/stress_media/mpeg4_qvga_24fps.3gp";
- public static final int STREAM_H264_480_360_1411k_DURATION = 46000;
- public static final int VIDEO_H263_AAC_DURATION = 501000;
- public static final int VIDEO_H263_AMR_DURATION = 502000;
+
+ /*
+ * Metadata Utility Test media files which contain meta data.
+ */
+ public static final String[] THUMBNAIL_METADATA_TEST_FILES = {
+ "/sdcard/media_api/video/H263_500_AMRNB_12.3gp",
+ "/sdcard/media_api/video/H263_56_AAC_24.3gp",
+ "/sdcard/media_api/video/H263_56_AMRNB_6.3gp",
+ "/sdcard/media_api/video/H264_320_AAC_64.3gp",
+ "/sdcard/media_api/video/H264_320_AMRNB_6.3gp",
+ "/sdcard/media_api/video/H264_500_AAC_128.3gp",
+ "/sdcard/media_api/video/H264_HVGA_500_NO_AUDIO.3gp",
+ "/sdcard/media_api/video/H264_QVGA_500_NO_AUDIO.3gp",
+ "/sdcard/media_api/video/MPEG4_320_AAC_64.mp4",
+ "/sdcard/media_api/video/border_large.3gp",
+ "/sdcard/media_api/videoeditor/H264_BP_800x480_15fps_512kbps_AACLC_24KHz_38Kbps_s_1_17.mp4",
+ "/sdcard/media_api/videoeditor/H264_MP_960x720_25fps_800kbps_AACLC_48Khz_192Kbps_s_1_17.mp4",
+ "/sdcard/media_api/videoeditor/MPEG4_SP_640x480_15fps_512kbps_AACLC_48khz_132kbps_s_0_26.mp4",
+ "/sdcard/media_api/videoeditor/MPEG4_SP_176x144_12fps_92kbps_AMRNB_8KHz_12.2kbps_m_0_27.3gp",
+ "/sdcard/media_api/videoeditor/MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_161kbps_s_0_26.mp4"
+ };
+
+ public static final String[] ALBUMART_TEST_FILES = {
+ "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3",
+ "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3",
+ "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3",
+ };
+
+ // TEST_PATH_1: is a video and contains metadata for key "num-tracks"
+ // TEST_PATH_2: any valid media file.
+ // TEST_PATH_3: invalid media file
+ public static final String TEST_PATH_1 = "/sdcard/media_api/video/MPEG4_320_AAC_64.mp4";
+ public static final String TEST_PATH_3 = "/sdcard/media_api/data.txt";
+ public static final String TEST_PATH_4 = "somenonexistingpathname";
+ public static final String TEST_PATH_5 = "mem://012345";
+
+ // Meta data expected result
+ // The expected tag result in the following order
+ // cd_track_number, album, artist, author, composer, date, genre
+ // title, years, duration
+ public static final String META_DATA_MP3[][] = {
+ {"/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3", "2/34",
+ "Test ID3V2 Album", "Test ID3V2 Artist", null, "Test ID3V2 Composer",
+ null, "(1)Classic Rock", "Test ID3V2 Title ", null, "77640", "1", null},
+ {"/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3", "1/10",
+ "Test ID3V2 Album", "Test ID3V2 Artist", null, "Test ID3V2 Composer",
+ null, "(74)Acid Jazz", "Test ID3V2 Tag", null, "77640", "1", null},
+ {"/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3", "2",
+ "Test ID3V1 Album", "Test ID3V1 Artist", null, null, null, "(15)",
+ "Test ID3V1 Title", "2011", "77640", "1", null}
+ };
+
+ // output recorded video
+ public static final String RECORDED_HVGA_H263 = "/sdcard/HVGA_H263.3gp";
+ public static final String RECORDED_QVGA_H263 = "/sdcard/QVGA_H263.3gp";
+ public static final String RECORDED_SQVGA_H263 = "/sdcard/SQVGA_H263.3gp";
+ public static final String RECORDED_CIF_H263 = "/sdcard/CIF_H263.3gp";
+ public static final String RECORDED_QCIF_H263 = "/sdcard/QCIF_H263.3gp";
+ public static final String RECORDED_PORTRAIT_H263 = "/sdcard/QCIF_mp4.3gp";
+
+ public static final String RECORDED_HVGA_MP4 = "/sdcard/HVGA_mp4.mp4";
+ public static final String RECORDED_QVGA_MP4 = "/sdcard/QVGA_mp4.mp4";
+ public static final String RECORDED_SQVGA_MP4 = "/sdcard/SQVGA_mp4.mp4";
+ public static final String RECORDED_CIF_MP4 = "/sdcard/CIF_mp4.mp4";
+ public static final String RECORDED_QCIF_MP4 = "/sdcard/QCIF_mp4.mp4";
+
+ public static final String RECORDED_VIDEO_3GP = "/sdcard/temp.3gp";
+
+ public static final String INVALD_VIDEO_PATH =
+ "/sdcard/media_api/filepathdoesnotexist" + "/filepathdoesnotexist/temp.3gp";
+
+ public static final long RECORDED_TIME = 5000;
+ public static final long VALID_VIDEO_DURATION = 2000;
+
+ // Streaming test files
+ public static final byte[] STREAM_SERVER =
+ new byte[] {(byte) 75, (byte) 17, (byte) 48, (byte) 204};
+ public static final String STREAM_H264_480_360_1411k =
+ "http://75.17.48.204:10088/yslau/stress_media/h264_regular.mp4";
+ public static final String STREAM_WMV = "http://75.17.48.204:10088/yslau/stress_media/bugs.wmv";
+ public static final String STREAM_H263_176x144_325k =
+ "http://75.17.48.204:10088/yslau/stress_media/h263_regular.3gp";
+ public static final String STREAM_H264_352x288_1536k =
+ "http://75.17.48.204:10088/yslau/stress_media/h264_highBitRate.mp4";
+ public static final String STREAM_MP3 =
+ "http://75.17.48.204:10088/yslau/stress_media/mp3_regular.mp3";
+ public static final String STREAM_MPEG4_QVGA_128k =
+ "http://75.17.48.204:10088/yslau/stress_media/mpeg4_qvga_24fps.3gp";
+ public static final int STREAM_H264_480_360_1411k_DURATION = 46000;
+ public static final int VIDEO_H263_AAC_DURATION = 501000;
+ public static final int VIDEO_H263_AMR_DURATION = 502000;
}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java
index 00e0a52..380de9c 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java
@@ -41,10 +41,7 @@ public class MediaMetadataTest extends AndroidTestCase {
}
public static enum MP3_TEST_FILE{
- ID3V1V2, ID3V2, ID3V1,
- CORRUPTED_ID3V1, CORRUPTED_ID3V2_TALB, CORRUPTED_ID3V2_TCOM,
- CORRUPTED_ID3V2_TCOM_2, CORRUPTED_ID3V2_TRCK, CORRUPTED_D3V2_TRCK_2,
- CORRUPTED_ID3V2_TYER, CORRUPTED_ID3V2_TYER_2, CORRUPTED_ID3V2_TIT
+ ID3V1V2, ID3V2, ID3V1
}
public static METADATA_EXPECTEDRESULT meta;
@@ -64,53 +61,7 @@ public class MediaMetadataTest extends AndroidTestCase {
public static void testID3V1Metadata() throws Exception {
validateMetatData(mp3_test_file.ID3V1.ordinal(), MediaNames.META_DATA_MP3);
}
-
- @MediumTest
- public static void testCorruptedID3V1Metadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_ID3V1.ordinal(), MediaNames.META_DATA_MP3);
- }
- @MediumTest
- public static void testCorrupted_ID3V2_TALBMetadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TALB.ordinal(), MediaNames.META_DATA_MP3);
- }
-
- @MediumTest
- public static void testCorrupted_ID3V2_TCOMMetadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TCOM.ordinal(), MediaNames.META_DATA_MP3);
- }
-
- @MediumTest
- public static void testCorrupted_ID3V2_TCOMM2etadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TCOM_2.ordinal(), MediaNames.META_DATA_MP3);
- }
-
- @MediumTest
- public static void testCorrupted_ID3V2_TRCKMetadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TRCK.ordinal(), MediaNames.META_DATA_MP3);
- }
-
- @MediumTest
- public static void testCorrupted_ID3V2_TRCK2Metadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_D3V2_TRCK_2.ordinal(), MediaNames.META_DATA_MP3);
- }
-
- @MediumTest
- public static void testCorrupted_ID3V2_TYERMetadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TYER.ordinal(), MediaNames.META_DATA_MP3);
- }
-
- @MediumTest
- public static void testCorrupted_ID3V2_TYER2Metadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TYER_2.ordinal(), MediaNames.META_DATA_MP3);
- }
-
- @MediumTest
- public static void testCorrupted_ID3V2_TITMetadata() throws Exception {
- validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TIT.ordinal(), MediaNames.META_DATA_MP3);
- }
-
-
private static void validateMetatData(int fileIndex, String meta_data_file[][]) {
Log.v(TAG, "filePath = "+ meta_data_file[fileIndex][0]);
if ((meta_data_file[fileIndex][0].endsWith("wma") && !MediaProfileReader.getWMAEnable()) ||
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java
index 3a9564d..57d5368 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java
@@ -84,15 +84,6 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra
duratoinWithinTolerence = verifyDuration(duration, MediaNames.MIDI_LENGTH);
assertTrue("MIDI getDuration", duratoinWithinTolerence);
}
-
- @MediumTest
- public void testWMA9GetDuration() throws Exception {
- if (isWMAEnable) {
- int duration = CodecTest.getDuration(MediaNames.WMA9);
- duratoinWithinTolerence = verifyDuration(duration, MediaNames.WMA9_LENGTH);
- assertTrue("WMA9 getDuration", duratoinWithinTolerence);
- }
- }
@MediumTest
public void testAMRGetDuration() throws Exception {
@@ -127,15 +118,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra
boolean currentPosition = CodecTest.getCurrentPosition(MediaNames.MIDI);
assertTrue("MIDI GetCurrentPosition", currentPosition);
}
-
- @LargeTest
- public void testWMA9GetCurrentPosition() throws Exception {
- if (isWMAEnable) {
- boolean currentPosition = CodecTest.getCurrentPosition(MediaNames.WMA9);
- assertTrue("WMA9 GetCurrentPosition", currentPosition);
- }
- }
-
+
@LargeTest
public void testAMRGetCurrentPosition() throws Exception {
boolean currentPosition = CodecTest.getCurrentPosition(MediaNames.AMR);
@@ -166,15 +149,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra
boolean isPaused = CodecTest.pause(MediaNames.MIDI);
assertTrue("MIDI Pause", isPaused);
}
-
- @LargeTest
- public void testWMA9Pause() throws Exception {
- if (isWMAEnable) {
- boolean isPaused = CodecTest.pause(MediaNames.WMA9);
- assertTrue("WMA9 Pause", isPaused);
- }
- }
-
+
@LargeTest
public void testAMRPause() throws Exception {
boolean isPaused = CodecTest.pause(MediaNames.AMR);
@@ -239,15 +214,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra
boolean isLoop = CodecTest.setLooping(MediaNames.MIDI);
assertTrue("MIDI setLooping", isLoop);
}
-
- @LargeTest
- public void testWMA9SetLooping() throws Exception {
- if (isWMAEnable) {
- boolean isLoop = CodecTest.setLooping(MediaNames.WMA9);
- assertTrue("WMA9 setLooping", isLoop);
- }
- }
-
+
@LargeTest
public void testAMRSetLooping() throws Exception {
boolean isLoop = CodecTest.setLooping(MediaNames.AMR);
@@ -279,15 +246,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra
boolean isLoop = CodecTest.seekTo(MediaNames.MIDI);
assertTrue("MIDI seekTo", isLoop);
}
-
- @LargeTest
- public void testWMA9SeekTo() throws Exception {
- if (isWMAEnable) {
- boolean isLoop = CodecTest.seekTo(MediaNames.WMA9);
- assertTrue("WMA9 seekTo", isLoop);
- }
- }
-
+
@LargeTest
public void testAMRSeekTo() throws Exception {
boolean isLoop = CodecTest.seekTo(MediaNames.AMR);
@@ -320,15 +279,6 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra
boolean isEnd = CodecTest.seekToEnd(MediaNames.MIDI);
assertTrue("MIDI seekToEnd", isEnd);
}
-
- @Suppress
- @LargeTest
- public void testWMA9SeekToEnd() throws Exception {
- if (isWMAEnable) {
- boolean isEnd = CodecTest.seekToEnd(MediaNames.WMA9);
- assertTrue("WMA9 seekToEnd", isEnd);
- }
- }
@LargeTest
public void testAMRSeekToEnd() throws Exception {
@@ -393,17 +343,13 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra
boolean isSeek = CodecTest.videoSeekTo(MediaNames.VIDEO_H264_AMR);
assertTrue("H264AMR SeekTo", isSeek);
}
-
+
@LargeTest
- public void testVideoWMVSeekTo() throws Exception {
- Log.v(TAG, "wmv not enable");
- if (isWMVEnable) {
- Log.v(TAG, "wmv enable");
- boolean isSeek = CodecTest.videoSeekTo(MediaNames.VIDEO_WMV);
- assertTrue("WMV SeekTo", isSeek);
- }
+ public void testVideoWebmSeekTo() throws Exception {
+ boolean isSeek = CodecTest.videoSeekTo(MediaNames.VIDEO_WEBM);
+ assertTrue("WEBM SeekTo", isSeek);
}
-
+
@LargeTest
public void testSoundRecord() throws Exception {
boolean isRecordered = CodecTest.mediaRecorderRecord(MediaNames.RECORDER_OUTPUT);
@@ -412,7 +358,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra
@LargeTest
public void testGetThumbnail() throws Exception {
- boolean getThumbnail = CodecTest.getThumbnail(MediaNames.VIDEO_H264_AAC, MediaNames.GOLDEN_THUMBNAIL_OUTPUT_2);
+ boolean getThumbnail = CodecTest.getThumbnail(MediaNames.VIDEO_H264_AAC, MediaNames.GOLDEN_THUMBNAIL_OUTPUT);
assertTrue("Get Thumbnail", getThumbnail);
}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
index 3b5b9a3..b396223 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
@@ -356,26 +356,6 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase2<Med
assertTrue("H264 playback memory test", memoryResult);
}
- // Test case 3: Capture the memory usage after each 20 WMV playback
- @LargeTest
- public void testWMVVideoPlaybackMemoryUsage() throws Exception {
- boolean memoryResult = false;
- if (MediaProfileReader.getWMVEnable()){
- mStartPid = getMediaserverPid();
- File wmvMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
- Writer output = new BufferedWriter(new FileWriter(wmvMemoryOut, true));
- output.write("WMV video playback only\n");
- for (int i = 0; i < NUM_STRESS_LOOP; i++) {
- mediaStressPlayback(MediaNames.VIDEO_WMV);
- getMemoryWriteToLog(output, i);
- }
- output.write("\n");
- memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, DECODER_LIMIT);
- output.close();
- assertTrue("wmv playback memory test", memoryResult);
- }
- }
-
// Test case 4: Capture the memory usage after every 20 video only recorded
@LargeTest
public void testH263RecordVideoOnlyMemoryUsage() throws Exception {
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java
index a66db05..8eb75f3 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java
@@ -76,29 +76,29 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase {
boolean hasFailed = false;
Log.v(TAG, "Thumbnail processing starts");
long startedAt = System.currentTimeMillis();
- for(int i = 0, n = MediaNames.THUMBNAIL_CAPTURE_TEST_FILES.length; i < n; ++i) {
+ for(int i = 0, n = MediaNames.THUMBNAIL_METADATA_TEST_FILES.length; i < n; ++i) {
try {
- Log.v(TAG, "File " + i + ": " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]);
- if ((MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i].endsWith(".wma") && !supportWMA) ||
- (MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i].endsWith(".wmv") && !supportWMV)
+ Log.v(TAG, "File " + i + ": " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]);
+ if ((MediaNames.THUMBNAIL_METADATA_TEST_FILES[i].endsWith(".wma") && !supportWMA) ||
+ (MediaNames.THUMBNAIL_METADATA_TEST_FILES[i].endsWith(".wmv") && !supportWMV)
) {
Log.v(TAG, "windows media is not supported and thus we will skip the test for this file");
continue;
}
- retriever.setDataSource(MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]);
+ retriever.setDataSource(MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]);
Bitmap bitmap = retriever.getFrameAtTime(-1);
assertTrue(bitmap != null);
try {
- java.io.OutputStream stream = new FileOutputStream(MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i] + ".jpg");
+ java.io.OutputStream stream = new FileOutputStream(MediaNames.THUMBNAIL_METADATA_TEST_FILES[i] + ".jpg");
bitmap.compress(Bitmap.CompressFormat.JPEG, 75, stream);
stream.close();
} catch (Exception e) {
- Log.e(TAG, "Fails to convert the bitmap to a JPEG file for " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]);
+ Log.e(TAG, "Fails to convert the bitmap to a JPEG file for " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]);
hasFailed = true;
Log.e(TAG, e.toString());
}
} catch(Exception e) {
- Log.e(TAG, "Fails to setDataSource for file " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]);
+ Log.e(TAG, "Fails to setDataSource for file " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]);
hasFailed = true;
}
Thread.yield(); // Don't be evil
@@ -106,7 +106,7 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase {
long endedAt = System.currentTimeMillis();
retriever.release();
assertTrue(!hasFailed);
- Log.v(TAG, "Average processing time per thumbnail: " + (endedAt - startedAt)/MediaNames.THUMBNAIL_CAPTURE_TEST_FILES.length + " ms");
+ Log.v(TAG, "Average processing time per thumbnail: " + (endedAt - startedAt)/MediaNames.THUMBNAIL_METADATA_TEST_FILES.length + " ms");
}
@LargeTest
@@ -115,19 +115,19 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase {
boolean supportWMV = MediaProfileReader.getWMVEnable();
boolean hasFailed = false;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
- for(int i = 0, n = MediaNames.METADATA_RETRIEVAL_TEST_FILES.length; i < n; ++i) {
+ for(int i = 0, n = MediaNames.THUMBNAIL_METADATA_TEST_FILES.length; i < n; ++i) {
try {
- Log.v(TAG, "File " + i + ": " + MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]);
- if ((MediaNames.METADATA_RETRIEVAL_TEST_FILES[i].endsWith(".wma") && !supportWMA) ||
- (MediaNames.METADATA_RETRIEVAL_TEST_FILES[i].endsWith(".wmv") && !supportWMV)
+ Log.v(TAG, "File " + i + ": " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]);
+ if ((MediaNames.THUMBNAIL_METADATA_TEST_FILES[i].endsWith(".wma") && !supportWMA) ||
+ (MediaNames.THUMBNAIL_METADATA_TEST_FILES[i].endsWith(".wmv") && !supportWMV)
) {
Log.v(TAG, "windows media is not supported and thus we will skip the test for this file");
continue;
}
- retriever.setDataSource(MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]);
+ retriever.setDataSource(MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]);
extractAllSupportedMetadataValues(retriever);
} catch(Exception e) {
- Log.e(TAG, "Fails to setDataSource for file " + MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]);
+ Log.e(TAG, "Fails to setDataSource for file " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]);
hasFailed = true;
}
Thread.yield(); // Don't be evil
@@ -239,45 +239,6 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase {
assertTrue(!hasFailed);
}
- @MediumTest
- public static void testIntendedUsage() {
- // By default, capture frame and retrieve metadata
- MediaMetadataRetriever retriever = new MediaMetadataRetriever();
- boolean hasFailed = false;
- retriever.setDataSource(MediaNames.TEST_PATH_1);
- assertTrue(retriever.getFrameAtTime(-1) != null);
- assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null);
-
- // Do not capture frame or retrieve metadata
- retriever.setDataSource(MediaNames.TEST_PATH_1);
- if (retriever.getFrameAtTime(-1) != null) {
- Log.e(TAG, "No frame expected, but is available");
- hasFailed = true;
- }
- if (retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null) {
- Log.e(TAG, "No num track metadata expected, but is available");
- hasFailed = true;
- }
-
- // Capture frame only
- retriever.setDataSource(MediaNames.TEST_PATH_1);
- assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) == null);
-
- // Retriever metadata only
- retriever.setDataSource(MediaNames.TEST_PATH_1);
- if (retriever.getFrameAtTime(-1) != null) {
- Log.e(TAG, "No frame expected, but is available");
- hasFailed = true;
- }
-
- // Capture frame and retrieve metadata
- retriever.setDataSource(MediaNames.TEST_PATH_1);
- assertTrue(retriever.getFrameAtTime(-1) != null);
- assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null);
- retriever.release();
- assertTrue(!hasFailed);
- }
-
// TODO:
// Encode and test for the correct mix of metadata elements on a per-file basis?
// We should be able to compare the actual returned metadata with the expected metadata
diff --git a/media/tests/contents/media_api/goldenThumbnail.png b/media/tests/contents/media_api/goldenThumbnail.png
new file mode 100755
index 0000000..3bb6ed2
--- /dev/null
+++ b/media/tests/contents/media_api/goldenThumbnail.png
Binary files differ
diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17.mp3
new file mode 100755
index 0000000..e0d6a17
--- /dev/null
+++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17.mp3
Binary files differ
diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3
new file mode 100644
index 0000000..12f7193
--- /dev/null
+++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3
Binary files differ
diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3
new file mode 100644
index 0000000..12f7193
--- /dev/null
+++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3
Binary files differ
diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3
new file mode 100644
index 0000000..29d332b
--- /dev/null
+++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3
Binary files differ
diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3
new file mode 100644
index 0000000..ea52638
--- /dev/null
+++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3
Binary files differ
diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3
new file mode 100644
index 0000000..024039c
--- /dev/null
+++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3
Binary files differ
diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3
new file mode 100644
index 0000000..12f7193
--- /dev/null
+++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3
Binary files differ
diff --git a/media/tests/contents/media_api/music/SHORTMP3.mp3 b/media/tests/contents/media_api/music/SHORTMP3.mp3
new file mode 100755
index 0000000..8b51b5d
--- /dev/null
+++ b/media/tests/contents/media_api/music/SHORTMP3.mp3
Binary files differ
diff --git a/media/tests/contents/media_api/music/ants.mid b/media/tests/contents/media_api/music/ants.mid
new file mode 100755
index 0000000..d4ead53
--- /dev/null
+++ b/media/tests/contents/media_api/music/ants.mid
Binary files differ
diff --git a/media/tests/contents/media_api/music/bzk_chic.wav b/media/tests/contents/media_api/music/bzk_chic.wav
new file mode 100755
index 0000000..bab1a6b
--- /dev/null
+++ b/media/tests/contents/media_api/music/bzk_chic.wav
Binary files differ
diff --git a/media/tests/contents/media_api/music/sine_200+1000Hz_44K_mo.wav b/media/tests/contents/media_api/music/sine_200+1000Hz_44K_mo.wav
new file mode 100755
index 0000000..312b6fb
--- /dev/null
+++ b/media/tests/contents/media_api/music/sine_200+1000Hz_44K_mo.wav
Binary files differ
diff --git a/media/tests/contents/media_api/music/test_amr_ietf.amr b/media/tests/contents/media_api/music/test_amr_ietf.amr
new file mode 100755
index 0000000..540794c
--- /dev/null
+++ b/media/tests/contents/media_api/music/test_amr_ietf.amr
Binary files differ
diff --git a/media/tests/contents/media_api/video/big-buck-bunny_trailer.webm b/media/tests/contents/media_api/video/big-buck-bunny_trailer.webm
new file mode 100755
index 0000000..6a17395
--- /dev/null
+++ b/media/tests/contents/media_api/video/big-buck-bunny_trailer.webm
Binary files differ
diff --git a/opengl/java/com/google/android/gles_jni/EGLImpl.java b/opengl/java/com/google/android/gles_jni/EGLImpl.java
index f162d40..51d6ca8 100644
--- a/opengl/java/com/google/android/gles_jni/EGLImpl.java
+++ b/opengl/java/com/google/android/gles_jni/EGLImpl.java
@@ -85,7 +85,7 @@ public class EGLImpl implements EGL10 {
eglSurfaceId = _eglCreateWindowSurface(display, config, sur, attrib_list);
} else if (native_window instanceof SurfaceTexture) {
eglSurfaceId = _eglCreateWindowSurfaceTexture(display, config,
- ((SurfaceTexture) native_window).mSurfaceTexture, attrib_list);
+ (SurfaceTexture) native_window, attrib_list);
} else {
throw new java.lang.UnsupportedOperationException(
"eglCreateWindowSurface() can only be called with an instance of " +
@@ -143,7 +143,7 @@ public class EGLImpl implements EGL10 {
private native int _eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list);
private native void _eglCreatePixmapSurface(EGLSurface sur, EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list);
private native int _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);
- private native int _eglCreateWindowSurfaceTexture(EGLDisplay display, EGLConfig config, int native_window, int[] attrib_list);
+ private native int _eglCreateWindowSurfaceTexture(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);
private native int _eglGetDisplay(Object native_display);
private native int _eglGetCurrentContext();
private native int _eglGetCurrentDisplay();
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index bbe146d..55f5280 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -33,13 +33,6 @@
android:excludeFromRecents="true">
</activity>
- <activity android:name=".recent.RecentApplicationsActivity"
- android:theme="@android:style/Theme.NoTitleBar"
- android:excludeFromRecents="true"
- android:launchMode="singleInstance"
- android:exported="true">
- </activity>
-
<!-- started from UsbDeviceSettingsManager -->
<activity android:name=".usb.UsbConfirmActivity"
android:exported="true"
diff --git a/packages/SystemUI/res/drawable-hdpi/compat_mode_help_diagram.png b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_diagram.png
new file mode 100644
index 0000000..944b1f0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_diagram.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/compat_mode_help_divider_bottom.9.png b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_divider_bottom.9.png
new file mode 100644
index 0000000..2e11928
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_divider_bottom.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/compat_mode_help_divider_top.9.png b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_divider_top.9.png
new file mode 100644
index 0000000..58a78b7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_divider_top.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/compat_mode_help_icon.png b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_icon.png
new file mode 100644
index 0000000..46bb891
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_icon.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/compat_mode_help_top_divider.9.png b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_top_divider.9.png
new file mode 100644
index 0000000..03a5639
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/compat_mode_help_top_divider.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.png
index 87a67c9..23aabce 100644
--- a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.png
+++ b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.png
new file mode 100644
index 0000000..0b0765b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-large-hdpi/app_icon.png b/packages/SystemUI/res/drawable-large-hdpi/app_icon.png
deleted file mode 100644
index aedf7e7..0000000
--- a/packages/SystemUI/res/drawable-large-hdpi/app_icon.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-large-hdpi/recents_bg_protect_tile.png b/packages/SystemUI/res/drawable-large-hdpi/recents_bg_protect_tile.png
deleted file mode 100644
index a57c27a..0000000
--- a/packages/SystemUI/res/drawable-large-hdpi/recents_bg_protect_tile.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-large-mdpi/app_icon.png b/packages/SystemUI/res/drawable-large-mdpi/app_icon.png
deleted file mode 100644
index 50a8ac8..0000000
--- a/packages/SystemUI/res/drawable-large-mdpi/app_icon.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-large-mdpi/recents_bg_protect_tile.png b/packages/SystemUI/res/drawable-large-mdpi/recents_bg_protect_tile.png
deleted file mode 100644
index 87c7be6..0000000
--- a/packages/SystemUI/res/drawable-large-mdpi/recents_bg_protect_tile.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-large-mdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-large-mdpi/recents_blue_glow.9.png
deleted file mode 100644
index 4f4ae78..0000000
--- a/packages/SystemUI/res/drawable-large-mdpi/recents_blue_glow.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-large-mdpi/recents_callout_line.png b/packages/SystemUI/res/drawable-large-mdpi/recents_callout_line.png
deleted file mode 100644
index 5f4c035..0000000
--- a/packages/SystemUI/res/drawable-large-mdpi/recents_callout_line.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-large-mdpi/recents_thumbnail_bg.png b/packages/SystemUI/res/drawable-large-mdpi/recents_thumbnail_bg.png
deleted file mode 100644
index 87a67c9..0000000
--- a/packages/SystemUI/res/drawable-large-mdpi/recents_thumbnail_bg.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-large-mdpi/recents_thumbnail_bg_press.png b/packages/SystemUI/res/drawable-large-mdpi/recents_thumbnail_bg_press.png
deleted file mode 100644
index a1c39e6..0000000
--- a/packages/SystemUI/res/drawable-large-mdpi/recents_thumbnail_bg_press.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/compat_mode_help_diagram.png b/packages/SystemUI/res/drawable-mdpi/compat_mode_help_diagram.png
new file mode 100644
index 0000000..518a5c1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/compat_mode_help_diagram.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/compat_mode_help_divider_bottom.9.png b/packages/SystemUI/res/drawable-mdpi/compat_mode_help_divider_bottom.9.png
new file mode 100644
index 0000000..3712abf
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/compat_mode_help_divider_bottom.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/compat_mode_help_divider_top.9.png b/packages/SystemUI/res/drawable-mdpi/compat_mode_help_divider_top.9.png
new file mode 100644
index 0000000..a4d08c8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/compat_mode_help_divider_top.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/compat_mode_help_icon.png b/packages/SystemUI/res/drawable-mdpi/compat_mode_help_icon.png
new file mode 100644
index 0000000..233c4df
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/compat_mode_help_icon.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.png
index 87a67c9..23aabce 100644
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.png
+++ b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.png
index a1c39e6..0b0765b 100644
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.png
+++ b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/compat_mode_help_bg.png b/packages/SystemUI/res/drawable-nodpi/compat_mode_help_bg.png
index d1d32a4..59a70ff 100644
--- a/packages/SystemUI/res/drawable-nodpi/compat_mode_help_bg.png
+++ b/packages/SystemUI/res/drawable-nodpi/compat_mode_help_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-hdpi/app_icon.png b/packages/SystemUI/res/drawable-sw600dp-hdpi/app_icon.png
deleted file mode 100644
index aedf7e7..0000000
--- a/packages/SystemUI/res/drawable-sw600dp-hdpi/app_icon.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-mdpi/app_icon.png b/packages/SystemUI/res/drawable-sw600dp-mdpi/app_icon.png
deleted file mode 100644
index 50a8ac8..0000000
--- a/packages/SystemUI/res/drawable-sw600dp-mdpi/app_icon.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/compat_mode_help_bg.png b/packages/SystemUI/res/drawable/compat_mode_help_bg.png
new file mode 100644
index 0000000..87d8c41
--- /dev/null
+++ b/packages/SystemUI/res/drawable/compat_mode_help_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/compat_mode_help_diagram.png b/packages/SystemUI/res/drawable/compat_mode_help_diagram.png
deleted file mode 100644
index e212231..0000000
--- a/packages/SystemUI/res/drawable/compat_mode_help_diagram.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/compat_mode_help_icon.png b/packages/SystemUI/res/drawable/compat_mode_help_icon.png
deleted file mode 100644
index 03bbef9..0000000
--- a/packages/SystemUI/res/drawable/compat_mode_help_icon.png
+++ /dev/null
Binary files differ
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 ce72f04..be4f1d7 100644
--- a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
@@ -39,8 +39,8 @@
android:layout_height="wrap_content"
android:layout_alignLeft="@id/app_thumbnail"
android:layout_alignTop="@id/app_thumbnail"
- android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_border_width"
- android:layout_marginTop="@dimen/status_bar_recents_thumbnail_border_height"
+ android:layout_marginTop="@dimen/status_bar_recents_app_icon_top_margin"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_icon_left_margin"
android:maxWidth="@dimen/status_bar_recents_thumbnail_max_width"
android:maxHeight="@dimen/status_bar_recents_thumbnail_max_height"
android:adjustViewBounds="true"
@@ -56,7 +56,7 @@
android:layout_alignLeft="@id/app_thumbnail"
android:layout_below="@id/app_thumbnail"
android:layout_marginTop="@dimen/status_bar_recents_text_description_padding"
- android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_border_width"
+ android:layout_marginLeft="@dimen/recents_thumbnail_bg_padding_left"
android:singleLine="true"
android:ellipsize="marquee"
/>
@@ -71,7 +71,7 @@
android:layout_alignLeft="@id/app_thumbnail"
android:layout_below="@id/app_label"
android:layout_marginTop="@dimen/status_bar_recents_text_description_padding"
- android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_border_width"
+ android:layout_marginLeft="@dimen/recents_thumbnail_bg_padding_left"
android:singleLine="true"
android:ellipsize="marquee"
/>
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
index 75f5ee4..4a80489 100644
--- a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
@@ -27,10 +27,9 @@
<FrameLayout
android:id="@+id/recents_bg_protect"
android:background="@drawable/recents_bg_protect_tile"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true"
android:paddingBottom="@*android:dimen/status_bar_height"
android:clipToPadding="false"
android:clipChildren="false">
diff --git a/packages/SystemUI/res/layout/status_bar_recent_item.xml b/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
index cd42d7e..76965c9 100644
--- a/packages/SystemUI/res/layout/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
@@ -36,53 +36,52 @@
<ImageView android:id="@+id/app_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:layout_marginLeft="131dip"
- android:layout_marginTop="13dip"
+ android:layout_alignLeft="@id/app_thumbnail"
+ android:layout_alignTop="@id/app_thumbnail"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_icon_left_margin"
+ android:layout_marginTop="@dimen/status_bar_recents_app_icon_top_margin"
android:maxWidth="@dimen/status_bar_recents_thumbnail_max_width"
android:maxHeight="@dimen/status_bar_recents_thumbnail_max_height"
android:adjustViewBounds="true"
/>
- <View android:id="@+id/recents_callout_line"
- android:layout_width="97dip"
- android:layout_height="1dip"
- android:layout_alignParentTop="true"
- android:layout_marginTop="61dip"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_toLeftOf="@id/app_thumbnail"
- android:layout_marginRight="3dip"
- android:background="@drawable/recents_callout_line"
- />
-
<TextView android:id="@+id/app_label"
- android:layout_width="97dip"
+ android:layout_width="@dimen/status_bar_recents_app_label_width"
android:layout_height="wrap_content"
- android:textSize="@dimen/status_bar_recents_app_description_text_size"
+ android:textSize="@dimen/status_bar_recents_app_label_text_size"
android:fadingEdge="horizontal"
android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
android:scrollHorizontally="true"
android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:layout_marginLeft="16dip"
- android:layout_marginTop="32dip"
+ android:layout_alignTop="@id/app_icon"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_label_left_margin"
android:singleLine="true"
android:ellipsize="marquee"
/>
+ <View android:id="@+id/recents_callout_line"
+ android:layout_width="@dimen/status_bar_recents_app_label_width"
+ android:layout_height="1dip"
+ android:layout_alignParentLeft="true"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_label_left_margin"
+ android:layout_toLeftOf="@id/app_thumbnail"
+ android:layout_below="@id/app_label"
+ android:layout_marginRight="3dip"
+ android:layout_marginTop="3dip"
+ android:background="@drawable/recents_callout_line"
+ />
+
<TextView android:id="@+id/app_description"
- android:layout_width="97dip"
+ android:layout_width="@dimen/status_bar_recents_app_label_width"
android:layout_height="wrap_content"
android:textSize="@dimen/status_bar_recents_app_description_text_size"
android:fadingEdge="horizontal"
android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
android:scrollHorizontally="true"
android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:layout_marginLeft="16dip"
- android:layout_marginTop="61dip"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_label_left_margin"
+ android:layout_below="@id/recents_callout_line"
+ android:layout_marginTop="3dip"
android:singleLine="true"
android:ellipsize="marquee"
/>
diff --git a/packages/SystemUI/res/layout/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml
index 703cbc1..9391f9d 100644
--- a/packages/SystemUI/res/layout/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml
@@ -22,12 +22,12 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recents_root"
android:layout_height="match_parent"
- android:layout_width="wrap_content">
+ android:layout_width="match_parent">
<FrameLayout
android:id="@+id/recents_bg_protect"
android:background="@drawable/recents_bg_protect_tile"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:paddingBottom="@*android:dimen/status_bar_height"
@@ -35,9 +35,9 @@
android:clipChildren="false">
<LinearLayout android:id="@+id/recents_glow"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="-49dip"
+ android:layout_marginBottom="0dp"
android:layout_gravity="bottom"
android:background="@drawable/recents_blue_glow"
android:orientation="horizontal"
@@ -47,7 +47,7 @@
<com.android.systemui.recent.RecentsVerticalScrollView android:id="@+id/recents_container"
android:layout_width="@dimen/status_bar_recents_width"
android:layout_height="wrap_content"
- android:layout_marginRight="@dimen/status_bar_recents_right_glow_margin"
+ android:layout_marginRight="0dp"
android:divider="@null"
android:stackFromBottom="true"
android:fadingEdge="vertical"
diff --git a/packages/SystemUI/res/layout-sw600dp/compat_mode_help.xml b/packages/SystemUI/res/layout-sw600dp/compat_mode_help.xml
index df3c5a3..d29e495 100644
--- a/packages/SystemUI/res/layout-sw600dp/compat_mode_help.xml
+++ b/packages/SystemUI/res/layout-sw600dp/compat_mode_help.xml
@@ -27,51 +27,62 @@
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="160dp"
+ android:layout_marginLeft="80dp"
android:layout_marginTop="80dp"
+ android:layout_marginRight="80dp"
android:textSize="60sp"
android:maxLines="1"
android:shadowRadius="8"
android:shadowColor="#FF000000"
android:text="@string/compat_mode_help_header"
+ android:background="@drawable/compat_mode_help_divider_top"
/>
<ImageView
android:id="@+id/diagram"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="160dp"
- android:layout_marginTop="80dp"
android:layout_centerInParent="true"
android:src="@drawable/compat_mode_help_diagram"
/>
- <TextView
- android:id="@+id/explanation"
+ <RelativeLayout
+ android:orientation="horizontal"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="80dp"
- android:layout_marginRight="240dp"
+ android:layout_height="190dp"
+ android:background="@drawable/compat_mode_help_divider_bottom"
+ android:layout_marginBottom="55dp"
+ android:layout_marginRight="80dp"
android:layout_alignLeft="@id/header"
android:layout_alignParentBottom="true"
- android:shadowRadius="4"
- android:shadowColor="#FF000000"
- android:textSize="28sp"
- android:text="@string/compat_mode_help_body"
- />
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginRight="80dp"
- android:layout_alignBottom="@id/explanation"
- android:layout_alignParentRight="true"
- android:src="@drawable/compat_mode_help_icon"
- />
+ >
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/compat_mode_help_icon"
+ />
+ <TextView
+ android:id="@+id/explanation"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_alignParentLeft="true"
+ android:layout_toLeftOf="@id/icon"
+ android:layout_marginRight="10dp"
+ android:shadowRadius="4"
+ android:shadowColor="#FF000000"
+ android:textSize="28sp"
+ android:text="@string/compat_mode_help_body"
+ />
+ </RelativeLayout>
<Button
android:id="@+id/button"
android:layout_width="208dp"
android:layout_height="48dp"
android:layout_alignLeft="@id/header"
android:layout_alignParentBottom="true"
- android:layout_marginBottom="10dp"
+ android:layout_marginBottom="20dp"
android:textSize="28sp"
android:text="@android:string/ok"
/>
diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_compat_mode_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_compat_mode_panel.xml
index c151565..a33741e 100644
--- a/packages/SystemUI/res/layout-sw600dp/status_bar_compat_mode_panel.xml
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_compat_mode_panel.xml
@@ -31,13 +31,13 @@
android:orientation="vertical"
android:padding="10dp"
>
- <RadioButton android:id="@+id/compat_mode_on_radio"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/compat_mode_on" />
<RadioButton android:id="@+id/compat_mode_off_radio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/compat_mode_off" />
+ <RadioButton android:id="@+id/compat_mode_on_radio"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/compat_mode_on" />
</RadioGroup>
</com.android.systemui.statusbar.tablet.CompatModePanel>
diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
index cd42d7e..9687866 100644
--- a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
@@ -36,53 +36,53 @@
<ImageView android:id="@+id/app_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:layout_marginLeft="131dip"
- android:layout_marginTop="13dip"
+ android:layout_alignLeft="@id/app_thumbnail"
+ android:layout_alignTop="@id/app_thumbnail"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_icon_left_margin"
+ android:layout_marginTop="@dimen/status_bar_recents_app_icon_top_margin"
android:maxWidth="@dimen/status_bar_recents_thumbnail_max_width"
android:maxHeight="@dimen/status_bar_recents_thumbnail_max_height"
android:adjustViewBounds="true"
/>
- <View android:id="@+id/recents_callout_line"
- android:layout_width="97dip"
- android:layout_height="1dip"
- android:layout_alignParentTop="true"
- android:layout_marginTop="61dip"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="16dip"
- android:layout_toLeftOf="@id/app_thumbnail"
- android:layout_marginRight="3dip"
- android:background="@drawable/recents_callout_line"
- />
-
<TextView android:id="@+id/app_label"
- android:layout_width="97dip"
+ android:layout_width="@dimen/status_bar_recents_app_label_width"
android:layout_height="wrap_content"
- android:textSize="@dimen/status_bar_recents_app_description_text_size"
+ android:textSize="@dimen/status_bar_recents_app_label_text_size"
android:fadingEdge="horizontal"
android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
android:scrollHorizontally="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
- android:layout_marginLeft="16dip"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_label_left_margin"
android:layout_marginTop="32dip"
android:singleLine="true"
android:ellipsize="marquee"
/>
+ <View android:id="@+id/recents_callout_line"
+ android:layout_width="@dimen/status_bar_recents_app_label_width"
+ android:layout_height="1dip"
+ android:layout_below="@id/app_label"
+ android:layout_marginTop="3dip"
+ android:layout_alignParentLeft="true"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_label_left_margin"
+ android:layout_toLeftOf="@id/app_thumbnail"
+ android:layout_marginRight="3dip"
+ android:background="@drawable/recents_callout_line"
+ />
+
<TextView android:id="@+id/app_description"
- android:layout_width="97dip"
+ android:layout_width="@dimen/status_bar_recents_app_label_width"
android:layout_height="wrap_content"
android:textSize="@dimen/status_bar_recents_app_description_text_size"
android:fadingEdge="horizontal"
android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
android:scrollHorizontally="true"
android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:layout_marginLeft="16dip"
- android:layout_marginTop="61dip"
+ android:layout_below="@id/recents_callout_line"
+ android:layout_marginLeft="@dimen/status_bar_recents_app_label_left_margin"
+ android:layout_marginTop="3dip"
android:singleLine="true"
android:ellipsize="marquee"
/>
diff --git a/packages/SystemUI/res/layout/recent_apps_activity.xml b/packages/SystemUI/res/layout/recent_apps_activity.xml
deleted file mode 100644
index ec661e8..0000000
--- a/packages/SystemUI/res/layout/recent_apps_activity.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <!-- Title -->
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="#80FFFFFF"
- android:textStyle="bold"
- android:singleLine="true"
- android:text="@string/recent_tasks_title"
- android:visibility="gone"/>
-
- <!-- This is only intended to be visible when carousel is invisible -->
- <TextView
- android:id="@+id/no_applications_message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:text="@string/recent_tasks_empty"
- android:visibility="gone"/>
-
- <com.android.systemui.recent.RecentApplicationsCarouselView
- android:id="@+id/carousel"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1">
- </com.android.systemui.recent.RecentApplicationsCarouselView>
-
-</LinearLayout>
diff --git a/packages/SystemUI/res/layout/recents_detail_view.xml b/packages/SystemUI/res/layout/recents_detail_view.xml
deleted file mode 100644
index 879d0f2..0000000
--- a/packages/SystemUI/res/layout/recents_detail_view.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <!-- Application Title -->
- <TextView android:id="@+id/app_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:singleLine="true"/>
-
- <!-- Application Details -->
- <TextView
- android:id="@+id/app_description"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"/>
-
-</LinearLayout>
diff --git a/packages/SystemUI/res/values-hdpi/dimens.xml b/packages/SystemUI/res/values-hdpi/dimens.xml
new file mode 100644
index 0000000..741b75a
--- /dev/null
+++ b/packages/SystemUI/res/values-hdpi/dimens.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2011, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+-->
+<resources>
+ <!-- Offsets for rendering thumbnails over drawable recents_thumbnail_bg -->
+ <dimen name="recents_thumbnail_bg_padding_left">6px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_top">7px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_right">6px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_bottom">6px</dimen>
+</resources>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index 6f1453e..0219a77 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -23,15 +23,17 @@
<!-- Width of a recent app view, including all content -->
<dimen name="status_bar_recents_thumbnail_view_width">156dp</dimen>
<!-- How far the thumbnail for a recent app appears from left edge -->
- <dimen name="status_bar_recents_thumbnail_left_margin">0dp</dimen>
+ <dimen name="status_bar_recents_thumbnail_left_margin">8dp</dimen>
+ <!-- How far the thumbnail for a recent app appears from top edge -->
+ <dimen name="status_bar_recents_thumbnail_top_margin">12dp</dimen>
<!-- Width of scrollable area in recents -->
<dimen name="status_bar_recents_width">128dp</dimen>
- <!-- Thumbnail border width -->
- <dimen name="status_bar_recents_thumbnail_border_width">8dp</dimen>
- <!-- Thumbnail border height -->
- <dimen name="status_bar_recents_thumbnail_border_height">12dp</dimen>
<!-- Padding for text descriptions -->
<dimen name="status_bar_recents_text_description_padding">8dp</dimen>
+ <!-- Width of application label text -->
+ <dimen name="status_bar_recents_app_label_width">97dip</dimen>
+ <!-- Left margin of application label text -->
+ <dimen name="status_bar_recents_app_label_left_margin">16dip</dimen>
<!-- Margin between recents container and glow on the right -->
<dimen name="status_bar_recents_right_glow_margin">0dip</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-large/dimens.xml b/packages/SystemUI/res/values-large/dimens.xml
index f8a4a1c..9d89e21 100644
--- a/packages/SystemUI/res/values-large/dimens.xml
+++ b/packages/SystemUI/res/values-large/dimens.xml
@@ -22,32 +22,6 @@
<dimen name="status_bar_panel_bottom_offset">36dp</dimen>
<!-- gap on either side of status bar notification icons -->
<dimen name="status_bar_icon_padding">8dp</dimen>
-
- <!-- Recent Applications parameters -->
- <!-- Width of a recent app view, including all content -->
- <dimen name="status_bar_recents_thumbnail_view_width">156dp</dimen>
- <!-- How far the thumbnail for a recent app appears from left edge -->
- <dimen name="status_bar_recents_thumbnail_left_margin">110dp</dimen>
- <!-- Upper width limit for application icon -->
- <dimen name="status_bar_recents_thumbnail_max_width">64dp</dimen>
- <!-- Upper height limit for application icon -->
- <dimen name="status_bar_recents_thumbnail_max_height">64dp</dimen>
- <!-- Width of scrollable area in recents -->
- <dimen name="status_bar_recents_width">356dp</dimen>
- <!-- Thumbnail border width -->
- <dimen name="status_bar_recents_thumbnail_border_width">12dp</dimen>
- <!-- Thumbnail border height -->
- <dimen name="status_bar_recents_thumbnail_border_height">12dp</dimen>
- <!-- Padding for text descriptions -->
- <dimen name="status_bar_recents_text_description_padding">8dp</dimen>
- <!-- Size of application label text -->
- <dimen name="status_bar_recents_app_label_text_size">18dip</dimen>
- <!-- Size of application description text -->
- <dimen name="status_bar_recents_app_description_text_size">18dip</dimen>
- <!-- Size of fading edge for scroll effect -->
- <dimen name="status_bar_recents_fading_edge_length">20dip</dimen>
- <!-- Margin between recents container and glow on the right -->
- <dimen name="status_bar_recents_right_glow_margin">100dip</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-mdpi/dimens.xml b/packages/SystemUI/res/values-mdpi/dimens.xml
new file mode 100644
index 0000000..741b75a
--- /dev/null
+++ b/packages/SystemUI/res/values-mdpi/dimens.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2011, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+-->
+<resources>
+ <!-- Offsets for rendering thumbnails over drawable recents_thumbnail_bg -->
+ <dimen name="recents_thumbnail_bg_padding_left">6px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_top">7px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_right">6px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_bottom">6px</dimen>
+</resources>
diff --git a/packages/SystemUI/res/values-port/dimens.xml b/packages/SystemUI/res/values-port/dimens.xml
new file mode 100644
index 0000000..54c25fa
--- /dev/null
+++ b/packages/SystemUI/res/values-port/dimens.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2006, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+-->
+<resources>
+ <!-- Recent Applications parameters -->
+ <!-- Width of a recent app view, including all content -->
+ <dimen name="status_bar_recents_thumbnail_view_width">156dp</dimen>
+ <!-- How far the thumbnail for a recent app appears from left edge -->
+ <dimen name="status_bar_recents_thumbnail_left_margin">110dp</dimen>
+ <!-- Width of scrollable area in recents -->
+ <dimen name="status_bar_recents_width">356dp</dimen>
+ <!-- Padding for text descriptions -->
+ <dimen name="status_bar_recents_text_description_padding">8dp</dimen>
+ <!-- Width of application label text -->
+ <dimen name="status_bar_recents_app_label_width">97dip</dimen>
+ <!-- Left margin of application label text -->
+ <dimen name="status_bar_recents_app_label_left_margin">16dip</dimen>
+ <!-- Margin between recents container and glow on the right -->
+ <dimen name="status_bar_recents_right_glow_margin">100dip</dimen>
+</resources>
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index 944e0ee..b4fd8ab 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -28,4 +28,40 @@
<dimen name="notification_panel_min_height">770dp</dimen>
<!-- Bottom margin (from display edge) for status bar panels -->
<dimen name="panel_float">56dp</dimen>
+
+ <!-- Recent Applications parameters -->
+ <!-- Width of a recent app view, including all content -->
+ <dimen name="status_bar_recents_thumbnail_view_width">156dp</dimen>
+ <!-- How far the thumbnail for a recent app appears from left edge -->
+ <dimen name="status_bar_recents_thumbnail_left_margin">110dp</dimen>
+ <!-- Upper width limit for application icon -->
+ <dimen name="status_bar_recents_thumbnail_max_width">64dp</dimen>
+ <!-- Upper height limit for application icon -->
+ <dimen name="status_bar_recents_thumbnail_max_height">64dp</dimen>
+ <!-- Width of scrollable area in recents -->
+ <dimen name="status_bar_recents_width">356dp</dimen>
+ <!-- Padding for text descriptions -->
+ <dimen name="status_bar_recents_text_description_padding">8dp</dimen>
+ <!-- Size of application label text -->
+ <dimen name="status_bar_recents_app_label_text_size">18dip</dimen>
+ <!-- Size of application description text -->
+ <dimen name="status_bar_recents_app_description_text_size">18dip</dimen>
+ <!-- Width of application label text -->
+ <dimen name="status_bar_recents_app_label_width">97dip</dimen>
+ <!-- Left margin for application label -->
+ <dimen name="status_bar_recents_app_label_left_margin">16dip</dimen>
+ <!-- Size of fading edge for scroll effect -->
+ <dimen name="status_bar_recents_fading_edge_length">20dip</dimen>
+ <!-- Margin between recents container and glow on the right -->
+ <dimen name="status_bar_recents_right_glow_margin">100dip</dimen>
+
+ <!-- Offsets for rendering thumbnails over drawable recents_thumbnail_bg -->
+ <dimen name="recents_thumbnail_bg_padding_left">15px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_top">8px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_right">12px</dimen>
+ <dimen name="recents_thumbnail_bg_padding_bottom">8px</dimen>
+
+ <!-- Where to place the app icon over the thumbnail -->
+ <dimen name="status_bar_recents_app_icon_left_margin">13dp</dimen>
+ <dimen name="status_bar_recents_app_icon_top_margin">13dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 83eaaa8..fc35a48 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -20,22 +20,14 @@
<dimen name="status_bar_edge_ignore">5dp</dimen>
<!-- Recent Applications parameters -->
- <!-- Width of a recent app view, including all content -->
- <dimen name="status_bar_recents_thumbnail_view_width">156dp</dimen>
- <!-- How far the thumbnail for a recent app appears from left edge -->
- <dimen name="status_bar_recents_thumbnail_left_margin">110dp</dimen>
<!-- Upper width limit for application icon -->
<dimen name="status_bar_recents_thumbnail_max_width">64dp</dimen>
<!-- Upper height limit for application icon -->
<dimen name="status_bar_recents_thumbnail_max_height">64dp</dimen>
- <!-- Width of scrollable area in recents -->
- <dimen name="status_bar_recents_width">356dp</dimen>
- <!-- Thumbnail border width -->
- <dimen name="status_bar_recents_thumbnail_border_width">12dp</dimen>
- <!-- Thumbnail border height -->
- <dimen name="status_bar_recents_thumbnail_border_height">12dp</dimen>
- <!-- Padding for text descriptions -->
- <dimen name="status_bar_recents_text_description_padding">8dp</dimen>
+ <!-- Where to place the app icon over the thumbnail -->
+ <dimen name="status_bar_recents_app_icon_left_margin">13dp</dimen>
+ <dimen name="status_bar_recents_app_icon_top_margin">13dp</dimen>
+
<!-- Size of application label text -->
<dimen name="status_bar_recents_app_label_text_size">18dip</dimen>
<!-- Size of application description text -->
diff --git a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java
index b876075..49a65d8 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java
@@ -36,14 +36,16 @@ import android.view.View;
View mScrimView;
View mContentView;
AnimatorSet mContentAnim;
+ Animator.AnimatorListener mListener;
// the panel will start to appear this many px from the end
final int HYPERSPACE_OFFRAMP = 200;
- public Choreographer(View root, View scrim, View content) {
+ public Choreographer(View root, View scrim, View content, Animator.AnimatorListener listener) {
mRootView = root;
mScrimView = scrim;
mContentView = content;
+ mListener = listener;
}
void createAnimation(boolean appearing) {
@@ -86,6 +88,9 @@ import android.view.View;
.with(posAnim);
mContentAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION);
mContentAnim.addListener(this);
+ if (mListener != null) {
+ mContentAnim.addListener(mListener);
+ }
}
void startAnimation(boolean appearing) {
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
index 194c9d1..3dbcc59 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
@@ -16,7 +16,7 @@
package com.android.systemui.recent;
-import com.android.systemui.recent.RecentsPanelView.ActvityDescriptionAdapter;
+import com.android.systemui.recent.RecentsPanelView.ActivityDescriptionAdapter;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
@@ -49,7 +49,7 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
private static final float THRESHHOLD = 50;
private static final boolean DEBUG_INVALIDATE = false;
private LinearLayout mLinearLayout;
- private ActvityDescriptionAdapter mAdapter;
+ private ActivityDescriptionAdapter mAdapter;
private RecentsCallback mCallback;
protected int mLastScrollPosition;
private View mCurrentView;
@@ -273,7 +273,7 @@ public class RecentsHorizontalScrollView extends HorizontalScrollView
}
}
- public void setAdapter(ActvityDescriptionAdapter adapter) {
+ public void setAdapter(ActivityDescriptionAdapter adapter) {
mAdapter = adapter;
mAdapter.registerDataSetObserver(new DataSetObserver() {
public void onChanged() {
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index e2b3446..b8dc63d 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -19,6 +19,7 @@ package com.android.systemui.recent;
import java.util.ArrayList;
import java.util.List;
+import android.animation.Animator;
import android.animation.LayoutTransition;
import android.app.ActivityManager;
import android.content.Context;
@@ -52,27 +53,33 @@ import android.widget.RelativeLayout;
import android.widget.TextView;
import com.android.systemui.R;
+import com.android.systemui.statusbar.StatusBar;
+import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.tablet.StatusBarPanel;
import com.android.systemui.statusbar.tablet.TabletStatusBar;
public class RecentsPanelView extends RelativeLayout
- implements OnItemClickListener, RecentsCallback, StatusBarPanel {
- private static final int GLOW_PADDING = 15;
+ implements OnItemClickListener, RecentsCallback, StatusBarPanel, Animator.AnimatorListener {
static final String TAG = "RecentsListView";
- static final boolean DEBUG = TabletStatusBar.DEBUG;
+ static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG;
private static final int DISPLAY_TASKS = 20;
private static final int MAX_TASKS = DISPLAY_TASKS + 1; // allow extra for non-apps
- private TabletStatusBar mBar;
+ private StatusBar mBar;
private ArrayList<ActivityDescription> mActivityDescriptions;
private int mIconDpi;
private View mRecentsScrim;
private View mRecentsGlowView;
private View mRecentsContainer;
private Bitmap mGlowBitmap;
+ // TODO: add these widgets attributes to the layout file
+ private int mGlowBitmapPaddingLeftPx;
+ private int mGlowBitmapPaddingTopPx;
+ private int mGlowBitmapPaddingRightPx;
+ private int mGlowBitmapPaddingBottomPx;
private boolean mShowing;
private Choreographer mChoreo;
private View mRecentsDismissButton;
- private ActvityDescriptionAdapter mListAdapter;
+ private ActivityDescriptionAdapter mListAdapter;
/* package */ final static class ActivityDescription {
int taskId; // application task id for curating apps
@@ -108,10 +115,10 @@ public class RecentsPanelView extends RelativeLayout
ActivityDescription activityDescription;
}
- /* package */ final class ActvityDescriptionAdapter extends BaseAdapter {
+ /* package */ final class ActivityDescriptionAdapter extends BaseAdapter {
private LayoutInflater mInflater;
- public ActvityDescriptionAdapter(Context context) {
+ public ActivityDescriptionAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
@@ -183,6 +190,26 @@ public class RecentsPanelView extends RelativeLayout
}
}
+ public void onAnimationCancel(Animator animation) {
+ }
+
+ public void onAnimationEnd(Animator animation) {
+ if (mShowing) {
+ final LayoutTransition transitioner = new LayoutTransition();
+ ((ViewGroup)mRecentsContainer).setLayoutTransition(transitioner);
+ createCustomAnimations(transitioner);
+ } else {
+ ((ViewGroup)mRecentsContainer).setLayoutTransition(null);
+ }
+ }
+
+ public void onAnimationRepeat(Animator animation) {
+ }
+
+ public void onAnimationStart(Animator animation) {
+ }
+
+
/**
* We need to be aligned at the bottom. LinearLayout can't do this, so instead,
* let LinearLayout do all the hard work, and then shift everything down to the bottom.
@@ -201,7 +228,7 @@ public class RecentsPanelView extends RelativeLayout
return mShowing;
}
- public void setBar(TabletStatusBar bar) {
+ public void setBar(StatusBar bar) {
mBar = bar;
}
@@ -217,7 +244,16 @@ public class RecentsPanelView extends RelativeLayout
& Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE;
mIconDpi = xlarge ? DisplayMetrics.DENSITY_HIGH : res.getDisplayMetrics().densityDpi;
+
mGlowBitmap = BitmapFactory.decodeResource(res, R.drawable.recents_thumbnail_bg);
+ mGlowBitmapPaddingLeftPx =
+ res.getDimensionPixelSize(R.dimen.recents_thumbnail_bg_padding_left);
+ mGlowBitmapPaddingTopPx =
+ res.getDimensionPixelSize(R.dimen.recents_thumbnail_bg_padding_top);
+ mGlowBitmapPaddingRightPx =
+ res.getDimensionPixelSize(R.dimen.recents_thumbnail_bg_padding_right);
+ mGlowBitmapPaddingBottomPx =
+ res.getDimensionPixelSize(R.dimen.recents_thumbnail_bg_padding_bottom);
}
@Override
@@ -225,7 +261,7 @@ public class RecentsPanelView extends RelativeLayout
super.onFinishInflate();
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mRecentsContainer = findViewById(R.id.recents_container);
- mListAdapter = new ActvityDescriptionAdapter(mContext);
+ mListAdapter = new ActivityDescriptionAdapter(mContext);
if (mRecentsContainer instanceof RecentsListView) {
RecentsListView listView = (RecentsListView) mRecentsContainer;
listView.setAdapter(mListAdapter);
@@ -246,13 +282,10 @@ public class RecentsPanelView extends RelativeLayout
throw new IllegalArgumentException("missing RecentsListView/RecentsScrollView");
}
- final LayoutTransition transitioner = new LayoutTransition();
- ((ViewGroup)mRecentsContainer).setLayoutTransition(transitioner);
- createCustomAnimations(transitioner);
mRecentsGlowView = findViewById(R.id.recents_glow);
mRecentsScrim = (View) findViewById(R.id.recents_bg_protect);
- mChoreo = new Choreographer(this, mRecentsScrim, mRecentsGlowView);
+ mChoreo = new Choreographer(this, mRecentsScrim, mRecentsGlowView, this);
mRecentsDismissButton = findViewById(R.id.recents_dismiss_button);
mRecentsDismissButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
@@ -402,10 +435,9 @@ public class RecentsPanelView extends RelativeLayout
Log.v(TAG, "Source thumb: " + srcWidth + "x" + srcHeight);
canvas.drawBitmap(thumbnail,
new Rect(0, 0, srcWidth-1, srcHeight-1),
- new RectF(GLOW_PADDING,
- GLOW_PADDING - 7.0f,
- outBitmap.getWidth() - GLOW_PADDING + 3.0f,
- outBitmap.getHeight() - GLOW_PADDING + 7.0f), paint);
+ new RectF(mGlowBitmapPaddingLeftPx, mGlowBitmapPaddingTopPx,
+ outBitmap.getWidth() - mGlowBitmapPaddingRightPx,
+ outBitmap.getHeight() - mGlowBitmapPaddingBottomPx), paint);
}
return outBitmap;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
index 54ec6b5..6a962cb 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
@@ -16,7 +16,7 @@
package com.android.systemui.recent;
-import com.android.systemui.recent.RecentsPanelView.ActvityDescriptionAdapter;
+import com.android.systemui.recent.RecentsPanelView.ActivityDescriptionAdapter;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
@@ -49,7 +49,7 @@ public class RecentsVerticalScrollView extends ScrollView
private static final float THRESHHOLD = 50;
private static final boolean DEBUG_INVALIDATE = false;
private LinearLayout mLinearLayout;
- private ActvityDescriptionAdapter mAdapter;
+ private ActivityDescriptionAdapter mAdapter;
private RecentsCallback mCallback;
protected int mLastScrollPosition;
private View mCurrentView;
@@ -275,7 +275,7 @@ public class RecentsVerticalScrollView extends ScrollView
}
}
- public void setAdapter(ActvityDescriptionAdapter adapter) {
+ public void setAdapter(ActivityDescriptionAdapter adapter) {
mAdapter = adapter;
mAdapter.registerDataSetObserver(new DataSetObserver() {
public void onChanged() {
diff --git a/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsActivity.java
deleted file mode 100644
index 45e230f..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsActivity.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.android.systemui.recent.carousel;
-
-import com.android.systemui.R;
-
-import com.android.ex.carousel.CarouselView;
-import com.android.ex.carousel.CarouselViewHelper;
-import com.android.ex.carousel.CarouselRS.CarouselCallback;
-import com.android.ex.carousel.CarouselViewHelper.DetailTextureParameters;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.ActivityManagerNative;
-import android.app.IActivityManager;
-import android.app.IThumbnailReceiver;
-import android.app.ActivityManager.RunningTaskInfo;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.PaintFlagsDrawFilter;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.PorterDuff;
-import android.graphics.Bitmap.Config;
-import android.graphics.drawable.Drawable;
-import android.graphics.PixelFormat;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.View;
-import android.view.View.MeasureSpec;
-import android.widget.TextView;
-
-public class RecentApplicationsActivity extends Activity {
- private static final String TAG = "RecentApplicationsActivity";
- private static boolean DBG = false;
- private static final int CARD_SLOTS = 56;
- private static final int VISIBLE_SLOTS = 7;
- private static final int MAX_TASKS = VISIBLE_SLOTS * 2;
-
- // TODO: these should be configurable
- private static final int DETAIL_TEXTURE_MAX_WIDTH = 200;
- private static final int DETAIL_TEXTURE_MAX_HEIGHT = 80;
- private static final int TEXTURE_WIDTH = 256;
- private static final int TEXTURE_HEIGHT = 256;
-
- private ActivityManager mActivityManager;
- private List<RunningTaskInfo> mRunningTaskList;
- private boolean mPortraitMode = true;
- private ArrayList<ActivityDescription> mActivityDescriptions
- = new ArrayList<ActivityDescription>();
- private CarouselView mCarouselView;
- private LocalCarouselViewHelper mHelper;
- private View mNoRecentsView;
- private Bitmap mLoadingBitmap;
- private Bitmap mRecentOverlay;
- private boolean mHidden = false;
- private boolean mHiding = false;
- private DetailInfo mDetailInfo;
-
- /**
- * This class is a container for all items associated with the DetailView we'll
- * be drawing to a bitmap and sending to Carousel.
- *
- */
- static final class DetailInfo {
- public DetailInfo(View _view, TextView _title, TextView _desc) {
- view = _view;
- title = _title;
- description = _desc;
- }
-
- /**
- * Draws view into the given bitmap, if provided
- * @param bitmap
- */
- public Bitmap draw(Bitmap bitmap) {
- resizeView(view, DETAIL_TEXTURE_MAX_WIDTH, DETAIL_TEXTURE_MAX_HEIGHT);
- int desiredWidth = view.getWidth();
- int desiredHeight = view.getHeight();
- if (bitmap == null || desiredWidth != bitmap.getWidth()
- || desiredHeight != bitmap.getHeight()) {
- bitmap = Bitmap.createBitmap(desiredWidth, desiredHeight, Config.ARGB_8888);
- }
- Canvas canvas = new Canvas(bitmap);
- view.draw(canvas);
- return bitmap;
- }
-
- /**
- * Force a layout pass on the given view.
- */
- private void resizeView(View view, int maxWidth, int maxHeight) {
- int widthSpec = MeasureSpec.getMode(MeasureSpec.AT_MOST)
- | MeasureSpec.getSize(maxWidth);
- int heightSpec = MeasureSpec.getMode(MeasureSpec.AT_MOST)
- | MeasureSpec.getSize(maxHeight);
- view.measure(widthSpec, heightSpec);
- view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
- Log.v(TAG, "RESIZED VIEW: " + view.getWidth() + ", " + view.getHeight());
- }
-
- public View view;
- public TextView title;
- public TextView description;
- }
-
- static class ActivityDescription {
- int id;
- Bitmap thumbnail; // generated by Activity.onCreateThumbnail()
- Drawable icon; // application package icon
- String label; // application package label
- CharSequence description; // generated by Activity.onCreateDescription()
- Intent intent; // launch intent for application
- Matrix matrix; // arbitrary rotation matrix to correct orientation
- int position; // position in list
-
- public ActivityDescription(Bitmap _thumbnail,
- Drawable _icon, String _label, String _desc, int _id, int _pos)
- {
- thumbnail = _thumbnail;
- icon = _icon;
- label = _label;
- description = _desc;
- id = _id;
- position = _pos;
- }
-
- public void clear() {
- icon = null;
- thumbnail = null;
- label = null;
- description = null;
- intent = null;
- matrix = null;
- id = -1;
- position = -1;
- }
- };
-
- private ActivityDescription findActivityDescription(int id) {
- for (int i = 0; i < mActivityDescriptions.size(); i++) {
- ActivityDescription item = mActivityDescriptions.get(i);
- if (item != null && item.id == id) {
- return item;
- }
- }
- return null;
- }
-
- private class LocalCarouselViewHelper extends CarouselViewHelper {
- private DetailTextureParameters mDetailParams = new DetailTextureParameters(10.0f, 20.0f);
-
- public LocalCarouselViewHelper(Context context) {
- super(context);
- }
-
- @Override
- public DetailTextureParameters getDetailTextureParameters(int id) {
- return mDetailParams;
- }
-
- public void onCardSelected(int n) {
- if (n < mActivityDescriptions.size()) {
- ActivityDescription item = mActivityDescriptions.get(n);
- if (item.id >= 0) {
- // This is an active task; it should just go to the foreground.
- final ActivityManager am = (ActivityManager)
- getSystemService(Context.ACTIVITY_SERVICE);
- am.moveTaskToFront(item.id, ActivityManager.MOVE_TASK_WITH_HOME);
- } else if (item.intent != null) {
- // prepare a launch intent and send it
- item.intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
- | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- try {
- if (DBG) Log.v(TAG, "Starting intent " + item.intent);
- startActivity(item.intent);
- overridePendingTransition(R.anim.recent_app_enter, R.anim.recent_app_leave);
- } catch (ActivityNotFoundException e) {
- if (DBG) Log.w("Recent", "Unable to launch recent task", e);
- }
- finish();
- }
- }
- }
-
- @Override
- public Bitmap getTexture(final int id) {
- if (DBG) Log.v(TAG, "onRequestTexture(" + id + ")");
- ActivityDescription info;
- synchronized(mActivityDescriptions) {
- info = mActivityDescriptions.get(id);
- }
- Bitmap bitmap = null;
- if (info != null) {
- bitmap = compositeBitmap(info);
- }
- return bitmap;
- }
-
- @Override
- public Bitmap getDetailTexture(int n) {
- Bitmap bitmap = null;
- if (n < mActivityDescriptions.size()) {
- ActivityDescription item = mActivityDescriptions.get(n);
- mDetailInfo.title.setText(item.label);
- mDetailInfo.description.setText(item.description);
- bitmap = mDetailInfo.draw(null);
- }
- return bitmap;
- }
- };
-
- private Bitmap compositeBitmap(ActivityDescription info) {
- final int targetWidth = TEXTURE_WIDTH;
- final int targetHeight = TEXTURE_HEIGHT;
- final int border = 3; // inset along the edge for thumnnail content
- final int overlap = 1; // how many pixels of overlap between border and thumbnail
- final Resources res = getResources();
- if (mRecentOverlay == null) {
- mRecentOverlay = BitmapFactory.decodeResource(res, R.drawable.recent_overlay);
- }
-
- // Create a bitmap of the proper size/format and set the canvas to draw to it
- final Bitmap result = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(result);
- canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, Paint.FILTER_BITMAP_FLAG));
- Paint paint = new Paint();
- paint.setFilterBitmap(false);
-
- paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
- canvas.save();
- if (info.thumbnail != null) {
- // Draw the thumbnail
- int sourceWidth = targetWidth - 2 * (border - overlap);
- int sourceHeight = targetHeight - 2 * (border - overlap);
- final float scaleX = (float) sourceWidth / info.thumbnail.getWidth();
- final float scaleY = (float) sourceHeight / info.thumbnail.getHeight();
- canvas.translate(border * 0.5f, border * 0.5f);
- canvas.scale(scaleX, scaleY);
- canvas.drawBitmap(info.thumbnail, 0, 0, paint);
- } else {
- // Draw the Loading bitmap placeholder, TODO: Remove when RS handles blending
- final float scaleX = (float) targetWidth / mLoadingBitmap.getWidth();
- final float scaleY = (float) targetHeight / mLoadingBitmap.getHeight();
- canvas.scale(scaleX, scaleY);
- canvas.drawBitmap(mLoadingBitmap, 0, 0, paint);
- }
- canvas.restore();
-
- // Draw overlay
- canvas.save();
- final float scaleOverlayX = (float) targetWidth / mRecentOverlay.getWidth();
- final float scaleOverlayY = (float) targetHeight / mRecentOverlay.getHeight();
- canvas.scale(scaleOverlayX, scaleOverlayY);
- paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD));
- canvas.drawBitmap(mRecentOverlay, 0, 0, paint);
- canvas.restore();
-
- // Draw icon
- if (info.icon != null) {
- canvas.save();
- info.icon.draw(canvas);
- canvas.restore();
- }
-
- return result;
- }
-
- private final IThumbnailReceiver mThumbnailReceiver = new IThumbnailReceiver.Stub() {
-
- public void finished() throws RemoteException {
-
- }
-
- public void newThumbnail(final int id, final Bitmap bitmap, CharSequence description)
- throws RemoteException {
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
- if (DBG) Log.v(TAG, "New thumbnail for id=" + id + ", dimensions=" + w + "x" + h
- + " description '" + description + "'");
- ActivityDescription info = findActivityDescription(id);
- if (info != null) {
- info.thumbnail = bitmap;
- info.description = description;
- final int thumbWidth = bitmap.getWidth();
- final int thumbHeight = bitmap.getHeight();
- if ((mPortraitMode && thumbWidth > thumbHeight)
- || (!mPortraitMode && thumbWidth < thumbHeight)) {
- Matrix matrix = new Matrix();
- matrix.setRotate(90.0f, (float) thumbWidth / 2, (float) thumbHeight / 2);
- info.matrix = matrix;
- } else {
- info.matrix = null;
- }
- // Force Carousel to request new textures for this item.
- mCarouselView.setTextureForItem(info.position, null);
- mCarouselView.setDetailTextureForItem(info.position, 0, 0, 0, 0, null);
- } else {
- if (DBG) Log.v(TAG, "Can't find view for id " + id);
- }
- }
- };
-
- /**
- * We never really finish() RecentApplicationsActivity, since we don't want to
- * get destroyed and pay the start-up cost to restart it.
- */
- @Override
- public void finish() {
- moveTaskToBack(true);
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- mHidden = !mHidden;
- if (mHidden) {
- mHiding = true;
- moveTaskToBack(true);
- } else {
- mHiding = false;
- }
- super.onNewIntent(intent);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- final Resources res = getResources();
- final View decorView = getWindow().getDecorView();
-
- getWindow().getDecorView().setBackgroundColor(0x80000000);
-
- if (mCarouselView == null) {
- long t = System.currentTimeMillis();
- setContentView(R.layout.recent_apps_activity);
- long elapsed = System.currentTimeMillis() - t;
- Log.v(TAG, "Recents layout took " + elapsed + "ms to load");
- mLoadingBitmap = BitmapFactory.decodeResource(res, R.drawable.recent_rez_border);
- mCarouselView = (CarouselView)findViewById(R.id.carousel);
- mHelper = new LocalCarouselViewHelper(this);
- mHelper.setCarouselView(mCarouselView);
-
- mCarouselView.setSlotCount(CARD_SLOTS);
- mCarouselView.setVisibleSlots(VISIBLE_SLOTS);
- mCarouselView.createCards(0);
- mCarouselView.setStartAngle((float) -(2.0f*Math.PI * 5 / CARD_SLOTS));
- mCarouselView.setDefaultBitmap(mLoadingBitmap);
- mCarouselView.setLoadingBitmap(mLoadingBitmap);
- mCarouselView.setRezInCardCount(3.0f);
- mCarouselView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
-
- mNoRecentsView = (View) findViewById(R.id.no_applications_message);
-
- mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
- mPortraitMode = decorView.getHeight() > decorView.getWidth();
-
- // Load detail view which will be used to render text
- View detail = getLayoutInflater().inflate(R.layout.recents_detail_view, null);
- TextView title = (TextView) detail.findViewById(R.id.app_title);
- TextView description = (TextView) detail.findViewById(R.id.app_description);
- mDetailInfo = new DetailInfo(detail, title, description);
-
- refresh();
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- refresh();
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- mPortraitMode = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT;
- if (DBG) Log.v(TAG, "CONFIG CHANGE, mPortraitMode = " + mPortraitMode);
- refresh();
- }
-
- void updateRunningTasks() {
- mRunningTaskList = mActivityManager.getRunningTasks(MAX_TASKS,
- 0, mThumbnailReceiver);
- if (DBG) Log.v(TAG, "Portrait: " + mPortraitMode);
- for (RunningTaskInfo r : mRunningTaskList) {
- if (r.thumbnail != null) {
- int thumbWidth = r.thumbnail.getWidth();
- int thumbHeight = r.thumbnail.getHeight();
- if (DBG) Log.v(TAG, "Got thumbnail " + thumbWidth + "x" + thumbHeight);
- ActivityDescription desc = findActivityDescription(r.id);
- if (desc != null) {
- desc.thumbnail = r.thumbnail;
- desc.description = r.description;
- if ((mPortraitMode && thumbWidth > thumbHeight)
- || (!mPortraitMode && thumbWidth < thumbHeight)) {
- Matrix matrix = new Matrix();
- matrix.setRotate(90.0f, (float) thumbWidth / 2, (float) thumbHeight / 2);
- desc.matrix = matrix;
- }
- } else {
- if (DBG) Log.v(TAG, "Couldn't find ActivityDesc for id=" + r.id);
- }
- } else {
- if (DBG) Log.v(TAG, "*** RUNNING THUMBNAIL WAS NULL ***");
- }
- }
- }
-
- private void updateRecentTasks() {
- final PackageManager pm = getPackageManager();
- final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
-
- final List<ActivityManager.RecentTaskInfo> recentTasks =
- am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
-
- ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
- .resolveActivityInfo(pm, 0);
-
- // IconUtilities iconUtilities = new IconUtilities(this); // FIXME
-
- int numTasks = recentTasks.size();
- mActivityDescriptions.clear();
- for (int i = 0, index = 0; i < numTasks && (index < MAX_TASKS); ++i) {
- final ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(i);
-
- Intent intent = new Intent(recentInfo.baseIntent);
- if (recentInfo.origActivity != null) {
- intent.setComponent(recentInfo.origActivity);
- }
-
- // Skip the current home activity.
- if (homeInfo != null
- && homeInfo.packageName.equals(intent.getComponent().getPackageName())
- && homeInfo.name.equals(intent.getComponent().getClassName())) {
- continue;
- }
-
- intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
- | Intent.FLAG_ACTIVITY_NEW_TASK);
- final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
- if (resolveInfo != null) {
- final ActivityInfo info = resolveInfo.activityInfo;
- final String title = info.loadLabel(pm).toString();
- Drawable icon = info.loadIcon(pm);
-
- int id = recentTasks.get(i).id;
- if (id != -1 && title != null && title.length() > 0 && icon != null) {
- // icon = null; FIXME: iconUtilities.createIconDrawable(icon);
- ActivityDescription item = new ActivityDescription(
- null, icon, title, null, id, index);
- item.intent = intent;
- mActivityDescriptions.add(item);
- if (DBG) Log.v(TAG, "Added item[" + index
- + "], id=" + item.id
- + ", title=" + item.label);
- ++index;
- } else {
- if (DBG) Log.v(TAG, "SKIPPING item " + id);
- }
- }
- }
- }
-
- private final Runnable mRefreshRunnable = new Runnable() {
- public void run() {
- updateRecentTasks();
- updateRunningTasks();
- showCarousel(mActivityDescriptions.size() > 0);
- }
- };
-
- private void showCarousel(boolean show) {
- if (show) {
- mCarouselView.createCards(mActivityDescriptions.size());
- for (int i = 1; i < mActivityDescriptions.size(); i++) {
- // Force Carousel to update textures. Note we don't do this for the first item,
- // since it will be updated when mThumbnailReceiver returns a thumbnail.
- // TODO: only do this for apps that have changed.
- mCarouselView.setTextureForItem(i, null);
- mCarouselView.setDetailTextureForItem(i, 0, 0, 0, 0, null);
- }
- // Make carousel visible
- mNoRecentsView.setVisibility(View.GONE);
- mCarouselView.setVisibility(View.VISIBLE);
- mCarouselView.createCards(mActivityDescriptions.size());
- } else {
- // show "No Recent Tasks"
- mNoRecentsView.setVisibility(View.VISIBLE);
- mCarouselView.setVisibility(View.GONE);
- }
- }
-
- private void refresh() {
- if (!mHiding && mCarouselView != null) {
- // Don't update the view now. Instead, post a request so it happens next time
- // we reach the looper after a delay. This way we can fold multiple refreshes
- // into just the latest.
- mCarouselView.removeCallbacks(mRefreshRunnable);
- mCarouselView.postDelayed(mRefreshRunnable, 50);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsCarouselView.java b/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsCarouselView.java
deleted file mode 100644
index 1afb086..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsCarouselView.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recent.carousel;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-import com.android.ex.carousel.CarouselView;
-import com.android.systemui.R;
-
-public class RecentApplicationsCarouselView extends CarouselView {
-
- public RecentApplicationsCarouselView(Context context) {
- this(context, null);
- }
-
- public RecentApplicationsCarouselView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public Info getRenderScriptInfo() {
- return new Info(R.raw.carousel);
- }
-
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index f81820e..62d7500 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -61,6 +61,7 @@ public class CommandQueue extends IStatusBar.Stub {
private static final int MSG_SET_HARD_KEYBOARD_STATUS = 10 << MSG_SHIFT;
private static final int MSG_USER_ACTIVITY = 11 << MSG_SHIFT;
+ private static final int MSG_TOGGLE_RECENT_APPS = 12 << MSG_SHIFT;
private StatusBarIconList mList;
private Callbacks mCallbacks;
@@ -90,6 +91,7 @@ public class CommandQueue extends IStatusBar.Stub {
public void setImeWindowStatus(IBinder token, int vis, int backDisposition);
public void setHardKeyboardStatus(boolean available, boolean enabled);
public void userActivity();
+ public void toggleRecentApps();
}
public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -196,6 +198,13 @@ public class CommandQueue extends IStatusBar.Stub {
}
}
+ public void toggleRecentApps() {
+ synchronized (mList) {
+ mHandler.removeMessages(MSG_TOGGLE_RECENT_APPS);
+ mHandler.obtainMessage(MSG_TOGGLE_RECENT_APPS, 0, 0, null).sendToTarget();
+ }
+ }
+
private final class H extends Handler {
public void handleMessage(Message msg) {
final int what = msg.what & MSG_MASK;
@@ -265,6 +274,9 @@ public class CommandQueue extends IStatusBar.Stub {
case MSG_USER_ACTIVITY:
mCallbacks.userActivity();
break;
+ case MSG_TOGGLE_RECENT_APPS:
+ mCallbacks.toggleRecentApps();
+ break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
index e567dc7..ca75138 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
@@ -53,6 +53,7 @@ public abstract class StatusBar extends SystemUI implements CommandQueue.Callbac
protected abstract View makeStatusBarView();
protected abstract int getStatusBarGravity();
public abstract int getStatusBarHeight();
+ public abstract void animateCollapse();
private DoNotDisturb mDoNotDisturb;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index cc8358e..0b82123 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -28,10 +28,12 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
+import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.Handler;
@@ -74,6 +76,7 @@ import com.android.internal.statusbar.StatusBarIconList;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.systemui.R;
+import com.android.systemui.recent.RecentsPanelView;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.StatusBar;
import com.android.systemui.statusbar.StatusBarIconView;
@@ -83,6 +86,7 @@ import com.android.systemui.statusbar.policy.DateView;
public class PhoneStatusBar extends StatusBar {
static final String TAG = "PhoneStatusBar";
static final boolean SPEW = false;
+ public static final boolean DEBUG = false;
public static final String ACTION_STATUSBAR_START
= "com.android.internal.policy.statusbar.START";
@@ -94,6 +98,8 @@ public class PhoneStatusBar extends StatusBar {
private static final int MSG_ANIMATE_REVEAL = 1001;
private static final int MSG_SHOW_INTRUDER = 1002;
private static final int MSG_HIDE_INTRUDER = 1003;
+ private static final int MSG_OPEN_RECENTS_PANEL = 1020;
+ private static final int MSG_CLOSE_RECENTS_PANEL = 1021;
// will likely move to a resource or other tunable param at some point
private static final int INTRUDER_ALERT_DECAY_MS = 10000;
@@ -160,6 +166,9 @@ public class PhoneStatusBar extends StatusBar {
private View mTickerView;
private boolean mTicking;
+ // Recent applications
+ private RecentsPanelView mRecentsPanel;
+
// Tracking finger for opening/closing.
int mEdgeBorder; // corresponds to R.dimen.status_bar_edge_ignore
boolean mTracking;
@@ -296,6 +305,9 @@ public class PhoneStatusBar extends StatusBar {
setAreThereNotifications();
mDateView.setVisibility(View.INVISIBLE);
+ // Recents Panel
+ initializeRecentsPanel();
+
// receive broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
@@ -306,6 +318,51 @@ public class PhoneStatusBar extends StatusBar {
return sb;
}
+ protected WindowManager.LayoutParams getRecentsLayoutParams() {
+ boolean translucent = false;
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
+ (translucent ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT));
+ lp.gravity = Gravity.BOTTOM | Gravity.LEFT;
+ lp.setTitle("RecentsPanel");
+ lp.windowAnimations = R.style.Animation_RecentPanel;
+ lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
+ | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
+ return lp;
+ }
+
+ protected void initializeRecentsPanel() {
+ // Recents Panel
+ boolean visible = false;
+ if (mRecentsPanel != null) {
+ visible = mRecentsPanel.getVisibility() == View.VISIBLE;
+ WindowManagerImpl.getDefault().removeView(mRecentsPanel);
+ }
+ mRecentsPanel = (RecentsPanelView) View.inflate(mContext,
+ R.layout.status_bar_recent_panel, null);
+
+ mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL,
+ mRecentsPanel));
+ mRecentsPanel.setVisibility(View.GONE);
+ WindowManager.LayoutParams lp = getRecentsLayoutParams();
+
+ WindowManagerImpl.getDefault().addView(mRecentsPanel, lp);
+ mRecentsPanel.setBar(this);
+ if (visible) {
+ // need to set visibility to View.GONE earlier since that
+ // triggers refreshing application list
+ mRecentsPanel.setVisibility(View.VISIBLE);
+ mRecentsPanel.show(true, false);
+ }
+
+ }
+
protected int getStatusBarGravity() {
return Gravity.TOP | Gravity.FILL_HORIZONTAL;
}
@@ -581,6 +638,12 @@ public class PhoneStatusBar extends StatusBar {
}
}
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ initializeRecentsPanel();
+ }
+
+
View[] makeNotificationView(StatusBarNotification notification, ViewGroup parent) {
Notification n = notification.notification;
RemoteViews remoteViews = n.contentView;
@@ -789,6 +852,21 @@ public class PhoneStatusBar extends StatusBar {
case MSG_HIDE_INTRUDER:
setIntruderAlertVisibility(false);
break;
+ case MSG_OPEN_RECENTS_PANEL:
+ if (DEBUG) Slog.d(TAG, "opening recents panel");
+ if (mRecentsPanel != null) {
+ disable(StatusBarManager.DISABLE_BACK);
+ mRecentsPanel.setVisibility(View.VISIBLE);
+ mRecentsPanel.show(true, true);
+ }
+ break;
+ case MSG_CLOSE_RECENTS_PANEL:
+ if (DEBUG) Slog.d(TAG, "closing recents panel");
+ if (mRecentsPanel != null && mRecentsPanel.isShowing()) {
+ disable(StatusBarManager.DISABLE_NONE);
+ mRecentsPanel.show(false, true);
+ }
+ break;
}
}
}
@@ -835,6 +913,10 @@ public class PhoneStatusBar extends StatusBar {
}
public void animateCollapse() {
+ animateCollapse(false);
+ }
+
+ public void animateCollapse(boolean excludeRecents) {
if (SPEW) {
Slog.d(TAG, "animateCollapse(): mExpanded=" + mExpanded
+ " mExpandedVisible=" + mExpandedVisible
@@ -844,6 +926,11 @@ public class PhoneStatusBar extends StatusBar {
+ " mAnimVel=" + mAnimVel);
}
+ if (!excludeRecents) {
+ mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
+ }
+
if (!mExpandedVisible) {
return;
}
@@ -1557,6 +1644,13 @@ public class PhoneStatusBar extends StatusBar {
} catch (RemoteException ex) { }
}
+ public void toggleRecentApps() {
+ int msg = (mRecentsPanel.getVisibility() == View.GONE)
+ ? MSG_OPEN_RECENTS_PANEL : MSG_CLOSE_RECENTS_PANEL;
+ mHandler.removeMessages(msg);
+ mHandler.sendEmptyMessage(msg);
+ }
+
/**
* The LEDs are turned o)ff when the notification panel is shown, even just a little bit.
* This was added last-minute and is inconsistent with the way the rest of the notifications
@@ -1625,7 +1719,14 @@ public class PhoneStatusBar extends StatusBar {
String action = intent.getAction();
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
|| Intent.ACTION_SCREEN_OFF.equals(action)) {
- animateCollapse();
+ boolean excludeRecents = false;
+ if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
+ String reason = intent.getExtras().getString("reason");
+ if (reason != null) {
+ excludeRecents = reason.equals("recentapps");
+ }
+ }
+ animateCollapse(excludeRecents);
}
else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
repositionNavigationBar();
@@ -1690,5 +1791,27 @@ public class PhoneStatusBar extends StatusBar {
vibrate();
}
};
+
+ public class TouchOutsideListener implements View.OnTouchListener {
+ private int mMsg;
+ private RecentsPanelView mPanel;
+
+ public TouchOutsideListener(int msg, RecentsPanelView panel) {
+ mMsg = msg;
+ mPanel = panel;
+ }
+
+ public boolean onTouch(View v, MotionEvent ev) {
+ final int action = ev.getAction();
+ if (action == MotionEvent.ACTION_OUTSIDE
+ || (action == MotionEvent.ACTION_DOWN
+ && !mPanel.isInContentArea((int)ev.getX(), (int)ev.getY()))) {
+ mHandler.removeMessages(mMsg);
+ mHandler.sendEmptyMessage(mMsg);
+ return true;
+ }
+ return false;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
index 24eee27..b5ea7b2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
@@ -20,6 +20,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
+import android.animation.TimeAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Resources;
@@ -30,6 +31,8 @@ import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Slog;
import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
@@ -45,10 +48,15 @@ import com.android.systemui.R;
public class NotificationRowLayout extends ViewGroup {
private static final String TAG = "NotificationRowLayout";
private static final boolean DEBUG = false;
+ private static final boolean SLOW_ANIMATIONS = false; // DEBUG;
private static final boolean ANIMATE_LAYOUT = true;
- private static final int ANIM_LEN = DEBUG ? 5000 : 250;
+ private static final int APPEAR_ANIM_LEN = SLOW_ANIMATIONS ? 5000 : 250;
+ private static final int DISAPPEAR_ANIM_LEN = APPEAR_ANIM_LEN;
+ private static final int SNAP_ANIM_LEN = SLOW_ANIMATIONS ? 1000 : 250;
+
+ private static final float SWIPE_ESCAPE_VELOCITY = 1500f;
Rect mTmpRect = new Rect();
int mNumRows = 0;
@@ -58,6 +66,11 @@ public class NotificationRowLayout extends ViewGroup {
HashSet<View> mAppearingViews = new HashSet<View>();
HashSet<View> mDisappearingViews = new HashSet<View>();
+ VelocityTracker mVT;
+ float mInitialTouchX, mInitialTouchY;
+ View mSlidingChild = null;
+ float mLiftoffVelocity;
+
public NotificationRowLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@@ -65,6 +78,8 @@ public class NotificationRowLayout extends ViewGroup {
public NotificationRowLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+ mVT = VelocityTracker.obtain();
+
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NotificationRowLayout,
defStyle, 0);
mRowHeight = a.getDimensionPixelSize(R.styleable.NotificationRowLayout_rowHeight, 0);
@@ -89,6 +104,92 @@ public class NotificationRowLayout extends ViewGroup {
}
+ // Swipey code
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ final int action = ev.getAction();
+// if (DEBUG) Slog.d(TAG, "intercepting touch event: " + ev);
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ mVT.clear();
+ mVT.addMovement(ev);
+ mInitialTouchX = ev.getX();
+ mInitialTouchY = ev.getY();
+ mSlidingChild = null;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ mVT.addMovement(ev);
+ if (mSlidingChild == null) {
+ if (Math.abs(ev.getX() - mInitialTouchX) > 4) { // slide slop
+
+ // find the view under the pointer, accounting for GONE views
+ final int count = getChildCount();
+ int y = 0;
+ int childIdx = 0;
+ for (; childIdx < count; childIdx++) {
+ mSlidingChild = getChildAt(childIdx);
+ if (mSlidingChild.getVisibility() == GONE) {
+ continue;
+ }
+ y += mRowHeight;
+ if (mInitialTouchY < y) break;
+ }
+
+ mInitialTouchX -= mSlidingChild.getTranslationX();
+ mSlidingChild.animate().cancel();
+
+ if (DEBUG) {
+ Slog.d(TAG, String.format(
+ "now sliding child %d: %s (touchY=%.1f, rowHeight=%d, count=%d)",
+ childIdx, mSlidingChild, mInitialTouchY, mRowHeight, count));
+ }
+ }
+ }
+ break;
+ }
+ return mSlidingChild != null;
+ }
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ final int action = ev.getAction();
+// if (DEBUG) Slog.d(TAG, "touch event: " + ev + " sliding: " + mSlidingChild);
+ if (mSlidingChild != null) {
+ switch (action) {
+ case MotionEvent.ACTION_OUTSIDE:
+ case MotionEvent.ACTION_MOVE:
+ mVT.addMovement(ev);
+
+ mSlidingChild.setTranslationX(ev.getX() - mInitialTouchX);
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ mVT.addMovement(ev);
+ mVT.computeCurrentVelocity(1000 /* px/sec */);
+ if (DEBUG) Slog.d(TAG, "exit velocity: " + mVT.getXVelocity());
+ boolean restore = true;
+ mLiftoffVelocity = mVT.getXVelocity();
+ if (Math.abs(mLiftoffVelocity) > SWIPE_ESCAPE_VELOCITY) {
+ // flingadingy
+
+ View veto = mSlidingChild.findViewById(R.id.veto);
+ if (veto != null && veto.getVisibility() == View.VISIBLE) {
+ veto.performClick();
+ restore = false;
+ }
+ }
+ if (restore) {
+ // snappity
+ mSlidingChild.animate().translationX(0)
+ .setDuration(SNAP_ANIM_LEN)
+ .start();
+ }
+ break;
+ }
+ return true;
+ }
+ return false;
+ }
+
//**
@Override
public void addView(View child, int index, LayoutParams params) {
@@ -105,7 +206,7 @@ public class NotificationRowLayout extends ViewGroup {
ObjectAnimator.ofFloat(child, "alpha", 0f, 1f)
// ,ObjectAnimator.ofFloat(child, "scaleY", 0f, 1f)
);
- a.setDuration(ANIM_LEN);
+ a.setDuration(APPEAR_ANIM_LEN);
a.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -127,21 +228,36 @@ public class NotificationRowLayout extends ViewGroup {
mDisappearingViews.add(child);
child.setPivotY(0);
- AnimatorSet a = new AnimatorSet();
- a.playTogether(
- ObjectAnimator.ofFloat(child, "alpha", 0f)
-// ,ObjectAnimator.ofFloat(child, "scaleY", 0f)
- ,ObjectAnimator.ofFloat(child, "translationX", 300f)
- );
- a.setDuration(ANIM_LEN);
- a.addListener(new AnimatorListenerAdapter() {
+
+ final float velocity = (mSlidingChild == child)
+ ? mLiftoffVelocity : SWIPE_ESCAPE_VELOCITY;
+ final TimeAnimator zoom = new TimeAnimator();
+ zoom.setTimeListener(new TimeAnimator.TimeListener() {
+ @Override
+ public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
+ childF.setTranslationX(childF.getTranslationX() + deltaTime / 1000f * velocity);
+ }
+ });
+
+ final ObjectAnimator alphaFade = ObjectAnimator.ofFloat(child, "alpha", 0f);
+ alphaFade.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
+ zoom.cancel(); // it won't end on its own
+ if (DEBUG) Slog.d(TAG, "actually removing child: " + childF);
NotificationRowLayout.super.removeView(childF);
childF.setAlpha(1f);
mDisappearingViews.remove(childF);
}
});
+
+ AnimatorSet a = new AnimatorSet();
+ a.playTogether(alphaFade, zoom);
+
+// ,ObjectAnimator.ofFloat(child, "scaleY", 0f)
+// ,ObjectAnimator.ofFloat(child, "translationX", child.getTranslationX() + 300f)
+
+ a.setDuration(DISAPPEAR_ANIM_LEN);
a.start();
requestLayout(); // start the container animation
} else {
@@ -160,8 +276,8 @@ public class NotificationRowLayout extends ViewGroup {
public void onDraw(android.graphics.Canvas c) {
super.onDraw(c);
if (DEBUG) {
- Slog.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: "
- + getMeasuredHeight() + "px");
+ //Slog.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: "
+ // + getMeasuredHeight() + "px");
c.save();
c.clipRect(6, 6, c.getWidth() - 6, getMeasuredHeight() - 6,
android.graphics.Region.Op.DIFFERENCE);
@@ -199,7 +315,7 @@ public class NotificationRowLayout extends ViewGroup {
if (ANIMATE_LAYOUT && isShown()) {
ObjectAnimator.ofInt(this, "forcedHeight", computedHeight)
- .setDuration(ANIM_LEN)
+ .setDuration(APPEAR_ANIM_LEN)
.start();
} else {
setForcedHeight(computedHeight);
@@ -230,7 +346,7 @@ public class NotificationRowLayout extends ViewGroup {
final int width = right - left;
final int height = bottom - top;
- if (DEBUG) Slog.d(TAG, "onLayout: height=" + height);
+ //if (DEBUG) Slog.d(TAG, "onLayout: height=" + height);
final int count = getChildCount();
int y = 0;
@@ -252,7 +368,7 @@ public class NotificationRowLayout extends ViewGroup {
}
public void setForcedHeight(int h) {
- if (DEBUG) Slog.d(TAG, "forcedHeight: " + h);
+ //if (DEBUG) Slog.d(TAG, "forcedHeight: " + h);
if (h != mHeight) {
mHeight = h;
requestLayout();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/CompatModePanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/CompatModePanel.java
index 5a82d1b..c62c4ad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/CompatModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/CompatModePanel.java
@@ -107,9 +107,14 @@ public class CompatModePanel extends FrameLayout implements StatusBarPanel,
private void refresh() {
int mode = mAM.getFrontActivityScreenCompatMode();
+ if (mode == ActivityManager.COMPAT_MODE_ALWAYS
+ || mode == ActivityManager.COMPAT_MODE_NEVER) {
+ // No longer have something to switch.
+ closePanel();
+ return;
+ }
final boolean on = (mode == ActivityManager.COMPAT_MODE_ENABLED);
mOnButton.setChecked(on);
mOffButton.setChecked(!on);
}
-
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index a7af30d..93f7af3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -76,12 +76,12 @@ import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.Prefs;
import com.android.systemui.recent.RecentsPanelView;
-import com.android.systemui.recent.carousel.RecentApplicationsActivity;
public class TabletStatusBar extends StatusBar implements
HeightReceiver.OnBarHeightChangedListener,
InputMethodsPanel.OnHardKeyboardEnabledChangeListener {
public static final boolean DEBUG = false;
+ public static final boolean DEBUG_COMPAT_HELP = false;
public static final String TAG = "TabletStatusBar";
@@ -166,6 +166,8 @@ public class TabletStatusBar extends StatusBar implements
View mFakeSpaceBar;
KeyEvent mSpaceBarKeyEvent = null;
+ View mCompatibilityHelpDialog = null;
+
// for disabling the status bar
int mDisabled = 0;
@@ -1010,20 +1012,31 @@ public class TabletStatusBar extends StatusBar implements
mCompatModeButton.refresh();
if (mCompatModeButton.getVisibility() == View.VISIBLE) {
- if (! Prefs.read(mContext).getBoolean(Prefs.SHOWN_COMPAT_MODE_HELP, false)) {
+ if (DEBUG_COMPAT_HELP
+ || ! Prefs.read(mContext).getBoolean(Prefs.SHOWN_COMPAT_MODE_HELP, false)) {
showCompatibilityHelp();
}
+ } else {
+ hideCompatibilityHelp();
+ mCompatModePanel.closePanel();
}
}
private void showCompatibilityHelp() {
- final View dlg = View.inflate(mContext, R.layout.compat_mode_help, null);
- View button = dlg.findViewById(R.id.button);
+ if (mCompatibilityHelpDialog != null) {
+ return;
+ }
+
+ mCompatibilityHelpDialog = View.inflate(mContext, R.layout.compat_mode_help, null);
+ View button = mCompatibilityHelpDialog.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- WindowManagerImpl.getDefault().removeView(dlg);
+ hideCompatibilityHelp();
+ SharedPreferences.Editor editor = Prefs.edit(mContext);
+ editor.putBoolean(Prefs.SHOWN_COMPAT_MODE_HELP, true);
+ editor.apply();
}
});
@@ -1040,13 +1053,16 @@ public class TabletStatusBar extends StatusBar implements
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
lp.windowAnimations = com.android.internal.R.style.Animation_ZoomButtons; // simple fade
- WindowManagerImpl.getDefault().addView(dlg, lp);
-
- SharedPreferences.Editor editor = Prefs.edit(mContext);
- editor.putBoolean(Prefs.SHOWN_COMPAT_MODE_HELP, true);
- editor.apply();
+ WindowManagerImpl.getDefault().addView(mCompatibilityHelpDialog, lp);
}
+ private void hideCompatibilityHelp() {
+ if (mCompatibilityHelpDialog != null) {
+ WindowManagerImpl.getDefault().removeView(mCompatibilityHelpDialog);
+ mCompatibilityHelpDialog = null;
+ }
+ }
+
public void setImeWindowStatus(IBinder token, int vis, int backDisposition) {
mInputMethodSwitchButton.setImeWindowStatus(token,
(vis & InputMethodService.IME_ACTIVE) != 0);
@@ -1156,20 +1172,12 @@ public class TabletStatusBar extends StatusBar implements
public void onClickRecentButton() {
if (DEBUG) Slog.d(TAG, "clicked recent apps; disabled=" + mDisabled);
- if (mRecentsPanel == null) {
- Intent intent = new Intent();
- intent.setClass(mContext, RecentApplicationsActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- mContext.startActivity(intent);
- } else {
- if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) {
- int msg = (mRecentsPanel.getVisibility() == View.GONE)
- ? MSG_OPEN_RECENTS_PANEL
- : MSG_CLOSE_RECENTS_PANEL;
- mHandler.removeMessages(msg);
- mHandler.sendEmptyMessage(msg);
- }
+ if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) {
+ int msg = (mRecentsPanel.getVisibility() == View.GONE)
+ ? MSG_OPEN_RECENTS_PANEL
+ : MSG_CLOSE_RECENTS_PANEL;
+ mHandler.removeMessages(msg);
+ mHandler.sendEmptyMessage(msg);
}
}
@@ -1681,6 +1689,13 @@ public class TabletStatusBar extends StatusBar implements
public void userActivity() {
}
+ public void toggleRecentApps() {
+ int msg = (mRecentsPanel.getVisibility() == View.GONE)
+ ? MSG_OPEN_RECENTS_PANEL : MSG_CLOSE_RECENTS_PANEL;
+ mHandler.removeMessages(msg);
+ mHandler.sendEmptyMessage(msg);
+ }
+
public class TouchOutsideListener implements View.OnTouchListener {
private int mMsg;
private StatusBarPanel mPanel;
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java
index 8fa6c7a..c54e719 100644
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java
+++ b/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java
@@ -23,7 +23,8 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
+import android.net.IConnectivityManager;
+import android.os.ServiceManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
@@ -37,7 +38,7 @@ public class ConfirmDialog extends Activity implements CompoundButton.OnCheckedC
private String mPackageName;
- private ConnectivityManager mService;
+ private IConnectivityManager mService;
private AlertDialog mDialog;
private Button mButton;
@@ -47,7 +48,9 @@ public class ConfirmDialog extends Activity implements CompoundButton.OnCheckedC
super.onResume();
try {
mPackageName = getCallingPackage();
- mService = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+
+ mService = IConnectivityManager.Stub.asInterface(
+ ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
if (mPackageName.equals(mService.prepareVpn(null))) {
setResult(RESULT_OK);
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
index 853e625..f1da49d 100644
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
+++ b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
@@ -23,9 +23,10 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
+import android.net.IConnectivityManager;
import android.os.Handler;
import android.os.Message;
+import android.os.ServiceManager;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
@@ -45,7 +46,7 @@ public class ManageDialog extends Activity implements
private String mInterfaceName;
private long mStartTime;
- private ConnectivityManager mService;
+ private IConnectivityManager mService;
private AlertDialog mDialog;
private TextView mDuration;
@@ -64,7 +65,8 @@ public class ManageDialog extends Activity implements
mInterfaceName = intent.getStringExtra("interfaceName");
mStartTime = intent.getLongExtra("startTime", 0);
- mService = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+ mService = IConnectivityManager.Stub.asInterface(
+ ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
PackageManager pm = getPackageManager();
ApplicationInfo app = pm.getApplicationInfo(mPackageName, 0);
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 5728989..b52e7e1 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -149,10 +149,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final int LONG_PRESS_POWER_NOTHING = 0;
static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
static final int LONG_PRESS_POWER_SHUT_OFF = 2;
-
+
+ // These need to match the documentation/constant in
+ // core/res/res/values/config.xml
static final int LONG_PRESS_HOME_NOTHING = 0;
static final int LONG_PRESS_HOME_RECENT_DIALOG = 1;
- static final int LONG_PRESS_HOME_RECENT_ACTIVITY = 2;
+ static final int LONG_PRESS_HOME_RECENT_SYSTEM_UI = 2;
// wallpaper is at the bottom, though the window manager may move it.
static final int WALLPAPER_LAYER = 2;
@@ -623,7 +625,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mLongPressOnHomeBehavior
= mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior);
if (mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||
- mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_ACTIVITY) {
+ mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;
}
}
@@ -639,17 +641,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {
showOrHideRecentAppsDialog(0, true /*dismissIfShown*/);
- } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_ACTIVITY) {
+ } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
try {
- Intent intent = new Intent();
- intent.setClassName("com.android.systemui",
- "com.android.systemui.recent.RecentApplicationsActivity");
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- mContext.startActivity(intent);
- return;
- } catch (ActivityNotFoundException e) {
- Log.e(TAG, "Failed to launch RecentAppsIntent", e);
+ mStatusBarService.toggleRecentApps();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "RemoteException when showing recent apps", e);
}
}
}
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 1e8c30b..a011ae2 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -147,6 +147,14 @@ sp<ICamera> CameraService::connect(
return NULL;
}
+ char value[PROPERTY_VALUE_MAX];
+ property_get("sys.secpolicy.camera.disabled", value, "0");
+ if (strcmp(value, "1") == 0) {
+ // Camera is disabled by DevicePolicyManager.
+ LOGI("Camera is disabled. connect X (pid %d) rejected", callingPid);
+ return NULL;
+ }
+
Mutex::Autolock lock(mServiceLock);
if (mClient[cameraId] != 0) {
client = mClient[cameraId].promote();
diff --git a/services/java/com/android/server/AppWidgetService.java b/services/java/com/android/server/AppWidgetService.java
index fd502d8..158c778 100644
--- a/services/java/com/android/server/AppWidgetService.java
+++ b/services/java/com/android/server/AppWidgetService.java
@@ -395,41 +395,47 @@ class AppWidgetService extends IAppWidgetService.Stub
public void bindAppWidgetId(int appWidgetId, ComponentName provider) {
mContext.enforceCallingPermission(android.Manifest.permission.BIND_APPWIDGET,
"bindGagetId appWidgetId=" + appWidgetId + " provider=" + provider);
- synchronized (mAppWidgetIds) {
- AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
- if (id == null) {
- throw new IllegalArgumentException("bad appWidgetId");
- }
- if (id.provider != null) {
- throw new IllegalArgumentException("appWidgetId " + appWidgetId + " already bound to "
- + id.provider.info.provider);
- }
- Provider p = lookupProviderLocked(provider);
- if (p == null) {
- throw new IllegalArgumentException("not a appwidget provider: " + provider);
- }
- if (p.zombie) {
- throw new IllegalArgumentException("can't bind to a 3rd party provider in"
- + " safe mode: " + provider);
- }
-
- id.provider = p;
- p.instances.add(id);
- int instancesSize = p.instances.size();
- if (instancesSize == 1) {
- // tell the provider that it's ready
- sendEnableIntentLocked(p);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mAppWidgetIds) {
+ AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
+ if (id == null) {
+ throw new IllegalArgumentException("bad appWidgetId");
+ }
+ if (id.provider != null) {
+ throw new IllegalArgumentException("appWidgetId " + appWidgetId + " already bound to "
+ + id.provider.info.provider);
+ }
+ Provider p = lookupProviderLocked(provider);
+ if (p == null) {
+ throw new IllegalArgumentException("not a appwidget provider: " + provider);
+ }
+ if (p.zombie) {
+ throw new IllegalArgumentException("can't bind to a 3rd party provider in"
+ + " safe mode: " + provider);
+ }
+
+ id.provider = p;
+ p.instances.add(id);
+ int instancesSize = p.instances.size();
+ if (instancesSize == 1) {
+ // tell the provider that it's ready
+ sendEnableIntentLocked(p);
+ }
+
+ // send an update now -- We need this update now, and just for this appWidgetId.
+ // It's less critical when the next one happens, so when we schdule the next one,
+ // we add updatePeriodMillis to its start time. That time will have some slop,
+ // but that's okay.
+ sendUpdateIntentLocked(p, new int[] { appWidgetId });
+
+ // schedule the future updates
+ registerForBroadcastsLocked(p, getAppWidgetIds(p));
+ saveStateLocked();
}
-
- // send an update now -- We need this update now, and just for this appWidgetId.
- // It's less critical when the next one happens, so when we schdule the next one,
- // we add updatePeriodMillis to its start time. That time will have some slop,
- // but that's okay.
- sendUpdateIntentLocked(p, new int[] { appWidgetId });
-
- // schedule the future updates
- registerForBroadcastsLocked(p, getAppWidgetIds(p));
- saveStateLocked();
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}
diff --git a/services/java/com/android/server/StatusBarManagerService.java b/services/java/com/android/server/StatusBarManagerService.java
index b1bce50..286a937 100644
--- a/services/java/com/android/server/StatusBarManagerService.java
+++ b/services/java/com/android/server/StatusBarManagerService.java
@@ -345,6 +345,15 @@ public class StatusBarManagerService extends IStatusBarService.Stub
});
}
+ @Override
+ public void toggleRecentApps() {
+ if (mBar != null) {
+ try {
+ mBar.toggleRecentApps();
+ } catch (RemoteException ex) {}
+ }
+ }
+
private void enforceStatusBar() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR,
"StatusBarManagerService");
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index ab85b14..941ab80 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -160,15 +160,6 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
return descriptor;
}
- public synchronized boolean onInterfaceRemoved(String name) {
- if (name.equals(mInterfaceName) && nativeCheck(name) == 0) {
- hideNotification();
- mInterfaceName = null;
- return true;
- }
- return false;
- }
-
// INetworkManagementEventObserver.Stub
public void interfaceLinkStatusChanged(String name, boolean up) {
}
@@ -186,7 +177,7 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
}
}
- private void showNotification(PackageManager pm, ApplicationInfo app, String session) {
+ private void showNotification(PackageManager pm, ApplicationInfo app, String sessionName) {
NotificationManager nm = (NotificationManager)
mContext.getSystemService(Context.NOTIFICATION_SERVICE);
@@ -207,11 +198,6 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
// Load the label.
String label = app.loadLabel(pm).toString();
- // If session is null, use the application name instead.
- if (session == null) {
- session = label;
- }
-
// Build the intent.
// TODO: move these into VpnBuilder.
Intent intent = new Intent();
@@ -219,23 +205,24 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
"com.android.vpndialogs.ManageDialog");
intent.putExtra("packageName", mPackageName);
intent.putExtra("interfaceName", mInterfaceName);
- intent.putExtra("session", session);
+ intent.putExtra("session", sessionName);
intent.putExtra("startTime", android.os.SystemClock.elapsedRealtime());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
// Build the notification.
+ String text = (sessionName == null) ? mContext.getString(R.string.vpn_text) :
+ mContext.getString(R.string.vpn_text_long, sessionName);
long identity = Binder.clearCallingIdentity();
Notification notification = new Notification.Builder(mContext)
.setSmallIcon(R.drawable.vpn_connected)
.setLargeIcon(bitmap)
.setTicker(mContext.getString(R.string.vpn_ticker, label))
.setContentTitle(mContext.getString(R.string.vpn_title, label))
- .setContentText(mContext.getString(R.string.vpn_text, session))
+ .setContentText(text)
.setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0))
.setDefaults(Notification.DEFAULT_ALL)
.setOngoing(true)
.getNotification();
-
nm.notify(R.drawable.vpn_connected, notification);
Binder.restoreCallingIdentity(identity);
}
diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java
index 2164334..dac0044 100644
--- a/services/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -25,6 +25,9 @@ import static android.Manifest.permission.READ_PHONE_STATE;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.NetworkPolicy.LIMIT_DISABLED;
import static android.net.NetworkPolicy.WARNING_DISABLED;
+import static android.net.NetworkPolicyManager.ACTION_DATA_USAGE_LIMIT;
+import static android.net.NetworkPolicyManager.ACTION_DATA_USAGE_WARNING;
+import static android.net.NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE;
import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_PAID_BACKGROUND;
import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
@@ -138,11 +141,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
private static final String ATTR_UID = "uid";
private static final String ATTR_POLICY = "policy";
- public static final String ACTION_DATA_USAGE_WARNING =
- "android.intent.action.DATA_USAGE_WARNING";
- public static final String ACTION_DATA_USAGE_LIMIT =
- "android.intent.action.DATA_USAGE_LIMIT";
-
private static final long TIME_CACHE_MAX_AGE = DAY_IN_MILLIS;
private final Context mContext;
@@ -402,9 +400,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
builder.setTicker(title);
builder.setContentTitle(title);
builder.setContentText(body);
- builder.setContentIntent(PendingIntent.getActivity(mContext, 0,
- new Intent(ACTION_DATA_USAGE_WARNING),
- PendingIntent.FLAG_UPDATE_CURRENT));
+
+ final Intent intent = new Intent(ACTION_DATA_USAGE_WARNING);
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.putExtra(EXTRA_NETWORK_TEMPLATE, policy.networkTemplate);
+ builder.setContentIntent(PendingIntent.getActivity(
+ mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
break;
}
case TYPE_LIMIT: {
@@ -426,9 +427,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
builder.setTicker(title);
builder.setContentTitle(title);
builder.setContentText(body);
- builder.setContentIntent(PendingIntent.getActivity(mContext, 0,
- new Intent(ACTION_DATA_USAGE_LIMIT),
- PendingIntent.FLAG_UPDATE_CURRENT));
+
+ final Intent intent = new Intent(ACTION_DATA_USAGE_LIMIT);
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
+ intent.putExtra(EXTRA_NETWORK_TEMPLATE, policy.networkTemplate);
+ builder.setContentIntent(PendingIntent.getActivity(
+ mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
break;
}
}
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 476aded..edccf6c 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -25,13 +25,16 @@ import static android.net.NetworkPolicyManager.RULE_REJECT_PAID;
import static android.net.NetworkPolicyManager.computeLastCycleBoundary;
import static android.net.NetworkStats.UID_ALL;
import static android.net.TrafficStats.TEMPLATE_WIFI;
+import static org.easymock.EasyMock.anyInt;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
import android.app.IActivityManager;
+import android.app.INotificationManager;
import android.app.IProcessObserver;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -81,14 +84,15 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
private INetworkPolicyListener mPolicyListener;
private TrustedTime mTime;
private IConnectivityManager mConnManager;
+ private INotificationManager mNotifManager;
private NetworkPolicyManagerService mService;
private IProcessObserver mProcessObserver;
private Binder mStubBinder = new Binder();
- private static final int UID_A = 800;
- private static final int UID_B = 801;
+ private static final int UID_A = android.os.Process.FIRST_APPLICATION_UID + 800;
+ private static final int UID_B = android.os.Process.FIRST_APPLICATION_UID + 801;
private static final int PID_1 = 400;
private static final int PID_2 = 401;
@@ -119,10 +123,12 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
mPolicyListener = createMock(INetworkPolicyListener.class);
mTime = createMock(TrustedTime.class);
mConnManager = createMock(IConnectivityManager.class);
+ mNotifManager = createMock(INotificationManager.class);
mService = new NetworkPolicyManagerService(
mServiceContext, mActivityManager, mPowerManager, mStatsService, mTime, mPolicyDir);
mService.bindConnectivityManager(mConnManager);
+ mService.bindNotificationManager(mNotifManager);
// RemoteCallbackList needs a binder to use as key
expect(mPolicyListener.asBinder()).andReturn(mStubBinder).atLeastOnce();
@@ -137,6 +143,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
// expect to answer screen status during systemReady()
expect(mPowerManager.isScreenOn()).andReturn(true).atLeastOnce();
+ expectTime(System.currentTimeMillis());
replay();
mService.systemReady();
@@ -365,6 +372,8 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
// expect that quota remaining should be 1536 bytes
// TODO: write up NetworkManagementService mock
+ expectClearNotifications();
+
replay();
setNetworkPolicies(new NetworkPolicy(TEMPLATE_WIFI, null, CYCLE_DAY, 1024L, 2048L));
verifyAndReset();
@@ -388,7 +397,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
return new NetworkState(info, prop, null);
}
- public void expectTime(long currentTime) throws Exception {
+ private void expectTime(long currentTime) throws Exception {
expect(mTime.forceRefresh()).andReturn(false).anyTimes();
expect(mTime.hasCache()).andReturn(true).anyTimes();
expect(mTime.currentTimeMillis()).andReturn(currentTime).anyTimes();
@@ -396,6 +405,11 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes();
}
+ private void expectClearNotifications() throws Exception {
+ mNotifManager.cancelNotificationWithTag(isA(String.class), isA(String.class), anyInt());
+ expectLastCall().anyTimes();
+ }
+
private void expectRulesChanged(int uid, int policy) throws Exception {
mPolicyListener.onRulesChanged(eq(uid), eq(policy));
expectLastCall().atLeastOnce();
@@ -403,13 +417,13 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
private void replay() {
EasyMock.replay(mActivityManager, mPowerManager, mStatsService, mPolicyListener, mTime,
- mConnManager);
+ mConnManager, mNotifManager);
}
private void verifyAndReset() {
EasyMock.verify(mActivityManager, mPowerManager, mStatsService, mPolicyListener, mTime,
- mConnManager);
+ mConnManager, mNotifManager);
EasyMock.reset(mActivityManager, mPowerManager, mStatsService, mPolicyListener, mTime,
- mConnManager);
+ mConnManager, mNotifManager);
}
}
diff --git a/telephony/java/com/android/internal/telephony/DataCallState.java b/telephony/java/com/android/internal/telephony/DataCallState.java
index 1d67d45..f5651e0 100644
--- a/telephony/java/com/android/internal/telephony/DataCallState.java
+++ b/telephony/java/com/android/internal/telephony/DataCallState.java
@@ -202,7 +202,7 @@ public class DataCallState {
result = SetupResult.SUCCESS;
} catch (UnknownHostException e) {
- Log.d(LOG_TAG, "onSetupCompleted: UnknownHostException " + e);
+ Log.d(LOG_TAG, "setLinkProperties: UnknownHostException " + e);
e.printStackTrace();
result = SetupResult.ERR_UnacceptableParameter;
}
@@ -216,8 +216,10 @@ public class DataCallState {
// An error occurred so clear properties
if (result != SetupResult.SUCCESS) {
- if(DBG) Log.d(LOG_TAG,
- "onSetupConnectionCompleted with an error, clearing LinkProperties");
+ if(DBG) {
+ Log.d(LOG_TAG, "setLinkProperties: error clearing LinkProperties " +
+ "status=" + status + " result=" + result);
+ }
linkProperties.clear();
}
diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java
index c21a96a..5c030fd 100644
--- a/telephony/java/com/android/internal/telephony/DataConnection.java
+++ b/telephony/java/com/android/internal/telephony/DataConnection.java
@@ -228,7 +228,6 @@ public abstract class DataConnection extends StateMachine {
mId = id;
mRetryMgr = rm;
this.cid = -1;
- clearSettings();
setDbg(false);
addState(mDefaultState);
@@ -313,7 +312,6 @@ public abstract class DataConnection extends StateMachine {
AsyncResult.forMessage(msg);
msg.sendToTarget();
}
- clearSettings();
if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp);
}
@@ -632,7 +630,6 @@ public abstract class DataConnection extends StateMachine {
}
case DataConnectionAc.REQ_RESET:
if (VDBG) log("DcDefaultState: msg.what=REQ_RESET");
- clearSettings();
mAc.replyToMessage(msg, DataConnectionAc.RSP_RESET);
transitionTo(mInactiveState);
break;
@@ -718,6 +715,7 @@ public abstract class DataConnection extends StateMachine {
if (VDBG) log("DcInactiveState: enter notifyDisconnectCompleted");
notifyDisconnectCompleted(mDisconnectParams);
}
+ clearSettings();
}
@Override
diff --git a/telephony/java/com/android/internal/telephony/WapPushOverSms.java b/telephony/java/com/android/internal/telephony/WapPushOverSms.java
index e2779dc..e2779dc 100644..100755
--- a/telephony/java/com/android/internal/telephony/WapPushOverSms.java
+++ b/telephony/java/com/android/internal/telephony/WapPushOverSms.java
diff --git a/telephony/java/com/android/internal/telephony/WspTypeDecoder.java b/telephony/java/com/android/internal/telephony/WspTypeDecoder.java
index c8dd718..73260fb 100644..100755
--- a/telephony/java/com/android/internal/telephony/WspTypeDecoder.java
+++ b/telephony/java/com/android/internal/telephony/WspTypeDecoder.java
@@ -194,6 +194,7 @@ public class WspTypeDecoder {
public static final String CONTENT_TYPE_B_PUSH_CO = "application/vnd.wap.coc";
public static final String CONTENT_TYPE_B_MMS = "application/vnd.wap.mms-message";
+ public static final String CONTENT_TYPE_B_PUSH_SYNCML_NOTI = "application/vnd.syncml.notification";
byte[] wspData;
int dataLength;
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
index 29349db..07b0f4f 100644..100755
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
@@ -41,6 +41,7 @@ import com.android.internal.telephony.SmsHeader;
import com.android.internal.telephony.SmsMessageBase;
import com.android.internal.telephony.SmsMessageBase.TextEncodingDetails;
import com.android.internal.telephony.TelephonyProperties;
+import com.android.internal.telephony.WspTypeDecoder;
import com.android.internal.telephony.cdma.sms.SmsEnvelope;
import com.android.internal.telephony.cdma.sms.UserData;
import com.android.internal.util.HexDump;
@@ -50,6 +51,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import android.content.res.Resources;
+
final class CdmaSMSDispatcher extends SMSDispatcher {
private static final String TAG = "CDMA";
@@ -57,6 +60,9 @@ final class CdmaSMSDispatcher extends SMSDispatcher {
private byte[] mLastDispatchedSmsFingerprint;
private byte[] mLastAcknowledgedSmsFingerprint;
+ private boolean mCheckForDuplicatePortsInOmadmWapPush = Resources.getSystem().getBoolean(
+ com.android.internal.R.bool.config_duplicate_port_omadm_wappush);
+
CdmaSMSDispatcher(CDMAPhone phone) {
super(phone);
}
@@ -253,6 +259,13 @@ final class CdmaSMSDispatcher extends SMSDispatcher {
sourcePort |= 0xFF & pdu[index++];
destinationPort = (0xFF & pdu[index++]) << 8;
destinationPort |= 0xFF & pdu[index++];
+ // Some carriers incorrectly send duplicate port fields in omadm wap pushes.
+ // If configured, check for that here
+ if (mCheckForDuplicatePortsInOmadmWapPush) {
+ if (checkDuplicatePortOmadmWappush(pdu,index)) {
+ index = index + 4; // skip duplicate port fields
+ }
+ }
}
// Lookup all other related parts
@@ -502,4 +515,42 @@ final class CdmaSMSDispatcher extends SMSDispatcher {
return CommandsInterface.CDMA_SMS_FAIL_CAUSE_ENCODING_PROBLEM;
}
}
+
+ /**
+ * Optional check to see if the received WapPush is an OMADM notification with erroneous
+ * extra port fields.
+ * - Some carriers make this mistake.
+ * ex: MSGTYPE-TotalSegments-CurrentSegment
+ * -SourcePortDestPort-SourcePortDestPort-OMADM PDU
+ * @param origPdu The WAP-WDP PDU segment
+ * @param index Current Index while parsing the PDU.
+ * @return True if OrigPdu is OmaDM Push Message which has duplicate ports.
+ * False if OrigPdu is NOT OmaDM Push Message which has duplicate ports.
+ */
+ private boolean checkDuplicatePortOmadmWappush(byte[] origPdu, int index) {
+ index += 4;
+ byte[] omaPdu = new byte[origPdu.length - index];
+ System.arraycopy(origPdu, index, omaPdu, 0, omaPdu.length);
+
+ WspTypeDecoder pduDecoder = new WspTypeDecoder(omaPdu);
+ int wspIndex = 2;
+
+ // Process header length field
+ if (pduDecoder.decodeUintvarInteger(wspIndex) == false) {
+ return false;
+ }
+
+ wspIndex += pduDecoder.getDecodedDataLength(); // advance to next field
+
+ // Process content type field
+ if (pduDecoder.decodeContentType(wspIndex) == false) {
+ return false;
+ }
+
+ String mimeType = pduDecoder.getValueString();
+ if (mimeType != null && mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_SYNCML_NOTI)) {
+ return true;
+ }
+ return false;
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
index ee63ede..9af2d26 100755
--- a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
+++ b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
@@ -119,8 +119,11 @@ public final class RuimRecords extends IccRecords {
adnCache.reset();
- phone.setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, null);
- phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null);
+ // Don't clean up PROPERTY_ICC_OPERATOR_ISO_COUNTRY and
+ // PROPERTY_ICC_OPERATOR_NUMERIC here. Since not all CDMA
+ // devices have RUIM, these properties should keep the original
+ // values, e.g. build time settings, when there is no RUIM but
+ // set new values when RUIM is available and loaded.
// recordsRequested is set to false indicating that the SIM
// read requests made so far are not valid. This is set to
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index dcde71a..19c06f6 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -1850,7 +1850,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (!dc.configureRetry(SystemProperties.get("ro.gsm.data_retry_config"))) {
if (!dc.configureRetry(DEFAULT_DATA_RETRY_CONFIG)) {
// Should never happen, log an error and default to a simple linear sequence.
- loge("createDataConnection: Could not configure using " +
+ loge("configureRetry: Could not configure using " +
"DEFAULT_DATA_RETRY_CONFIG=" + DEFAULT_DATA_RETRY_CONFIG);
dc.configureRetry(20, 2000, 1000);
}
@@ -1859,7 +1859,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (!dc.configureRetry(SystemProperties.get("ro.gsm.2nd_data_retry_config"))) {
if (!dc.configureRetry(SECONDARY_DATA_RETRY_CONFIG)) {
// Should never happen, log an error and default to a simple sequence.
- loge("createDataConnection: Could note configure using " +
+ loge("configureRetry: Could note configure using " +
"SECONDARY_DATA_RETRY_CONFIG=" + SECONDARY_DATA_RETRY_CONFIG);
dc.configureRetry("max_retries=3, 333, 333, 333");
}
@@ -1872,7 +1872,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (DBG) log("destroyDataConnections: clear mDataConnectionList");
mDataConnections.clear();
} else {
- if (DBG) log("destroyDataConnectionList mDataConnecitonList is empty, ignore");
+ if (DBG) log("destroyDataConnections: mDataConnecitonList is empty, ignore");
}
}
diff --git a/tests/BiDiTests/res/layout/table_layout_locale.xml b/tests/BiDiTests/res/layout/table_layout_locale.xml
index 2589b40..bd2ad23 100644
--- a/tests/BiDiTests/res/layout/table_layout_locale.xml
+++ b/tests/BiDiTests/res/layout/table_layout_locale.xml
@@ -44,7 +44,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -64,7 +64,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -73,7 +73,7 @@
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:layoutDirection="inherit">
-
+
<TableRow>
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -90,7 +90,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -110,7 +110,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -119,7 +119,7 @@
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:layoutDirection="ltr">
-
+
<TableRow>
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -136,7 +136,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -156,7 +156,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -165,7 +165,7 @@
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:layoutDirection="rtl">
-
+
<TableRow>
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -182,7 +182,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -202,7 +202,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -211,7 +211,7 @@
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:layoutDirection="locale">
-
+
<TableRow>
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -228,7 +228,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -248,7 +248,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
diff --git a/tests/BiDiTests/res/layout/table_layout_ltr.xml b/tests/BiDiTests/res/layout/table_layout_ltr.xml
index d8d412c..18c0817 100644
--- a/tests/BiDiTests/res/layout/table_layout_ltr.xml
+++ b/tests/BiDiTests/res/layout/table_layout_ltr.xml
@@ -44,7 +44,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -64,7 +64,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -90,7 +90,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -110,7 +110,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -136,7 +136,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -156,7 +156,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -182,7 +182,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -202,7 +202,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -228,7 +228,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -248,7 +248,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
diff --git a/tests/BiDiTests/res/layout/table_layout_rtl.xml b/tests/BiDiTests/res/layout/table_layout_rtl.xml
index 53130fe..d7e097d 100644
--- a/tests/BiDiTests/res/layout/table_layout_rtl.xml
+++ b/tests/BiDiTests/res/layout/table_layout_rtl.xml
@@ -44,7 +44,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -64,7 +64,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -73,7 +73,7 @@
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:layoutDirection="inherit">
-
+
<TableRow>
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -90,7 +90,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -110,7 +110,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -119,7 +119,7 @@
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:layoutDirection="ltr">
-
+
<TableRow>
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -136,7 +136,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -156,7 +156,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -165,7 +165,7 @@
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:layoutDirection="rtl">
-
+
<TableRow>
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -182,7 +182,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -202,7 +202,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
@@ -211,7 +211,7 @@
android:layout_height="wrap_content"
android:stretchColumns="1,2"
android:layoutDirection="locale">
-
+
<TableRow>
<Button android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -228,7 +228,7 @@
android:layout_width="wrap_content"
android:text="@string/button_after_text"
android:textSize="24dip"
- android:gravity="after"
+ android:gravity="end"
/>
</TableRow>
@@ -248,7 +248,7 @@
android:layout_width="wrap_content"
android:text="@string/button_before_text"
android:textSize="24dip"
- android:gravity="before"
+ android:gravity="start"
/>
</TableRow>
</TableLayout>
diff --git a/tests/RenderScriptTests/PerfTest/res/drawable/flares.png b/tests/RenderScriptTests/PerfTest/res/drawable/flares.png
new file mode 100644
index 0000000..3a5c970
--- /dev/null
+++ b/tests/RenderScriptTests/PerfTest/res/drawable/flares.png
Binary files differ
diff --git a/tests/RenderScriptTests/PerfTest/res/drawable/light1.jpg b/tests/RenderScriptTests/PerfTest/res/drawable/light1.jpg
new file mode 100644
index 0000000..2f2f10e
--- /dev/null
+++ b/tests/RenderScriptTests/PerfTest/res/drawable/light1.jpg
Binary files differ
diff --git a/tests/RenderScriptTests/PerfTest/res/drawable/space.jpg b/tests/RenderScriptTests/PerfTest/res/drawable/space.jpg
new file mode 100644
index 0000000..b61f6a3
--- /dev/null
+++ b/tests/RenderScriptTests/PerfTest/res/drawable/space.jpg
Binary files differ
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
index b568781..3f57799 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
@@ -38,6 +38,10 @@ import android.renderscript.ProgramStore.BlendSrcFunc;
import android.renderscript.ProgramStore.BlendDstFunc;
import android.renderscript.RenderScript.RSMessageHandler;
import android.renderscript.Sampler.Value;
+import android.renderscript.Mesh.Primitive;
+import android.renderscript.Matrix4f;
+import android.renderscript.ProgramVertexFixedFunction;
+
import android.util.Log;
@@ -45,7 +49,9 @@ public class RsBenchRS {
private static final String TAG = "RsBenchRS";
private static final String SAMPLE_TEXT = "Bench Test";
-
+ private static final String LIST_TEXT =
+ "This is a sample list of text to show in the list view";
+ private static int PARTICLES_COUNT = 12000;
int mWidth;
int mHeight;
int mLoops;
@@ -82,6 +88,7 @@ public class RsBenchRS {
private Sampler mLinearWrap;
private Sampler mMipLinearWrap;
private Sampler mNearestClamp;
+ private Sampler mNearesWrap;
private ProgramStore mProgStoreBlendNoneDepth;
private ProgramStore mProgStoreBlendNone;
@@ -106,6 +113,7 @@ public class RsBenchRS {
private ScriptField_VertexShaderConstants3_s mVSConstPixel;
private ScriptField_FragentShaderConstants3_s mFSConstPixel;
+
private ProgramRaster mCullBack;
private ProgramRaster mCullFront;
private ProgramRaster mCullNone;
@@ -121,6 +129,7 @@ public class RsBenchRS {
private Mesh mWbyHMesh;
private Mesh mTorus;
private Mesh mSingleMesh;
+ private Mesh mParticlesMesh;
Font mFontSans;
Font mFontSerif;
@@ -128,6 +137,9 @@ public class RsBenchRS {
private ScriptField_ListAllocs_s mTextureAllocs;
private ScriptField_ListAllocs_s mSampleTextAllocs;
+ private ScriptField_ListAllocs_s mSampleListViewAllocs;
+ private ScriptField_VpConsts mPvStarAlloc;
+
private ScriptC_rsbench mScript;
@@ -300,6 +312,15 @@ public class RsBenchRS {
mScript.set_gProgStoreBlendNone(mProgStoreBlendNone);
mScript.set_gProgStoreBlendAlpha(mProgStoreBlendAlpha);
mScript.set_gProgStoreBlendAdd(mProgStoreBlendAdd);
+
+ // For GALAXY
+ builder = new ProgramStore.Builder(mRS);
+ builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
+ mRS.bindProgramStore(builder.create());
+
+ builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE);
+ mScript.set_gPSLights(builder.create());
+
}
private void initProgramFragment() {
@@ -316,8 +337,59 @@ public class RsBenchRS {
mScript.set_gProgFragmentColor(mProgFragmentColor);
mScript.set_gProgFragmentTexture(mProgFragmentTexture);
+
+
+ // For Galaxy live wallpaper drawing
+ ProgramFragmentFixedFunction.Builder builder = new ProgramFragmentFixedFunction.Builder(mRS);
+ builder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
+ ProgramFragmentFixedFunction.Builder.Format.RGB, 0);
+ ProgramFragment pfb = builder.create();
+ pfb.bindSampler(mNearesWrap, 0);
+ mScript.set_gPFBackground(pfb);
+
+ builder = new ProgramFragmentFixedFunction.Builder(mRS);
+ builder.setPointSpriteTexCoordinateReplacement(true);
+ builder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.MODULATE,
+ ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
+ builder.setVaryingColor(true);
+ ProgramFragment pfs = builder.create();
+ pfs.bindSampler(mMipLinearWrap, 0);
+ mScript.set_gPFStars(pfs);
+
}
+ private Matrix4f getProjectionNormalized(int w, int h) {
+ // range -1,1 in the narrow axis at z = 0.
+ Matrix4f m1 = new Matrix4f();
+ Matrix4f m2 = new Matrix4f();
+
+ if(w > h) {
+ float aspect = ((float)w) / h;
+ m1.loadFrustum(-aspect,aspect, -1,1, 1,100);
+ } else {
+ float aspect = ((float)h) / w;
+ m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
+ }
+
+ m2.loadRotate(180, 0, 1, 0);
+ m1.loadMultiply(m1, m2);
+
+ m2.loadScale(-2, 2, 1);
+ m1.loadMultiply(m1, m2);
+
+ m2.loadTranslate(0, 0, 2);
+ m1.loadMultiply(m1, m2);
+ return m1;
+ }
+
+ private void updateProjectionMatrices() {
+ Matrix4f projNorm = getProjectionNormalized(mBenchmarkDimX, mBenchmarkDimY);
+ ScriptField_VpConsts.Item i = new ScriptField_VpConsts.Item();
+ i.Proj = projNorm;
+ i.MVP = projNorm;
+ mPvStarAlloc.set(i, 0, true);
+ }
+
private void initProgramVertex() {
ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
mProgVertex = pvb.create();
@@ -329,6 +401,39 @@ public class RsBenchRS {
mPVA.setProjection(proj);
mScript.set_gProgVertex(mProgVertex);
+
+ // For galaxy live wallpaper
+ mPvStarAlloc = new ScriptField_VpConsts(mRS, 1);
+ mScript.bind_vpConstants(mPvStarAlloc);
+ updateProjectionMatrices();
+
+ ProgramVertex.Builder sb = new ProgramVertex.Builder(mRS);
+ String t = "varying vec4 varColor;\n" +
+ "varying vec2 varTex0;\n" +
+ "void main() {\n" +
+ " float dist = ATTRIB_position.y;\n" +
+ " float angle = ATTRIB_position.x;\n" +
+ " float x = dist * sin(angle);\n" +
+ " float y = dist * cos(angle) * 0.892;\n" +
+ " float p = dist * 5.5;\n" +
+ " float s = cos(p);\n" +
+ " float t = sin(p);\n" +
+ " vec4 pos;\n" +
+ " pos.x = t * x + s * y;\n" +
+ " pos.y = s * x - t * y;\n" +
+ " pos.z = ATTRIB_position.z;\n" +
+ " pos.w = 1.0;\n" +
+ " gl_Position = UNI_MVP * pos;\n" +
+ " gl_PointSize = ATTRIB_color.a * 10.0;\n" +
+ " varColor.rgb = ATTRIB_color.rgb;\n" +
+ " varColor.a = 1.0;\n" +
+ "}\n";
+ sb.setShader(t);
+ sb.addInput(mParticlesMesh.getVertexAllocation(0).getType().getElement());
+ sb.addConstant(mPvStarAlloc.getType());
+ ProgramVertex pvs = sb.create();
+ pvs.bindConstants(mPvStarAlloc.getAllocation(), 0);
+ mScript.set_gPVStars(pvs);
}
private void initCustomShaders() {
@@ -426,6 +531,11 @@ public class RsBenchRS {
mScript.set_gTexTransparent(mTexTransparent);
mScript.set_gTexChecker(mTexChecker);
mScript.set_gTexGlobe(mTexGlobe);
+
+ // For Galaxy live wallpaper
+ mScript.set_gTSpace(loadTextureRGB(R.drawable.space));
+ mScript.set_gTLight1(loadTextureRGB(R.drawable.light1));
+ mScript.set_gTFlares(loadTextureARGB(R.drawable.flares));
}
private void initFonts() {
@@ -440,6 +550,19 @@ public class RsBenchRS {
mScript.set_gFontSerif(mFontSerif);
}
+ private void createParticlesMesh() {
+ ScriptField_Particle p = new ScriptField_Particle(mRS, PARTICLES_COUNT);
+
+ final Mesh.AllocationBuilder meshBuilder = new Mesh.AllocationBuilder(mRS);
+ meshBuilder.addVertexAllocation(p.getAllocation());
+ final int vertexSlot = meshBuilder.getCurrentVertexTypeIndex();
+ meshBuilder.addIndexSetType(Primitive.POINT);
+ mParticlesMesh = meshBuilder.create();
+
+ mScript.set_gParticlesMesh(mParticlesMesh);
+ mScript.bind_Particles(p);
+ }
+
private void initMesh() {
m10by10Mesh = getMbyNMesh(mBenchmarkDimX, mBenchmarkDimY, 10, 10);
mScript.set_g10by10Mesh(m10by10Mesh);
@@ -458,6 +581,8 @@ public class RsBenchRS {
mTorus = (Mesh)entry.getObject();
mScript.set_gTorusMesh(mTorus);
}
+
+ createParticlesMesh();
}
private void initSamplers() {
@@ -471,6 +596,7 @@ public class RsBenchRS {
mLinearClamp = Sampler.CLAMP_LINEAR(mRS);
mNearestClamp = Sampler.CLAMP_NEAREST(mRS);
mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS);
+ mNearesWrap = Sampler.WRAP_NEAREST(mRS);
mScript.set_gLinearClamp(mLinearClamp);
mScript.set_gLinearWrap(mLinearWrap);
@@ -524,10 +650,10 @@ public class RsBenchRS {
initSamplers();
initProgramStore();
initProgramFragment();
+ initMesh();
initProgramVertex();
initFonts();
loadImages();
- initMesh();
initProgramRaster();
initCustomShaders();
@@ -567,6 +693,15 @@ public class RsBenchRS {
mSampleTextAllocs.copyAll();
mScript.bind_gSampleTextList100(mSampleTextAllocs);
+ mSampleListViewAllocs = new ScriptField_ListAllocs_s(mRS, 1000);
+ for (int i = 0; i < 1000; i++) {
+ ScriptField_ListAllocs_s.Item textElem = new ScriptField_ListAllocs_s.Item();
+ textElem.item = Allocation.createFromString(mRS, LIST_TEXT, Allocation.USAGE_SCRIPT);
+ mSampleListViewAllocs.set(textElem, i, false);
+ }
+ mSampleListViewAllocs.copyAll();
+ mScript.bind_gListViewText(mSampleListViewAllocs);
+
mRS.bindRootScript(mScript);
}
}
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
index 0294b31..6d80b0e 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
@@ -23,9 +23,50 @@
const int RS_MSG_TEST_DONE = 100;
const int RS_MSG_RESULTS_READY = 101;
-const int gMaxModes = 29;
+const int gMaxModes = 31;
int gMaxLoops;
+// Parameters for galaxy live wallpaper
+rs_allocation gTSpace;
+rs_allocation gTLight1;
+rs_allocation gTFlares;
+rs_mesh gParticlesMesh;
+
+rs_program_fragment gPFBackground;
+rs_program_fragment gPFStars;
+rs_program_vertex gPVStars;
+rs_program_vertex gPVBkProj;
+rs_program_store gPSLights;
+
+float gXOffset = 0.5f;
+
+#define ELLIPSE_RATIO 0.892f
+#define PI 3.1415f
+#define TWO_PI 6.283f
+#define ELLIPSE_TWIST 0.023333333f
+
+static float angle = 50.f;
+static int gOldWidth;
+static int gOldHeight;
+static int gWidth;
+static int gHeight;
+static float gSpeed[12000];
+static int gGalaxyRadius = 300;
+static rs_allocation gParticlesBuffer;
+
+typedef struct __attribute__((packed, aligned(4))) Particle {
+ uchar4 color;
+ float3 position;
+} Particle_t;
+Particle_t *Particles;
+
+typedef struct VpConsts {
+ rs_matrix4x4 Proj;
+ rs_matrix4x4 MVP;
+} VpConsts_t;
+VpConsts_t *vpConstants;
+// End of parameters for galaxy live wallpaper
+
// Allocation to send test names back to java
char *gStringBuffer = 0;
// Allocation to write the results into
@@ -52,6 +93,7 @@ typedef struct ListAllocs_s {
ListAllocs *gTexList100;
ListAllocs *gSampleTextList100;
+ListAllocs *gListViewText;
rs_mesh g10by10Mesh;
rs_mesh g100by100Mesh;
@@ -109,6 +151,141 @@ static float textColors[] = {1.0f, 1.0f, 1.0f, 1.0f,
0.5f, 0.6f, 0.7f, 1.0f,
};
+/**
+ * Methods to draw the galaxy live wall paper
+ */
+static float mapf(float minStart, float minStop, float maxStart, float maxStop, float value) {
+ return maxStart + (maxStart - maxStop) * ((value - minStart) / (minStop - minStart));
+}
+
+/**
+ * Helper function to generate the stars.
+ */
+static float randomGauss() {
+ float x1;
+ float x2;
+ float w = 2.f;
+
+ while (w >= 1.0f) {
+ x1 = rsRand(2.0f) - 1.0f;
+ x2 = rsRand(2.0f) - 1.0f;
+ w = x1 * x1 + x2 * x2;
+ }
+
+ w = sqrt(-2.0f * log(w) / w);
+ return x1 * w;
+}
+
+/**
+ * Generates the properties for a given star.
+ */
+static void createParticle(Particle_t *part, int idx, float scale) {
+ float d = fabs(randomGauss()) * gGalaxyRadius * 0.5f + rsRand(64.0f);
+ float id = d / gGalaxyRadius;
+ float z = randomGauss() * 0.4f * (1.0f - id);
+ float p = -d * ELLIPSE_TWIST;
+
+ if (d < gGalaxyRadius * 0.33f) {
+ part->color.x = (uchar) (220 + id * 35);
+ part->color.y = 220;
+ part->color.z = 220;
+ } else {
+ part->color.x = 180;
+ part->color.y = 180;
+ part->color.z = (uchar) clamp(140.f + id * 115.f, 140.f, 255.f);
+ }
+ // Stash point size * 10 in Alpha
+ part->color.w = (uchar) (rsRand(1.2f, 2.1f) * 60);
+
+ if (d > gGalaxyRadius * 0.15f) {
+ z *= 0.6f * (1.0f - id);
+ } else {
+ z *= 0.72f;
+ }
+
+ // Map to the projection coordinates (viewport.x = -1.0 -> 1.0)
+ d = mapf(-4.0f, gGalaxyRadius + 4.0f, 0.0f, scale, d);
+
+ part->position.x = rsRand(TWO_PI);
+ part->position.y = d;
+ gSpeed[idx] = rsRand(0.0015f, 0.0025f) * (0.5f + (scale / d)) * 0.8f;
+
+ part->position.z = z / 5.0f;
+}
+
+/**
+ * Initialize all the starts, called from Java
+ */
+void initParticles() {
+ Particle_t *part = Particles;
+ float scale = gGalaxyRadius / (gWidth * 0.5f);
+ int count = rsAllocationGetDimX(gParticlesBuffer);
+ for (int i = 0; i < count; i ++) {
+ createParticle(part, i, scale);
+ part++;
+ }
+}
+
+static void drawSpace() {
+ rsgBindProgramFragment(gPFBackground);
+ rsgBindTexture(gPFBackground, 0, gTSpace);
+ rsgDrawQuadTexCoords(
+ 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
+ gWidth, 0.0f, 0.0f, 2.0f, 1.0f,
+ gWidth, gHeight, 0.0f, 2.0f, 0.0f,
+ 0.0f, gHeight, 0.0f, 0.0f, 0.0f);
+}
+
+static void drawLights() {
+ rsgBindProgramVertex(gPVBkProj);
+ rsgBindProgramFragment(gPFBackground);
+ rsgBindTexture(gPFBackground, 0, gTLight1);
+
+ float scale = 512.0f / gWidth;
+ float x = -scale - scale * 0.05f;
+ float y = -scale;
+
+ scale *= 2.0f;
+
+ rsgDrawQuad(x, y, 0.0f,
+ x + scale * 1.1f, y, 0.0f,
+ x + scale * 1.1f, y + scale, 0.0f,
+ x, y + scale, 0.0f);
+}
+
+static void drawParticles(float offset) {
+ float a = offset * angle;
+ float absoluteAngle = fabs(a);
+
+ rs_matrix4x4 matrix;
+ rsMatrixLoadTranslate(&matrix, 0.0f, 0.0f, 10.0f - 6.0f * absoluteAngle / 50.0f);
+ if (gHeight > gWidth) {
+ rsMatrixScale(&matrix, 6.6f, 6.0f, 1.0f);
+ } else {
+ rsMatrixScale(&matrix, 12.6f, 12.0f, 1.0f);
+ }
+ rsMatrixRotate(&matrix, absoluteAngle, 1.0f, 0.0f, 0.0f);
+ rsMatrixRotate(&matrix, a, 0.0f, 0.4f, 0.1f);
+ rsMatrixLoad(&vpConstants->MVP, &vpConstants->Proj);
+ rsMatrixMultiply(&vpConstants->MVP, &matrix);
+ rsgAllocationSyncAll(rsGetAllocation(vpConstants));
+
+ rsgBindProgramVertex(gPVStars);
+ rsgBindProgramFragment(gPFStars);
+ rsgBindProgramStore(gPSLights);
+ rsgBindTexture(gPFStars, 0, gTFlares);
+
+ Particle_t *vtx = Particles;
+ int count = rsAllocationGetDimX(gParticlesBuffer);
+ for (int i = 0; i < count; i++) {
+ vtx->position.x = vtx->position.x + gSpeed[i];
+ vtx++;
+ }
+
+ rsgDrawMesh(gParticlesMesh);
+}
+/* end of methods for drawing galaxy */
+
static void setupOffscreenTarget() {
rsgBindColorTarget(gRenderBufferColor, 0);
rsgBindDepthTarget(gRenderBufferDepth);
@@ -303,6 +480,71 @@ static void displayImageWithText(int wResolution, int hResolution, int meshMode)
}
}
+// Display a list of text as the list view
+static void displayListView() {
+ // set text color
+ rsgFontColor(0.9f, 0.9f, 0.9f, 1.0f);
+ rsgBindFont(gFontSans);
+
+ // get the size of the list
+ rs_allocation textAlloc;
+ textAlloc = rsGetAllocation(gListViewText);
+ int allocSize = rsAllocationGetDimX(textAlloc);
+
+ int listItemHeight = 80;
+ int yOffset = listItemHeight;
+
+ // set the color for the list divider
+ rsgBindProgramFragment(gProgFragmentColor);
+ rsgProgramFragmentConstantColor(gProgFragmentColor, 1.0, 1.0, 1.0, 1);
+
+ // draw the list with divider
+ for (int i = 0; i < allocSize; i++) {
+ if (yOffset - listItemHeight > gRenderSurfaceH) {
+ break;
+ }
+ rsgDrawRect(0, yOffset - 1, gRenderSurfaceW, yOffset, 0);
+ rsgDrawText(gListViewText[i].item, 20, yOffset - 10);
+ yOffset += listItemHeight;
+ }
+}
+
+static void drawGalaxy() {
+ rsgClearColor(0.f, 0.f, 0.f, 1.f);
+ gParticlesBuffer = rsGetAllocation(Particles);
+ rsgBindProgramFragment(gPFBackground);
+
+ gWidth = rsgGetWidth();
+ gHeight = rsgGetHeight();
+ if ((gWidth != gOldWidth) || (gHeight != gOldHeight)) {
+ initParticles();
+ gOldWidth = gWidth;
+ gOldHeight = gHeight;
+ }
+
+ float offset = mix(-1.0f, 1.0f, gXOffset);
+ drawSpace();
+ drawParticles(offset);
+ drawLights();
+}
+
+// Display images and text with live wallpaper in the background
+static void dispalyLiveWallPaper(int wResolution, int hResolution) {
+ bindProgramVertexOrtho();
+
+ drawGalaxy();
+
+ rsgBindProgramStore(gProgStoreBlendAlpha);
+ rsgBindProgramFragment(gProgFragmentTexture);
+ rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp);
+
+ drawMeshInPage(0, 0, wResolution, hResolution);
+ drawMeshInPage(-1.0f*gRenderSurfaceW, 0, wResolution, hResolution);
+ drawMeshInPage(1.0f*gRenderSurfaceW, 0, wResolution, hResolution);
+ drawMeshInPage(-2.0f*gRenderSurfaceW, 0, wResolution, hResolution);
+ drawMeshInPage(2.0f*gRenderSurfaceW, 0, wResolution, hResolution);
+}
+
static float gTorusRotation = 0;
static void updateModelMatrix(rs_matrix4x4 *matrix, void *buffer) {
if (buffer == 0) {
@@ -602,14 +844,12 @@ static const char *testNames[] = {
"Geo test 25.6k heavy fragment heavy vertex",
"Geo test 51.2k heavy fragment heavy vertex",
"Geo test 204.8k small tries heavy fragment heavy vertex",
- "UI test with icon display 10 by 10", // 25
- "UI test with icon display 100 by 100", // 26
- "UI test with image and text display 3 pages", // 27
- "UI test with image and text display 5 pages", // 28
- "UI test with list view", // 29
-// "UI test with live wallpaper", // 30
-// "Mesh with 10 by 10 texture",
-// "Mesh with 100 by 100 texture",
+ "UI test with icon display 10 by 10",
+ "UI test with icon display 100 by 100",
+ "UI test with image and text display 3 pages",
+ "UI test with image and text display 5 pages",
+ "UI test with list view",
+ "UI test with live wallpaper",
};
void getTestName(int testIndex) {
@@ -714,6 +954,12 @@ static void runTest(int index) {
case 28:
displayImageWithText(7, 5, 1);
break;
+ case 29:
+ displayListView();
+ break;
+ case 30:
+ dispalyLiveWallPaper(7, 5);
+ break;
}
}
@@ -737,7 +983,6 @@ static void drawOffscreenResult(int posX, int posY, int width, int height) {
}
int root(void) {
-
gRenderSurfaceW = rsgGetWidth();
gRenderSurfaceH = rsgGetHeight();
rsgClearColor(0.2f, 0.2f, 0.2f, 1.0f);
diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
index 8e3ed93..b4448a9 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java
@@ -1093,6 +1093,33 @@ public final class Canvas_Delegate {
}
@LayoutlibDelegate
+ /*package*/ static void native_drawTextWithGlyphs(int nativeCanvas, char[] text,
+ int index, int count, float x,
+ float y, int flags, int paint) {
+ native_drawText(nativeCanvas, text, index, count, x, y, flags, paint);
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static void native_drawTextWithGlyphs(int nativeCanvas, String text,
+ int start, int end, float x,
+ float y, int flags, int paint) {
+ int count = end - start;
+ char[] buffer = TemporaryBuffer.obtain(count);
+ TextUtils.getChars(text, start, end, buffer, 0);
+
+ native_drawText(nativeCanvas, text, 0, count, x, y, flags, paint);
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static void native_drawGlyphs(int nativeCanvas, char[] glyphs,
+ int index, int count, float x,
+ float y, int flags, int paint) {
+ // FIXME
+ Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
+ "Canvas.drawGlyphs is not supported.", null, null /*data*/);
+ }
+
+ @LayoutlibDelegate
/*package*/ static void native_drawPosText(int nativeCanvas,
char[] text, int index,
int count, float[] pos,
diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
index 373f482..7777e19 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java
@@ -940,9 +940,16 @@ public class Paint_Delegate {
}
@LayoutlibDelegate
+ /* package */static int native_getTextGlyphs(int native_object, String text, int start,
+ int end, int contextStart, int contextEnd, int flags, char[] glyphs) {
+ // FIXME
+ return 0;
+ }
+
+ @LayoutlibDelegate
/*package*/ static float native_getTextRunAdvances(int native_object,
char[] text, int index, int count, int contextIndex, int contextCount,
- int flags, float[] advances, int advancesIndex) {
+ int flags, float[] advances, int advancesIndex, int reserved) {
// get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object);
if (delegate == null) {
@@ -986,14 +993,14 @@ public class Paint_Delegate {
@LayoutlibDelegate
/*package*/ static float native_getTextRunAdvances(int native_object,
String text, int start, int end, int contextStart, int contextEnd,
- int flags, float[] advances, int advancesIndex) {
+ int flags, float[] advances, int advancesIndex, int reserved) {
// FIXME: support contextStart, contextEnd and direction flag
int count = end - start;
char[] buffer = TemporaryBuffer.obtain(count);
TextUtils.getChars(text, start, end, buffer, 0);
return native_getTextRunAdvances(native_object, buffer, 0, count, contextStart,
- contextEnd - contextStart, flags, advances, advancesIndex);
+ contextEnd - contextStart, flags, advances, advancesIndex, reserved);
}
@LayoutlibDelegate
diff --git a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java
index e6dc646..98f8529 100644
--- a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java
+++ b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java
@@ -44,6 +44,16 @@ public class ICU_Delegate {
// --- Native methods accessing ICU's database.
@LayoutlibDelegate
+ /*package*/ static String getIcuVersion() {
+ return "unknown_layoutlib";
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static String getUnicodeVersion() {
+ return "5.2";
+ }
+
+ @LayoutlibDelegate
/*package*/ static String[] getAvailableBreakIteratorLocalesNative() {
return new String[0];
}
@@ -74,17 +84,27 @@ public class ICU_Delegate {
}
@LayoutlibDelegate
- /*package*/ static String getCurrencyCodeNative(String locale) {
+ /*package*/ static String[] getAvailableCurrencyCodes() {
+ return new String[0];
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static String getCurrencyCode(String locale) {
return "";
}
@LayoutlibDelegate
- /*package*/ static int getCurrencyFractionDigitsNative(String currencyCode) {
+ /*package*/ static String getCurrencyDisplayName(String locale, String currencyCode) {
+ return "";
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static int getCurrencyFractionDigits(String currencyCode) {
return 0;
}
@LayoutlibDelegate
- /*package*/ static String getCurrencySymbolNative(String locale, String currencyCode) {
+ /*package*/ static String getCurrencySymbol(String locale, String currencyCode) {
return "";
}
@@ -114,6 +134,12 @@ public class ICU_Delegate {
}
@LayoutlibDelegate
+ /*package*/ static String addLikelySubtags(String locale) {
+ return "";
+ }
+
+
+ @LayoutlibDelegate
/*package*/ static String[] getISOLanguagesNative() {
return Locale.getISOLanguages();
}