Merge "split active user animation across switch."
diff --git a/api/current.txt b/api/current.txt
index 111bd65..e4d5fd1 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -17360,6 +17360,7 @@
field public static final java.lang.String CAN_PARTIALLY_UPDATE = "canPartiallyUpdate";
field public static final java.lang.String DELETED = "deleted";
field public static final java.lang.String DIRTY = "dirty";
+ field public static final java.lang.String MUTATORS = "mutators";
field public static final java.lang.String _SYNC_ID = "_sync_id";
}
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index 6cf4dd0..32e40ee 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -499,7 +499,7 @@
" already exists and is not a directory");
}
} else {
- if (!file.mkdir()) {
+ if (!file.mkdirs()) {
throw new IllegalStateException("Unable to create directory: "+
file.getAbsolutePath());
}
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index 5c75aff..2897ee0 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -289,7 +289,7 @@
/**
* Like {@link #getActivity(Context, int, Intent, int)}, but allows an
- * array of Intents to be supplied. The first Intent in the array is
+ * array of Intents to be supplied. The last Intent in the array is
* taken as the primary key for the PendingIntent, like the single Intent
* given to {@link #getActivity(Context, int, Intent, int)}. Upon sending
* the resulting PendingIntent, all of the Intents are started in the same
@@ -335,7 +335,7 @@
/**
* Like {@link #getActivity(Context, int, Intent, int)}, but allows an
- * array of Intents to be supplied. The first Intent in the array is
+ * array of Intents to be supplied. The last Intent in the array is
* taken as the primary key for the PendingIntent, like the single Intent
* given to {@link #getActivity(Context, int, Intent, int)}. Upon sending
* the resulting PendingIntent, all of the Intents are started in the same
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index cf0603e..89b1bbd 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1950,7 +1950,7 @@
/**
* Broadcast Action: External media is present, but not mounted at its mount point.
- * The path to the mount point for the removed media is contained in the Intent.mData field.
+ * The path to the mount point for the unmounted media is contained in the Intent.mData field.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED";
@@ -1971,7 +1971,7 @@
/**
* Broadcast Action: External media is present and mounted at its mount point.
- * The path to the mount point for the removed media is contained in the Intent.mData field.
+ * The path to the mount point for the mounted media is contained in the Intent.mData field.
* The Intent contains an extra with name "read-only" and Boolean value to indicate if the
* media was mounted read only.
*/
@@ -2002,7 +2002,7 @@
/**
* Broadcast Action: External media is present but cannot be mounted.
- * The path to the mount point for the removed media is contained in the Intent.mData field.
+ * The path to the mount point for the unmountable media is contained in the Intent.mData field.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE";
diff --git a/core/java/android/nfc/NfcActivityManager.java b/core/java/android/nfc/NfcActivityManager.java
index 53b41d5..7c3123f 100644
--- a/core/java/android/nfc/NfcActivityManager.java
+++ b/core/java/android/nfc/NfcActivityManager.java
@@ -197,7 +197,7 @@
isResumed = state.resumed;
}
if (isResumed) {
- requestNfcServiceCallback(true);
+ requestNfcServiceCallback();
}
}
@@ -211,7 +211,7 @@
isResumed = state.resumed;
}
if (isResumed) {
- requestNfcServiceCallback(true);
+ requestNfcServiceCallback();
}
}
@@ -223,7 +223,7 @@
isResumed = state.resumed;
}
if (isResumed) {
- requestNfcServiceCallback(true);
+ requestNfcServiceCallback();
}
}
@@ -236,7 +236,7 @@
isResumed = state.resumed;
}
if (isResumed) {
- requestNfcServiceCallback(true);
+ requestNfcServiceCallback();
}
}
@@ -249,18 +249,17 @@
isResumed = state.resumed;
}
if (isResumed) {
- requestNfcServiceCallback(true);
+ requestNfcServiceCallback();
}
}
/**
* Request or unrequest NFC service callbacks for NDEF push.
* Makes IPC call - do not hold lock.
- * TODO: Do not do IPC on every onPause/onResume
*/
- void requestNfcServiceCallback(boolean request) {
+ void requestNfcServiceCallback() {
try {
- NfcAdapter.sService.setNdefPushCallback(request ? this : null);
+ NfcAdapter.sService.setNdefPushCallback(this);
} catch (RemoteException e) {
mAdapter.attemptDeadServiceRecovery(e);
}
@@ -355,7 +354,7 @@
if (state == null) return;
state.resumed = true;
}
- requestNfcServiceCallback(true);
+ requestNfcServiceCallback();
}
/** Callback from Activity life-cycle, on main thread */
@@ -367,7 +366,6 @@
if (state == null) return;
state.resumed = false;
}
- requestNfcServiceCallback(false);
}
/** Callback from Activity life-cycle, on main thread */
diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java
index af6e88e9..5fdca86 100644
--- a/core/java/android/provider/CalendarContract.java
+++ b/core/java/android/provider/CalendarContract.java
@@ -302,9 +302,16 @@
* Used to indicate that local, unsynced, changes are present.
* <P>Type: INTEGER (long)</P>
*/
+
public static final String DIRTY = "dirty";
/**
+ * Used in conjunction with {@link #DIRTY} to indicate what packages wrote local changes.
+ * <P>Type: TEXT</P>
+ */
+ public static final String MUTATORS = "mutators";
+
+ /**
* Whether the row has been deleted but not synced to the server. A
* deleted row should be ignored.
* <P>
@@ -525,6 +532,7 @@
DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
+ DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, MUTATORS);
DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1);
DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2);
@@ -647,6 +655,7 @@
* <li>{@link #CALENDAR_COLOR}</li>
* <li>{@link #_SYNC_ID}</li>
* <li>{@link #DIRTY}</li>
+ * <li>{@link #MUTATORS}</li>
* <li>{@link #OWNER_ACCOUNT}</li>
* <li>{@link #MAX_REMINDERS}</li>
* <li>{@link #ALLOWED_REMINDERS}</li>
@@ -714,6 +723,7 @@
ACCOUNT_TYPE,
_SYNC_ID,
DIRTY,
+ MUTATORS,
OWNER_ACCOUNT,
MAX_REMINDERS,
ALLOWED_REMINDERS,
@@ -1393,6 +1403,7 @@
DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, IS_ORGANIZER);
DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
+ DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, MUTATORS);
DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_SYNCED);
DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED);
DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA1);
@@ -1599,6 +1610,7 @@
* The following Events columns are writable only by a sync adapter
* <ul>
* <li>{@link #DIRTY}</li>
+ * <li>{@link #MUTATORS}</li>
* <li>{@link #_SYNC_ID}</li>
* <li>{@link #SYNC_DATA1}</li>
* <li>{@link #SYNC_DATA2}</li>
@@ -1688,6 +1700,7 @@
public static final String[] SYNC_WRITABLE_COLUMNS = new String[] {
_SYNC_ID,
DIRTY,
+ MUTATORS,
SYNC_DATA1,
SYNC_DATA2,
SYNC_DATA3,
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 4912a64..86d04b6 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -29,6 +29,7 @@
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
+import android.util.DisplayMetrics;
import android.util.Log;
import com.google.android.gles_jni.EGLImpl;
@@ -87,26 +88,22 @@
*
* Possible values:
* "true", to enable profiling
+ * "visual", to enable profiling and visualize the results on screen
* "false", to disable profiling
*
+ * @see #PROFILE_PROPERTY_VISUALIZE
+ *
* @hide
*/
public static final String PROFILE_PROPERTY = "debug.hwui.profile";
/**
- * System property used to enable or disable hardware rendering profiling
- * visualization. The default value of this property is assumed to be false.
- *
- * This property is only taken into account when {@link #PROFILE_PROPERTY} is
- * turned on.
- *
- * Possible values:
- * "true", to enable on screen profiling
- * "false", to disable on screen profiling
+ * Value for {@link #PROFILE_PROPERTY}. When the property is set to this
+ * value, profiling data will be visualized on screen.
*
* @hide
*/
- public static final String PROFILE_VISUALIZER_PROPERTY = "debug.hwui.profile_visualizer";
+ public static final String PROFILE_PROPERTY_VISUALIZE = "visual";
/**
* System property used to specify the number of frames to be used
@@ -693,18 +690,33 @@
@Override
boolean loadSystemProperties(Surface surface) {
+ boolean value;
boolean changed = false;
- boolean value = SystemProperties.getBoolean(PROFILE_PROPERTY, false);
+ String profiling = SystemProperties.get(PROFILE_PROPERTY);
+ value = PROFILE_PROPERTY_VISUALIZE.equalsIgnoreCase(profiling);
+
+ if (value != mProfileVisualizerEnabled) {
+ changed = true;
+ mProfileVisualizerEnabled = value;
+
+ mProfileRects = null;
+ mProfilePaint = null;
+ }
+
+ // If on-screen profiling is not enabled, we need to check whether
+ // console profiling only is enabled
+ if (!value) {
+ value = Boolean.parseBoolean(profiling);
+ }
+
if (value != mProfileEnabled) {
changed = true;
mProfileEnabled = value;
if (mProfileEnabled) {
Log.d(LOG_TAG, "Profiling hardware renderer");
- }
- if (mProfileEnabled) {
int maxProfileFrames = SystemProperties.getInt(PROFILE_MAXFRAMES_PROPERTY,
PROFILE_MAX_FRAMES);
mProfileData = new float[maxProfileFrames * PROFILE_FRAME_DATA_COUNT];
@@ -718,17 +730,7 @@
mProfileLock = null;
}
- mProfileRects = null;
- mProfilePaint = null;
- }
-
- value = SystemProperties.getBoolean(PROFILE_VISUALIZER_PROPERTY, false);
- if (value != mProfileVisualizerEnabled) {
- changed = true;
- mProfileVisualizerEnabled = value;
-
- mProfileRects = null;
- mProfilePaint = null;
+ mProfileCurrentFrame = -PROFILE_FRAME_DATA_COUNT;
}
value = SystemProperties.getBoolean(DEBUG_DIRTY_REGIONS_PROPERTY, false);
@@ -1241,7 +1243,7 @@
mFrameCount++;
debugDirtyRegions(dirty, canvas);
- drawProfileData();
+ drawProfileData(attachInfo);
}
onPostDraw();
@@ -1260,7 +1262,7 @@
return false;
}
- abstract void drawProfileData();
+ abstract void drawProfileData(View.AttachInfo attachInfo);
private Rect beginFrame(HardwareCanvas canvas, Rect dirty, int surfaceState) {
// We had to change the current surface and/or context, redraw everything
@@ -1463,17 +1465,18 @@
* Hardware renderer using OpenGL ES 2.0.
*/
static class Gl20Renderer extends GlRenderer {
- // TODO: Convert dimensions to dp instead of px
private static final int PROFILE_DRAW_MARGIN = 0;
- private static final int PROFILE_DRAW_WIDTH = 4;
+ private static final int PROFILE_DRAW_WIDTH = 3;
private static final int[] PROFILE_DRAW_COLORS = { 0xcf3e66cc, 0xcfdc3912, 0xcfe69800 };
private static final int PROFILE_DRAW_CURRENT_FRAME_COLOR = 0xcf5faa4d;
private static final int PROFILE_DRAW_THRESHOLD_COLOR = 0xff5faa4d;
private static final int PROFILE_DRAW_THRESHOLD_STROKE_WIDTH = 2;
- private static final int PROFILE_DRAW_PX_PER_MS = 10;
+ private static final int PROFILE_DRAW_DP_PER_MS = 7;
private GLES20Canvas mGlCanvas;
+ private DisplayMetrics mDisplayMetrics;
+
private static EGLSurface sPbuffer;
private static final Object[] sPbufferLock = new Object[0];
@@ -1577,9 +1580,13 @@
}
@Override
- void drawProfileData() {
+ void drawProfileData(View.AttachInfo attachInfo) {
if (mProfileEnabled && mProfileVisualizerEnabled) {
- initProfileDrawData();
+ initProfileDrawData(attachInfo);
+
+ final int pxPerMs = (int) (PROFILE_DRAW_DP_PER_MS * mDisplayMetrics.density + 0.5f);
+ final int margin = (int) (PROFILE_DRAW_MARGIN * mDisplayMetrics.density + 0.5f);
+ final int width = (int) (PROFILE_DRAW_WIDTH * mDisplayMetrics.density + 0.5f);
int x = 0;
int count = 0;
@@ -1591,11 +1598,11 @@
int index = count * 4;
if (i == mProfileCurrentFrame) current = index;
- x += PROFILE_DRAW_MARGIN;
- int x2 = x + PROFILE_DRAW_WIDTH;
+ x += margin;
+ int x2 = x + width;
int y2 = mHeight;
- int y1 = (int) (y2 - mProfileData[i] * PROFILE_DRAW_PX_PER_MS);
+ int y1 = (int) (y2 - mProfileData[i] * pxPerMs);
float[] r = mProfileRects[0];
r[index] = x;
@@ -1604,7 +1611,7 @@
r[index + 3] = y2;
y2 = y1;
- y1 = (int) (y2 - mProfileData[i + 1] * PROFILE_DRAW_PX_PER_MS);
+ y1 = (int) (y2 - mProfileData[i + 1] * pxPerMs);
r = mProfileRects[1];
r[index] = x;
@@ -1613,7 +1620,7 @@
r[index + 3] = y2;
y2 = y1;
- y1 = (int) (y2 - mProfileData[i + 2] * PROFILE_DRAW_PX_PER_MS);
+ y1 = (int) (y2 - mProfileData[i + 2] * pxPerMs);
r = mProfileRects[2];
r[index] = x;
@@ -1621,15 +1628,15 @@
r[index + 2] = x2;
r[index + 3] = y2;
- x += PROFILE_DRAW_WIDTH;
+ x += width;
count++;
}
- x += PROFILE_DRAW_MARGIN;
+ x += margin;
drawGraph(count);
drawCurrentFrame(current);
- drawThreshold(x);
+ drawThreshold(x, pxPerMs);
}
}
@@ -1646,15 +1653,16 @@
mProfileRects[2][index + 2], mProfileRects[0][index + 3], mProfilePaint);
}
- private void drawThreshold(int x) {
+ private void drawThreshold(int x, int pxPerMs) {
mProfilePaint.setColor(PROFILE_DRAW_THRESHOLD_COLOR);
- mProfilePaint.setStrokeWidth(PROFILE_DRAW_THRESHOLD_STROKE_WIDTH);
- int y = mHeight - 16 * 10;
+ mProfilePaint.setStrokeWidth((int)
+ (PROFILE_DRAW_THRESHOLD_STROKE_WIDTH * mDisplayMetrics.density + 0.5f));
+ int y = mHeight - 16 * pxPerMs;
mGlCanvas.drawLine(0.0f, y, x, y, mProfilePaint);
mProfilePaint.setStrokeWidth(1.0f);
}
- private void initProfileDrawData() {
+ private void initProfileDrawData(View.AttachInfo attachInfo) {
if (mProfileRects == null) {
mProfileRects = new float[PROFILE_FRAME_DATA_COUNT][];
for (int i = 0; i < mProfileRects.length; i++) {
@@ -1663,6 +1671,11 @@
}
mProfilePaint = new Paint();
}
+
+ if (mDisplayMetrics == null) {
+ mDisplayMetrics = new DisplayMetrics();
+ }
+ attachInfo.mDisplay.getMetrics(mDisplayMetrics);
}
@Override
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 47ef638..9377cfa 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -401,61 +401,19 @@
public void rebootSafeMode(boolean confirm);
}
- /**
- * Bit mask that is set for all enter transition.
- */
- public final int TRANSIT_ENTER_MASK = 0x1000;
-
- /**
- * Bit mask that is set for all exit transitions.
- */
- public final int TRANSIT_EXIT_MASK = 0x2000;
-
- /** Not set up for a transition. */
- public final int TRANSIT_UNSET = -1;
- /** No animation for transition. */
- public final int TRANSIT_NONE = 0;
/** Window has been added to the screen. */
- public final int TRANSIT_ENTER = 1 | TRANSIT_ENTER_MASK;
+ public static final int TRANSIT_ENTER = 1;
/** Window has been removed from the screen. */
- public final int TRANSIT_EXIT = 2 | TRANSIT_EXIT_MASK;
+ public static final int TRANSIT_EXIT = 2;
/** Window has been made visible. */
- public final int TRANSIT_SHOW = 3 | TRANSIT_ENTER_MASK;
- /** Window has been made invisible. */
- public final int TRANSIT_HIDE = 4 | TRANSIT_EXIT_MASK;
+ public static final int TRANSIT_SHOW = 3;
+ /** Window has been made invisible.
+ * TODO: Consider removal as this is unused. */
+ public static final int TRANSIT_HIDE = 4;
/** The "application starting" preview window is no longer needed, and will
* animate away to show the real window. */
- public final int TRANSIT_PREVIEW_DONE = 5;
- /** A window in a new activity is being opened on top of an existing one
- * in the same task. */
- public final int TRANSIT_ACTIVITY_OPEN = 6 | TRANSIT_ENTER_MASK;
- /** The window in the top-most activity is being closed to reveal the
- * previous activity in the same task. */
- public final int TRANSIT_ACTIVITY_CLOSE = 7 | TRANSIT_EXIT_MASK;
- /** A window in a new task is being opened on top of an existing one
- * in another activity's task. */
- public final int TRANSIT_TASK_OPEN = 8 | TRANSIT_ENTER_MASK;
- /** A window in the top-most activity is being closed to reveal the
- * previous activity in a different task. */
- public final int TRANSIT_TASK_CLOSE = 9 | TRANSIT_EXIT_MASK;
- /** A window in an existing task is being displayed on top of an existing one
- * in another activity's task. */
- public final int TRANSIT_TASK_TO_FRONT = 10 | TRANSIT_ENTER_MASK;
- /** A window in an existing task is being put below all other tasks. */
- public final int TRANSIT_TASK_TO_BACK = 11 | TRANSIT_EXIT_MASK;
- /** A window in a new activity that doesn't have a wallpaper is being
- * opened on top of one that does, effectively closing the wallpaper. */
- public final int TRANSIT_WALLPAPER_CLOSE = 12 | TRANSIT_EXIT_MASK;
- /** A window in a new activity that does have a wallpaper is being
- * opened on one that didn't, effectively opening the wallpaper. */
- public final int TRANSIT_WALLPAPER_OPEN = 13 | TRANSIT_ENTER_MASK;
- /** A window in a new activity is being opened on top of an existing one,
- * and both are on top of the wallpaper. */
- public final int TRANSIT_WALLPAPER_INTRA_OPEN = 14 | TRANSIT_ENTER_MASK;
- /** The window in the top-most activity is being closed to reveal the
- * previous activity, and both are on top of he wallpaper. */
- public final int TRANSIT_WALLPAPER_INTRA_CLOSE = 15 | TRANSIT_EXIT_MASK;
-
+ public static final int TRANSIT_PREVIEW_DONE = 5;
+
// NOTE: screen off reasons are in order of significance, with more
// important ones lower than less important ones.
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 114ec42..728bcd3 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -594,18 +594,25 @@
}
/**
- * Tells the WebView to use a wide viewport. The default is false.
+ * Sets whether the WebView should enable support for the "viewport"
+ * HTML meta tag or should use a wide viewport.
+ * When the value of the setting is false, the layout width is always set to the
+ * width of the WebView control in device-independent (CSS) pixels.
+ * When the value is true and the page contains the viewport meta tag, the value
+ * of the width specified in the tag is used. If the page does not contain the tag or
+ * does not provide a width, then a wide viewport will be used.
*
- * @param use whether to use a wide viewport
+ * @param use whether to enable support for the viewport meta tag
*/
public synchronized void setUseWideViewPort(boolean use) {
throw new MustOverrideException();
}
/**
- * Gets whether the WebView is using a wide viewport.
+ * Gets whether the WebView supports the "viewport"
+ * HTML meta tag or will use a wide viewport.
*
- * @return true if the WebView is using a wide viewport
+ * @return true if the WebView supports the viewport meta tag
* @see #setUseWideViewPort
*/
public synchronized boolean getUseWideViewPort() {
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 73031e0..ddf2863 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -246,7 +246,7 @@
<string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"skicka SMS utan bekräftelse"</string>
<string name="permdesc_sendSmsNoConfirmation" msgid="402569800862935907">"Tillåter att appen skickar SMS. Detta kan leda till oväntade avgifter. Skadliga appar kan skicka meddelanden utan ditt godkännande vilket kan kosta pengar."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"läsa dina textmeddelanden (SMS eller MMS)"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tillåter att appen läser SMS som sparats på pekdatorn eller på SIM-kortet. Med den här behörigheten tillåts appen att läsa alla SMS oavsett innehåll eller sekretess."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Tillåter att appen läser SMS som sparats på surfplattan eller på SIM-kortet. Med den här behörigheten tillåts appen att läsa alla SMS oavsett innehåll eller sekretess."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Tillåter att appen läser SMS som sparats på mobilen eller på SIM-kortet. Med den här behörigheten tillåts appen att läsa alla SMS oavsett innehåll eller sekretess."</string>
<string name="permlab_writeSms" msgid="3216950472636214774">"redigera dina textmeddelanden (SMS eller MMS)"</string>
<string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Tillåter att appen skriver till SMS som lagras på surfplattan eller SIM-kortet. Skadliga appar kan radera dina meddelanden."</string>
@@ -330,7 +330,7 @@
<string name="permlab_freezeScreen" msgid="4708181184441880175">"frysa skärmen"</string>
<string name="permdesc_freezeScreen" msgid="8558923789222670064">"Tillåter att appen tillfälligt fryser skärmen för övergång till helskärm."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"trycka på knappar och styrknappar"</string>
- <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Tillåter att appen levererar egna inmatningshändelser (knapptryckningar osv.) till andra appar. Skadliga appar kan använda detta för att kapa pekdatorn."</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Tillåter att appen levererar egna inmatningshändelser (knapptryckningar osv.) till andra appar. Skadliga appar kan använda detta för att kapa surfplattan."</string>
<string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Tillåter att appen levererar egna inmatningshändelser (knapptryckningar osv.) till andra appar. Skadliga appar kan använda detta för att kapa mobilen."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"registrera vad du skriver och vilka åtgärder du vidtar"</string>
<string name="permdesc_readInputState" msgid="8387754901688728043">"Tillåter att appen övervakar knapparna som du trycker på, till och med när du använder andra appar (till exempel när du anger ett lösenord). Ska inte behövas för vanliga appar."</string>
@@ -357,7 +357,7 @@
<string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"skicka Linux-signaler till appar"</string>
<string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Tillåter att appen begär att den angivna signalen skickas till alla beständiga processer."</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"se till att appen alltid körs"</string>
- <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tillåter att delar av appen läggs beständigt i minnet. Detta kan innebära att det tillgängliga minnet för andra appar begränsas, vilket gör pekdatorn långsam."</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tillåter att delar av appen läggs beständigt i minnet. Detta kan innebära att det tillgängliga minnet för andra appar begränsas, vilket gör surfplattan långsam."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Tillåter att delar av appen läggs beständigt i minnet. Detta kan innebära att det tillgängliga minnet för andra appar begränsas, vilket gör mobilen långsam."</string>
<string name="permlab_deletePackages" msgid="184385129537705938">"ta bort appar"</string>
<string name="permdesc_deletePackages" msgid="7411480275167205081">"Tillåter att appen tar bort Android-paket. Skadliga appar kan använda detta för att ta bort viktiga appar."</string>
@@ -375,15 +375,15 @@
<string name="permlab_movePackage" msgid="3289890271645921411">"flytta appresurser"</string>
<string name="permdesc_movePackage" msgid="319562217778244524">"Tillåter att appen flyttar appresurser från interna till externa medier och tvärtom."</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"läsa känsliga loggdata"</string>
- <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Tillåter att appen läser från systemets olika loggfiler. Det innebär att appen kan upptäcka allmän information om vad du gör med pekdatorn, vilket kan inkludera personlig eller privat information."</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Tillåter att appen läser från systemets olika loggfiler. Det innebär att appen kan upptäcka allmän information om vad du gör med surfplattan, vilket kan inkludera personlig eller privat information."</string>
<string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Tillåter att appen läser från systemets olika loggfiler. Det innebär att appen kan upptäcka allmän information om vad du gör med mobilen, vilket kan inkludera personlig eller privat information."</string>
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"använda alla medieavkodare för uppspelning"</string>
<string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Tillåter att appen använder installerade medieavkodare för att avkoda media för uppspelning."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"läsa/skriva till resurser som ägs av diag"</string>
<string name="permdesc_diagnostic" msgid="6608295692002452283">"Tillåter att appen läser och skriver till en resurs som ägs av diag-gruppen, till exempel filer i /dev. Detta kan eventuellt påverka systemets stabilitet och säkerhet. Detta bör ENDAST användas av tillverkaren eller operatören för maskinvaruspecifik diagnostik."</string>
<string name="permlab_changeComponentState" msgid="6335576775711095931">"aktivera eller inaktivera appkomponenter"</string>
- <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Tillåter att appen ändrar inställningen för om en komponent i en annan app ska aktiveras eller inte. Skadliga appar kan använda detta för att inaktivera viktiga funktioner i pekdatorn. Var försiktig med behörigheten, eftersom appkomponenter kan bli oanvändbara, inkonsekventa eller instabila."</string>
- <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Tillåter att appen ändrar inställningen för om en komponent i en annan app ska aktiveras eller inte. Skadliga appar kan använda detta för att inaktivera viktiga funktioner i pekdatorn. Var försiktig med behörigheten, eftersom programkomponenter kan bli oanvändbara, inkonsekventa eller instabila."</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Tillåter att appen ändrar inställningen för om en komponent i en annan app ska aktiveras eller inte. Skadliga appar kan använda detta för att inaktivera viktiga funktioner i surfplattan. Var försiktig med behörigheten, eftersom appkomponenter kan bli oanvändbara, inkonsekventa eller instabila."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Tillåter att appen ändrar inställningen för om en komponent i en annan app ska aktiveras eller inte. Skadliga appar kan använda detta för att inaktivera viktiga funktioner i surfplattan. Var försiktig med behörigheten, eftersom programkomponenter kan bli oanvändbara, inkonsekventa eller instabila."</string>
<string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"bevilja eller återkalla behörighet"</string>
<string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Tillåter att en app beviljar eller återkallar specifik behörighet, för sig själv eller andra appar. Skadlig programvara kan utnyttja detta för att få åtkomst till funktioner som du inte har beviljat behörighet till."</string>
<string name="permlab_setPreferredApplications" msgid="8463181628695396391">"ange önskade appar"</string>
@@ -401,10 +401,10 @@
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Tillåter att appen skickar sticky broadcasts, som finns kvar när sändningen är slut. Vid intensiv användning kan mobilen bli långsam eller instabil eftersom minnet överbelastas."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Tillåter att appen skickar sticky broadcast, som finns kvar när sändningen är slut. Vid intensiv användning kan mobilen bli långsam eller instabil eftersom minnet överbelastas."</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"läsa dina kontakter"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tillåter att appen läser kontaktuppgifter som sparats på pekdatorn, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. Med den här behörigheten tillåts appen att spara kontaktuppgifter. Skadliga appar kan dela uppgifterna med andra utan din vetskap."</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tillåter att appen läser kontaktuppgifter som sparats på surfplattan, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. Med den här behörigheten tillåts appen att spara kontaktuppgifter. Skadliga appar kan dela uppgifterna med andra utan din vetskap."</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tillåter att appen läser kontaktuppgifter som sparats på mobilen, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. Med den här behörigheten tillåts appen att spara kontaktuppgifter. Skadliga appar kan dela uppgifterna med andra utan din vetskap."</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"ändra kontakterna"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tillåter att appen ändrar kontaktuppgifter som sparats på pekdatorn, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. Med den här behörigheten tillåts appar att ta bort kontaktuppgifter."</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tillåter att appen ändrar kontaktuppgifter som sparats på surfplattan, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. Med den här behörigheten tillåts appar att ta bort kontaktuppgifter."</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tillåter att appen ändrar kontaktuppgifter som sparats på mobilen, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. Med den här behörigheten tillåts appar att ta bort kontaktuppgifter."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"läs samtalslogg"</string>
<string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Tillåter att appen läser pekdatorns samtalslista, inklusive uppgifter om inkommande och utgående samtal. Med den här behörigheten tillåts appen att spara samtalshistoriken. Skadliga appar kan dela uppgifterna med andra utan din vetskap."</string>
@@ -421,10 +421,10 @@
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"skriv till mitt sociala flöde"</string>
<string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Tillåter att appen visar sociala uppdateringar från dina vänner. Var försiktig när du delar information – med den här behörigheten tillåts appen att generera meddelanden som kan se ut att komma från en vän. Observera att den här behörigheten kanske inte är tillämplig på alla sociala nätverk."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"läsa kalenderuppgifter plus konfidentiell information"</string>
- <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Tillåter att appen läser alla kalenderuppgifter som sparats på pekdatorn, inklusive dina vänners eller kollegors uppgifter. Med den här behörigheten kan appen tillåtas att dela eller spara kalenderuppgifter även om de är sekretessbelagda eller känsliga."</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Tillåter att appen läser alla kalenderuppgifter som sparats på surfplattan, inklusive dina vänners eller kollegors uppgifter. Med den här behörigheten kan appen tillåtas att dela eller spara kalenderuppgifter även om de är sekretessbelagda eller känsliga."</string>
<string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Tillåter att appen läser alla kalenderuppgifter som sparats på mobilen, inklusive dina vänners eller kollegors uppgifter. Med den här behörigheten kan appen tillåtas att dela eller spara kalenderuppgifter även om de är sekretessbelagda eller känsliga."</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"lägga till eller ändra kalenderuppgifter och skicka e-post till gäster utan ägarens vetskap"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Tillåter att appen lägger till, tar bort och ändrar sådana händelser som du kan ändra på pekdatorn, inklusive dina vänners eller kollegors uppgifter. Detta kan innebära att appen tillåts skicka meddelanden som ser ut att komma från kalenderns ägare eller ändra händelser utan ägarens vetskap."</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Tillåter att appen lägger till, tar bort och ändrar sådana händelser som du kan ändra på surfplattan, inklusive dina vänners eller kollegors uppgifter. Detta kan innebära att appen tillåts skicka meddelanden som ser ut att komma från kalenderns ägare eller ändra händelser utan ägarens vetskap."</string>
<string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Tillåter att appen lägger till, tar bort och ändrar sådana händelser som du kan ändra på mobilen, inklusive dina vänners eller kollegors uppgifter. Detta kan innebära att appen tillåts skicka meddelanden som ser ut att komma från kalenderns ägare eller ändra händelser utan ägarens vetskap."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"skenplatser för att testa"</string>
<string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Skapa skenplatser för tester eller installera en ny platsleverantör. Detta innebär att appen tillåts åsidosätta den plats och/eller status som returneras av andra platskällor, till exempel GPS eller platsleverantörer."</string>
@@ -452,7 +452,7 @@
<string name="permdesc_camera" msgid="8497216524735535009">"Tillåter att appen tar bilder och spelar in videor med kameran. Med den här behörigheten tillåts appen att använda kameran när som helst utan ditt godkännande."</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"inaktivera surfplattan permanent"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"inaktivera telefonen permanent"</string>
- <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tillåter att appen inaktiverar hela pekdatorn permanent. Detta är mycket farligt."</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tillåter att appen inaktiverar hela surfplattan permanent. Detta är mycket farligt."</string>
<string name="permdesc_brick" product="default" msgid="5788903297627283099">"Tillåter att appen inaktiverar hela mobilen permanent. Detta är mycket farligt."</string>
<string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"tvinga omstart av surfplatta"</string>
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"tvinga omstart av telefon"</string>
@@ -503,7 +503,7 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Tillåter att appen kommer åt enhetens telefonfunktioner. Med den här behörigheten tillåts appen att identifiera mobilens telefonnummer och enhets-ID, om ett samtal pågår och vilket nummer samtalet är kopplat till."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"förhindra att surfplattan går in i viloläge"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"förhindra att telefonen sätts i viloläge"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Tillåter att appen förhindrar att pekdatorn går in i viloläge."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Tillåter att appen förhindrar att surfplattan går in i viloläge."</string>
<string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Tillåter att appen förhindrar att mobilen går in i viloläge."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"slå på eller stänga av surfplattan"</string>
<string name="permlab_devicePower" product="default" msgid="4928622470980943206">"sätta på eller stänga av telefonen"</string>
@@ -527,7 +527,7 @@
<string name="permlab_accountManagerService" msgid="4829262349691386986">"fungera som AccountManagerService"</string>
<string name="permdesc_accountManagerService" msgid="1948455552333615954">"Tillåter att appen anropar AccountAuthenticators."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"hitta konton på enheten"</string>
- <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Tillåter att appen hämtar en lista över alla kända konton på pekdatorn. Detta kan inkludera konton som har skapats av appar som du har installerat."</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Tillåter att appen hämtar en lista över alla kända konton på surfplattan. Detta kan inkludera konton som har skapats av appar som du har installerat."</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Tillåter att appen hämtar en lista över alla kända konton på mobilen. Detta kan inkludera konton som har skapats av appar som du har installerat."</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"skapa konton och ange lösenord"</string>
<string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Tillåter att appen använder AccountManagers kontoautentiseringsfunktioner, bland annat funktioner för att skapa konton samt hämta och ange lösenord för dem."</string>
@@ -552,15 +552,15 @@
<string name="permlab_changeWifiState" msgid="6550641188749128035">"anslut och koppla från Wi-Fi"</string>
<string name="permdesc_changeWifiState" msgid="7137950297386127533">"Tillåter att appen ansluter till och kopplar från Wi-Fi-åtkomstpunkter samt gör ändringar i enhetens konfiguration för Wi-Fi-nätverk."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"tillåt Wi-Fi multicast-mottagning"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Tillåter att appen tar emot paket som skickats med multicast-adress till alla enheter i ett Wi-Fi-nätverk och inte bara till den här pekdatorn. Detta drar mer batteri än när multicastläget inte används."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Tillåter att appen tar emot paket som skickats med multicast-adress till alla enheter i ett Wi-Fi-nätverk och inte bara till den här surfplattan. Detta drar mer batteri än när multicastläget inte används."</string>
<string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Tillåter att appen tar emot paket som skickats med multicast-adress till alla enheter i ett Wi-Fi-nätverk och inte bara till den här mobilen. Detta drar mer batteri än när multicastläget inte används."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"få åtkomst till Bluetooth-inställningar"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tillåter att appen konfigurerar den lokala Bluetooth-pekdatorn samt upptäcker och parkopplar den med fjärranslutna enheter."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tillåter att appen konfigurerar den lokala Bluetooth-surfplattan samt upptäcker och parkopplar den med fjärranslutna enheter."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Tillåter att appen konfigurerar den lokala Bluetooth-mobilen samt upptäcker och parkopplar den med fjärranslutna enheter."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"ansluta till och koppla från WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Tillåter att appen avgör om WiMAX är aktiverat och kommer åt information om eventuella anslutna WiMAX-nätverk."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"ändra WiMAX-status"</string>
- <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Tillåter att appen ansluter pekdatorn till eller kopplar från WiMAX-nätverk."</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Tillåter att appen ansluter surfplattan till eller kopplar från WiMAX-nätverk."</string>
<string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Tillåter att appen ansluter mobilen till eller kopplar från WiMAX-nätverk."</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"koppla till Bluetooth-enheter"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Tillåter att appen kommer åt pekdatorns Bluetooth-konfiguration och upprättar och godkänner anslutningar till parkopplade enheter."</string>
@@ -615,7 +615,7 @@
<string name="policylab_forceLock" msgid="2274085384704248431">"Lås skärmen"</string>
<string name="policydesc_forceLock" msgid="1141797588403827138">"Kontrollera hur och när skärmlåset aktiveras."</string>
<string name="policylab_wipeData" msgid="3910545446758639713">"Radera alla data"</string>
- <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Ta bort data från pekdatorn utan förvarning genom att återställa standardinställningarna."</string>
+ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Ta bort data från surfplattan utan förvarning genom att återställa standardinställningarna."</string>
<string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Ta bort data från mobilen utan förvarning genom att återställa standardinställningarna."</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Ange global proxyserver"</string>
<string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Ange vilken global proxyserver som ska användas när policyn är aktiverad. Endast den första enhetsadministratören anger den faktiska globala proxyservern."</string>
@@ -786,7 +786,7 @@
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. "\n\n"Försök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Du har angett fel lösenord <xliff:g id="NUMBER_0">%d</xliff:g> gånger. "\n\n"Försök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
<string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Du har angett fel lösenord <xliff:g id="NUMBER_0">%d</xliff:g> gånger. "\n\n"Försök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter <xliff:g id="NUMBER_1">%d</xliff:g> försök till ombeds du att låsa upp pekdatorn med din Google-inloggning."\n\n" Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter <xliff:g id="NUMBER_1">%d</xliff:g> försök till ombeds du att låsa upp surfplattan med din Google-inloggning."\n\n" Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter <xliff:g id="NUMBER_1">%d</xliff:g> försök till ombeds du att låsa upp mobilen med uppgifterna som du använder när du loggar in på Google."\n\n" Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Du har försökt låsa upp surfplattan på fel sätt <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter <xliff:g id="NUMBER_1">%d</xliff:g> misslyckade försök till kommer surfplattan att återställas till fabriksinställningarna. Du förlorar då alla användardata."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Du har försökt låsa upp mobilen på fel sätt <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter <xliff:g id="NUMBER_1">%d</xliff:g> misslyckade försök till kommer mobilen att återställas till fabriksinställningarna. Du förlorar då alla användardata."</string>
@@ -870,7 +870,7 @@
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"läsa dina bokmärken och din historik på webben"</string>
<string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Tillåter att appen läser historiken för besökta sidor och alla bokmärken i webbläsaren. Observera att den här behörigheten kanske inte är tillämplig för webbläsare från tredje part eller andra appar med surffunktion."</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"skriva bokmärken och historik på webben"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Tillåter att appen ändrar historiken för besökta sidor i webbläsaren eller bokmärken som sparats på pekdatorn. Det kan innebära att appen kan ta bort eller ändra webbläsarinformation. Observera att den här behörigheten kanske inte är tillämplig för webbläsare från tredje part eller andra appar med surffunktion."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Tillåter att appen ändrar historiken för besökta sidor i webbläsaren eller bokmärken som sparats på surfplattan. Det kan innebära att appen kan ta bort eller ändra webbläsarinformation. Observera att den här behörigheten kanske inte är tillämplig för webbläsare från tredje part eller andra appar med surffunktion."</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Tillåter att appen ändrar historiken för besökta sidor i webbläsaren eller bokmärken som sparats på telefonen. Det kan innebära att appen kan ta bort eller ändra webbläsarinformation. Observera att den här behörigheten kanske inte är tillämplig för webbläsare från tredje part eller andra appar med surffunktion."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"ställa in ett alarm"</string>
<string name="permdesc_setAlarm" msgid="316392039157473848">"Tillåter att appen ställer in ett alarm i en befintlig alarmapp. Vissa alarmappar har inte den här funktionen."</string>
@@ -906,7 +906,7 @@
<string name="searchview_description_submit" msgid="2688450133297983542">"Skicka fråga"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Röstsökning"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Aktivera Explore by Touch?"</string>
- <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vill aktivera Explore by Touch. När funktionen är aktiv kan du höra eller se beskrivningar av vad du har under fingret eller utföra gester för att göra saker med pekdatorn."</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vill aktivera Explore by Touch. När funktionen är aktiv kan du höra eller se beskrivningar av vad du har under fingret eller utföra gester för att göra saker med surfplattan."</string>
<string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vill aktivera Explore by Touch. När funktionen är aktiv kan du höra eller se beskrivningar av vad du har under fingret eller utföra gester för att göra saker med telefonen."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"för 1 månad sedan"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"För mer än en månad sedan"</string>
diff --git a/docs/html/design/patterns/notifications.jd b/docs/html/design/patterns/notifications.jd
index 1a15a64..0665774 100644
--- a/docs/html/design/patterns/notifications.jd
+++ b/docs/html/design/patterns/notifications.jd
@@ -153,8 +153,13 @@
<p>To create an app that feels streamlined, pleasant, and respectful, it is important to design your notifications carefully. Notifications embody your app's voice, and contribute to your app's personality. Unwanted or unimportant notifications can annoy the user, so use them judiciously.</p>
<h4>When to display a notification</h4>
-<p>To create an application that people love, it's important to recognize that the user's attention and focus is a resource that must be protected. While Android's notification system has been designed to minimize the impact of notifications on the users attention, it is nonetheless still important to be aware of the fact that notifications are potentially interrupting the users task flow. As you plan your notifications, ask yourself if they are important enough to warrant an interruption. If you are unsure, allow the user to opt into a notification using your apps notification settings or adjust the notifications priority flag.</p>
-<p>Time sensitive events are great opportunities for valuable notifications with high priority, especially if these synchronous events involve other people. For instance, an incoming chat is a real time and synchronous form of communication: there is another user actively waiting on you to respond. Calendar events are another good example of when to use a notification and grab the user's attention, because the event is imminent, and calendar events often involve other people.</p>
+<p>To create an application that people love, it's important to recognize that the user's attention and
+focus is a resource that must be protected. While Android's notification system has been designed
+to minimize the impact of notifications on the users attention, it is nonetheless still important
+to be aware of the fact that notifications are potentially interrupting the users task flow. As you
+plan your notifications, ask yourself if they are important enough to warrant an interruption. If
+you are unsure, allow the user to opt into a notification using your apps notification settings or
+adjust the notifications priority flag.</p>
<p>While well behaved apps generally only speak when spoken to, there are some limited cases where an
app actually should interrupt the user with an unprompted notification.</p>
<p>Notifications should be used primarily for <strong>time sensitive events</strong>, and especially if these
diff --git a/docs/html/google/play/billing/billing_integrate.jd b/docs/html/google/play/billing/billing_integrate.jd
index 554866d..405c58a 100644
--- a/docs/html/google/play/billing/billing_integrate.jd
+++ b/docs/html/google/play/billing/billing_integrate.jd
@@ -128,7 +128,9 @@
}
</pre>
-<p>For a complete implementation of a service connection that binds to the {@code IInAppBillingService}, see the <a href="{@docRoot}/training/in-app-billing/preparing-iab-app.html#Connect">Selling In-app Products</a> training class.</p>
+<p>For a complete implementation of a service connection that binds to the {@code IInAppBillingService},
+see the <a href="{@docRoot}training/in-app-billing/preparing-iab-app.html">Selling In-app
+Products</a> training class and associated sample.</p>
<h2 id="billing-requests">Making In-app Billing Requests</h2>
<p>Once your application is connected to Google Play, you can initiate purchase requests for in-app products. Google Play provides a checkout interface for users to enter their payment method, so your application does not need to handle payment transactions directly. When an item is purchased, Google Play recognizes that the user has ownership of that item and prevents the user from purchasing another item with the same product ID until it is consumed. You can control how the item is consumed in your application, and notify Google Play to make the item available for purchase again. You can also query Google Play to quickly retrieve the list of purchases that were made by the user. This is useful, for example, when you want to restore the user's purchases when your user launches your app.
diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd
index c25dff8..3d6f18b 100644
--- a/docs/html/guide/topics/manifest/uses-feature-element.jd
+++ b/docs/html/guide/topics/manifest/uses-feature-element.jd
@@ -708,9 +708,9 @@
<td>Television</td>
<td><code>android.hardware.type.television</code></td>
<td>The application is designed for a television user experience.</td>
- <td>>This feature defines "television" to be a typical living room television experience:
+ <td>This feature defines "television" to be a typical living room television experience:
displayed on a big screen, where the user is sitting far away and the dominant form of
- input is be something like a d-pad, and generally not through touch or a
+ input is something like a d-pad, and generally not through touch or a
mouse/pointer-device.</td>
</tr>
diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd
index 77cce18..e70987b 100644
--- a/docs/html/guide/topics/ui/notifiers/notifications.jd
+++ b/docs/html/guide/topics/ui/notifiers/notifications.jd
@@ -921,7 +921,7 @@
</p>
<pre>
// Sets an activity indicator for an operation of indeterminate length
-mBuilder.setProgress(0, 0, false);
+mBuilder.setProgress(0, 0, true);
// Issues the notification
mNotifyManager.notify(0, mBuilder.build());
</pre>
diff --git a/docs/html/guide/webapps/webview.jd b/docs/html/guide/webapps/webview.jd
index ce7fe27..f8b2a1d 100644
--- a/docs/html/guide/webapps/webview.jd
+++ b/docs/html/guide/webapps/webview.jd
@@ -314,7 +314,7 @@
@Override
public boolean {@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown}(int keyCode, KeyEvent event) {
// Check if the key event was the Back button and if there's history
- if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.{@link android.webkit.WebView#canGoBack() canGoBack}() {
+ if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.{@link android.webkit.WebView#canGoBack() canGoBack}()) {
myWebView.{@link android.webkit.WebView#goBack() goBack}();
return true;
}
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 82627c0..bfb0931 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -77,6 +77,7 @@
<bool name="def_lockscreen_disabled">false</bool>
<bool name="def_device_provisioned">false</bool>
+ <integer name="def_dock_audio_media_enabled">1</integer>
<!-- Notifications use ringer volume -->
<bool name="def_notifications_use_ring_volume">true</bool>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index fd0b79ff..cccce9d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2210,6 +2210,9 @@
loadStringSetting(stmt, Settings.Global.WIRELESS_CHARGING_STARTED_SOUND,
R.string.def_wireless_charging_started_sound);
+ loadIntegerSetting(stmt, Settings.Global.DOCK_AUDIO_MEDIA_ENABLED,
+ R.integer.def_dock_audio_media_enabled);
+
loadSetting(stmt, Settings.Global.SET_INSTALL_LOCATION, 0);
loadSetting(stmt, Settings.Global.DEFAULT_INSTALL_LOCATION,
PackageHelper.APP_INSTALL_AUTO);
diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk
index 6026258..262000e 100644
--- a/packages/SystemUI/Android.mk
+++ b/packages/SystemUI/Android.mk
@@ -4,7 +4,8 @@
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
- ../../../ex/carousel/java/com/android/ex/carousel/carousel.rs
+ ../../../ex/carousel/java/com/android/ex/carousel/carousel.rs \
+ src/com/android/systemui/EventLogTags.logtags
LOCAL_JAVA_LIBRARIES := services telephony-common
diff --git a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
new file mode 100644
index 0000000..aa32e9c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
@@ -0,0 +1,33 @@
+# See system/core/logcat/event.logtags for a description of the format of this file.
+
+option java_package com.android.systemui;
+
+# ---------------------------
+# PhoneStatusBar.java
+# ---------------------------
+36000 sysui_statusbar_touch (type|1),(x|1),(y|1),(enabled|1)
+
+# ---------------------------
+# PhoneStatusBarView.java
+# ---------------------------
+36010 sysui_panelbar_touch (type|1),(x|1),(y|1),(enabled|1)
+
+# ---------------------------
+# NotificationPanelView.java
+# ---------------------------
+36020 sysui_notificationpanel_touch (type|1),(x|1),(y|1)
+
+# ---------------------------
+# SettingsPanelView.java
+# ---------------------------
+36030 sysui_quickpanel_touch (type|1),(x|1),(y|1)
+
+# ---------------------------
+# PanelHolder.java
+# ---------------------------
+36040 sysui_panelholder_touch (type|1),(x|1),(y|1)
+
+# ---------------------------
+# SearchPanelView.java
+# ---------------------------
+36050 sysui_searchpanel_touch (type|1),(x|1),(y|1)
diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
index daac9ed..c0a6f56 100644
--- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
@@ -31,6 +31,7 @@
import android.os.Vibrator;
import android.provider.Settings;
import android.util.AttributeSet;
+import android.util.EventLog;
import android.util.Slog;
import android.view.IWindowManager;
import android.view.MotionEvent;
@@ -42,6 +43,8 @@
import com.android.internal.widget.multiwaveview.GlowPadView;
import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
+
+import com.android.systemui.EventLogTags;
import com.android.systemui.R;
import com.android.systemui.recent.StatusBarTouchProxy;
import com.android.systemui.statusbar.BaseStatusBar;
@@ -55,6 +58,7 @@
private static final int SEARCH_PANEL_HOLD_DURATION = 0;
static final String TAG = "SearchPanelView";
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
+ public static final boolean DEBUG_GESTURES = true;
private static final String ASSIST_ICON_METADATA_NAME =
"com.android.systemui.action_assist_icon";
private final Context mContext;
@@ -304,6 +308,17 @@
}
}
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (DEBUG_GESTURES) {
+ if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
+ EventLog.writeEvent(EventLogTags.SYSUI_SEARCHPANEL_TOUCH,
+ event.getActionMasked(), (int) event.getX(), (int) event.getY());
+ }
+ }
+ return super.onTouchEvent(event);
+ }
+
private LayoutTransition createLayoutTransitioner() {
LayoutTransition transitioner = new LayoutTransition();
transitioner.setDuration(200);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 2bad353..ff364853 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -21,14 +21,17 @@
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
+import android.util.EventLog;
import android.util.Slog;
import android.view.MotionEvent;
import android.view.View;
+import com.android.systemui.EventLogTags;
import com.android.systemui.R;
import com.android.systemui.statusbar.GestureRecorder;
public class NotificationPanelView extends PanelView {
+ public static final boolean DEBUG_GESTURES = true;
Drawable mHandleBar;
int mHandleBarHeight;
@@ -91,6 +94,12 @@
@Override
public boolean onTouchEvent(MotionEvent event) {
+ if (DEBUG_GESTURES) {
+ if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
+ EventLog.writeEvent(EventLogTags.SYSUI_NOTIFICATIONPANEL_TOUCH,
+ event.getActionMasked(), (int) event.getX(), (int) event.getY());
+ }
+ }
if (PhoneStatusBar.SETTINGS_DRAG_SHORTCUT && mStatusBar.mHasFlipSettings) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelHolder.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelHolder.java
index 8a54347..c229a09 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelHolder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelHolder.java
@@ -18,10 +18,14 @@
import android.content.Context;
import android.util.AttributeSet;
+import android.util.EventLog;
import android.view.MotionEvent;
import android.widget.FrameLayout;
+import com.android.systemui.EventLogTags;
+
public class PanelHolder extends FrameLayout {
+ public static final boolean DEBUG_GESTURES = true;
private int mSelectedPanelIndex = -1;
private PanelBar mBar;
@@ -67,6 +71,12 @@
@Override
public boolean onTouchEvent(MotionEvent event) {
+ if (DEBUG_GESTURES) {
+ if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
+ EventLog.writeEvent(EventLogTags.SYSUI_PANELHOLDER_TOUCH,
+ event.getActionMasked(), (int) event.getX(), (int) event.getY());
+ }
+ }
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
PanelBar.LOG("PanelHolder got touch in open air, closing panels");
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 fea1a05..a5d782e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -52,6 +52,7 @@
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
import android.util.DisplayMetrics;
+import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
import android.view.Display;
@@ -76,6 +77,7 @@
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarNotification;
+import com.android.systemui.EventLogTags;
import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.CommandQueue;
@@ -103,7 +105,7 @@
public static final boolean DEBUG = BaseStatusBar.DEBUG;
public static final boolean SPEW = DEBUG;
public static final boolean DUMPTRUCK = true; // extra dumpsys info
- public static final boolean DEBUG_GESTURES = false;
+ public static final boolean DEBUG_GESTURES = true;
public static final boolean DEBUG_CLINGS = false;
@@ -1775,6 +1777,14 @@
}
public boolean interceptTouchEvent(MotionEvent event) {
+ if (DEBUG_GESTURES) {
+ if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
+ EventLog.writeEvent(EventLogTags.SYSUI_STATUSBAR_TOUCH,
+ event.getActionMasked(), (int) event.getX(), (int) event.getY(), mDisabled);
+ }
+
+ }
+
if (SPEW) {
Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled="
+ mDisabled + " mTracking=" + mTracking);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 571544b..de9f750 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -22,15 +22,19 @@
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
import android.util.AttributeSet;
+import android.util.EventLog;
import android.util.Slog;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
+
+import com.android.systemui.EventLogTags;
import com.android.systemui.R;
public class PhoneStatusBarView extends PanelBar {
private static final String TAG = "PhoneStatusBarView";
private static final boolean DEBUG = PhoneStatusBar.DEBUG;
+ private static final boolean DEBUG_GESTURES = true;
PhoneStatusBar mBar;
int mScrimColor;
@@ -175,7 +179,17 @@
@Override
public boolean onTouchEvent(MotionEvent event) {
- return mBar.interceptTouchEvent(event) || super.onTouchEvent(event);
+ boolean barConsumedEvent = mBar.interceptTouchEvent(event);
+
+ if (DEBUG_GESTURES) {
+ if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
+ EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH,
+ event.getActionMasked(), (int) event.getX(), (int) event.getY(),
+ barConsumedEvent ? 1 : 0);
+ }
+ }
+
+ return barConsumedEvent || super.onTouchEvent(event);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java
index bbb8455..2314d93 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java
@@ -23,10 +23,13 @@
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
+import android.util.EventLog;
import android.view.LayoutInflater;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
+import com.android.systemui.EventLogTags;
import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.GestureRecorder;
@@ -36,6 +39,7 @@
import com.android.systemui.statusbar.policy.NetworkController;
public class SettingsPanelView extends PanelView {
+ public static final boolean DEBUG_GESTURES = true;
private QuickSettings mQS;
private QuickSettingsContainerView mQSContainer;
@@ -136,4 +140,15 @@
mHandleBar.draw(canvas);
canvas.translate(0, -off);
}
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (DEBUG_GESTURES) {
+ if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
+ EventLog.writeEvent(EventLogTags.SYSUI_QUICKPANEL_TOUCH,
+ event.getActionMasked(), (int) event.getX(), (int) event.getY());
+ }
+ }
+ return super.onTouchEvent(event);
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 5bf7e21..dfc9044 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -1711,31 +1711,40 @@
static final boolean PRINT_ANIM = false;
/** {@inheritDoc} */
+ @Override
public int selectAnimationLw(WindowState win, int transit) {
if (PRINT_ANIM) Log.i(TAG, "selectAnimation in " + win
+ ": transit=" + transit);
if (win == mStatusBar) {
- if (transit == TRANSIT_EXIT || transit == TRANSIT_HIDE) {
+ if (transit == TRANSIT_EXIT
+ || transit == TRANSIT_HIDE) {
return R.anim.dock_top_exit;
- } else if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) {
+ } else if (transit == TRANSIT_ENTER
+ || transit == TRANSIT_SHOW) {
return R.anim.dock_top_enter;
}
} else if (win == mNavigationBar) {
// This can be on either the bottom or the right.
if (mNavigationBarOnBottom) {
- if (transit == TRANSIT_EXIT || transit == TRANSIT_HIDE) {
+ if (transit == TRANSIT_EXIT
+ || transit == TRANSIT_HIDE) {
return R.anim.dock_bottom_exit;
- } else if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) {
+ } else if (transit == TRANSIT_ENTER
+ || transit == TRANSIT_SHOW) {
return R.anim.dock_bottom_enter;
}
} else {
- if (transit == TRANSIT_EXIT || transit == TRANSIT_HIDE) {
+ if (transit == TRANSIT_EXIT
+ || transit == TRANSIT_HIDE) {
return R.anim.dock_right_exit;
- } else if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) {
+ } else if (transit == TRANSIT_ENTER
+ || transit == TRANSIT_SHOW) {
return R.anim.dock_right_enter;
}
}
- } if (transit == TRANSIT_PREVIEW_DONE) {
+ }
+
+ if (transit == TRANSIT_PREVIEW_DONE) {
if (win.hasAppShownWindows()) {
if (PRINT_ANIM) Log.i(TAG, "**** STARTING EXIT");
return com.android.internal.R.anim.app_starting_exit;
@@ -4568,71 +4577,6 @@
return true;
}
- /**
- * Returns the human readable name of a window transition.
- *
- * @param transition The window transition.
- * @return The transition symbolic name.
- */
- public static String windowTransitionToString(int transition) {
- switch (transition) {
- case WindowManagerPolicy.TRANSIT_UNSET: {
- return "TRANSIT_UNSET";
- }
- case WindowManagerPolicy.TRANSIT_NONE: {
- return "TRANSIT_NONE";
- }
- case WindowManagerPolicy.TRANSIT_ENTER: {
- return "TRANSIT_ENTER";
- }
- case WindowManagerPolicy.TRANSIT_EXIT: {
- return "TRANSIT_EXIT";
- }
- case WindowManagerPolicy.TRANSIT_SHOW: {
- return "TRANSIT_SHOW";
- }
- case WindowManagerPolicy.TRANSIT_EXIT_MASK: {
- return "TRANSIT_EXIT_MASK";
- }
- case WindowManagerPolicy.TRANSIT_PREVIEW_DONE: {
- return "TRANSIT_PREVIEW_DONE";
- }
- case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN: {
- return "TRANSIT_ACTIVITY_OPEN";
- }
- case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE: {
- return "TRANSIT_ACTIVITY_CLOSE";
- }
- case WindowManagerPolicy.TRANSIT_TASK_OPEN: {
- return "TRANSIT_TASK_OPEN";
- }
- case WindowManagerPolicy.TRANSIT_TASK_CLOSE: {
- return "TRANSIT_TASK_CLOSE";
- }
- case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT: {
- return "TRANSIT_TASK_TO_FRONT";
- }
- case WindowManagerPolicy.TRANSIT_TASK_TO_BACK: {
- return "TRANSIT_TASK_TO_BACK";
- }
- case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE: {
- return "TRANSIT_WALLPAPER_CLOSE";
- }
- case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN: {
- return "TRANSIT_WALLPAPER_OPEN";
- }
- case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN: {
- return "TRANSIT_WALLPAPER_INTRA_OPEN";
- }
- case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE: {
- return "TRANSIT_WALLPAPER_INTRA_CLOSE";
- }
- default: {
- return "<UNKNOWN>";
- }
- }
- }
-
@Override
public void dump(String prefix, PrintWriter pw, String[] args) {
pw.print(prefix); pw.print("mSafeMode="); pw.print(mSafeMode);
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 1cd370a..62af91e 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -28,6 +28,7 @@
import com.android.server.Watchdog;
import com.android.server.am.ActivityStack.ActivityState;
import com.android.server.pm.UserManagerService;
+import com.android.server.wm.AppTransition;
import com.android.server.wm.WindowManagerService;
import dalvik.system.Zygote;
@@ -130,7 +131,6 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
-import android.view.WindowManagerPolicy;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -1970,9 +1970,9 @@
boolean isNextTransitionForward() {
int transit = mWindowManager.getPendingAppTransition();
- return transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
- || transit == WindowManagerPolicy.TRANSIT_TASK_OPEN
- || transit == WindowManagerPolicy.TRANSIT_TASK_TO_FRONT;
+ return transit == AppTransition.TRANSIT_ACTIVITY_OPEN
+ || transit == AppTransition.TRANSIT_TASK_OPEN
+ || transit == AppTransition.TRANSIT_TASK_TO_FRONT;
}
final ProcessRecord startProcessLocked(String processName,
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 0e01e4c..c1b10cf 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -22,6 +22,7 @@
import com.android.internal.app.HeavyWeightSwitcherActivity;
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.am.ActivityManagerService.PendingActivityLaunch;
+import com.android.server.wm.AppTransition;
import android.app.Activity;
import android.app.ActivityManager;
@@ -61,7 +62,6 @@
import android.util.Log;
import android.util.Slog;
import android.view.Display;
-import android.view.WindowManagerPolicy;
import java.io.IOException;
import java.lang.ref.WeakReference;
@@ -423,8 +423,8 @@
}
}
}
- };
-
+ }
+
ActivityStack(ActivityManagerService service, Context context, boolean mainStack, Looper looper) {
mHandler = new ActivityStackHandler(looper);
mService = service;
@@ -1612,11 +1612,11 @@
"Prepare close transition: prev=" + prev);
if (mNoAnimActivities.contains(prev)) {
mService.mWindowManager.prepareAppTransition(
- WindowManagerPolicy.TRANSIT_NONE, false);
+ AppTransition.TRANSIT_NONE, false);
} else {
mService.mWindowManager.prepareAppTransition(prev.task == next.task
- ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE
- : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false);
+ ? AppTransition.TRANSIT_ACTIVITY_CLOSE
+ : AppTransition.TRANSIT_TASK_CLOSE, false);
}
mService.mWindowManager.setAppWillBeHidden(prev.appToken);
mService.mWindowManager.setAppVisibility(prev.appToken, false);
@@ -1626,11 +1626,11 @@
if (mNoAnimActivities.contains(next)) {
noAnim = true;
mService.mWindowManager.prepareAppTransition(
- WindowManagerPolicy.TRANSIT_NONE, false);
+ AppTransition.TRANSIT_NONE, false);
} else {
mService.mWindowManager.prepareAppTransition(prev.task == next.task
- ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
- : WindowManagerPolicy.TRANSIT_TASK_OPEN, false);
+ ? AppTransition.TRANSIT_ACTIVITY_OPEN
+ : AppTransition.TRANSIT_TASK_OPEN, false);
}
}
if (false) {
@@ -1643,10 +1643,10 @@
if (mNoAnimActivities.contains(next)) {
noAnim = true;
mService.mWindowManager.prepareAppTransition(
- WindowManagerPolicy.TRANSIT_NONE, false);
+ AppTransition.TRANSIT_NONE, false);
} else {
mService.mWindowManager.prepareAppTransition(
- WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false);
+ AppTransition.TRANSIT_ACTIVITY_OPEN, false);
}
}
if (!noAnim) {
@@ -1890,12 +1890,12 @@
"Prepare open transition: starting " + r);
if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
mService.mWindowManager.prepareAppTransition(
- WindowManagerPolicy.TRANSIT_NONE, keepCurTransition);
+ AppTransition.TRANSIT_NONE, keepCurTransition);
mNoAnimActivities.add(r);
} else {
mService.mWindowManager.prepareAppTransition(newTask
- ? WindowManagerPolicy.TRANSIT_TASK_OPEN
- : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition);
+ ? AppTransition.TRANSIT_TASK_OPEN
+ : AppTransition.TRANSIT_ACTIVITY_OPEN, keepCurTransition);
mNoAnimActivities.remove(r);
}
r.updateOptionsLocked(options);
@@ -3812,8 +3812,8 @@
if (DEBUG_TRANSITION) Slog.v(TAG,
"Prepare close transition: finishing " + r);
mService.mWindowManager.prepareAppTransition(endTask
- ? WindowManagerPolicy.TRANSIT_TASK_CLOSE
- : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false);
+ ? AppTransition.TRANSIT_TASK_CLOSE
+ : AppTransition.TRANSIT_ACTIVITY_CLOSE, false);
// Tell window manager to prepare for this one to be removed.
mService.mWindowManager.setAppVisibility(r.appToken, false);
@@ -4300,7 +4300,7 @@
(reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
ActivityOptions.abort(options);
} else {
- updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options);
+ updateTransitLocked(AppTransition.TRANSIT_TASK_TO_FRONT, options);
}
return;
}
@@ -4338,14 +4338,14 @@
if (reason != null &&
(reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
mService.mWindowManager.prepareAppTransition(
- WindowManagerPolicy.TRANSIT_NONE, false);
+ AppTransition.TRANSIT_NONE, false);
ActivityRecord r = topRunningActivityLocked(null);
if (r != null) {
mNoAnimActivities.add(r);
}
ActivityOptions.abort(options);
} else {
- updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options);
+ updateTransitLocked(AppTransition.TRANSIT_TASK_TO_FRONT, options);
}
mService.mWindowManager.moveAppTokensToTop(moved);
@@ -4431,14 +4431,14 @@
if (reason != null &&
(reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
mService.mWindowManager.prepareAppTransition(
- WindowManagerPolicy.TRANSIT_NONE, false);
+ AppTransition.TRANSIT_NONE, false);
ActivityRecord r = topRunningActivityLocked(null);
if (r != null) {
mNoAnimActivities.add(r);
}
} else {
mService.mWindowManager.prepareAppTransition(
- WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false);
+ AppTransition.TRANSIT_TASK_TO_BACK, false);
}
mService.mWindowManager.moveAppTokensToBottom(moved);
if (VALIDATE_TOKENS) {
diff --git a/services/java/com/android/server/wm/AppTransition.java b/services/java/com/android/server/wm/AppTransition.java
index 7736c93..30019e7 100644
--- a/services/java/com/android/server/wm/AppTransition.java
+++ b/services/java/com/android/server/wm/AppTransition.java
@@ -16,7 +16,6 @@
package com.android.server.wm;
-import android.app.ActivityOptions;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
@@ -25,7 +24,6 @@
import android.os.IRemoteCallback;
import android.util.Slog;
import android.view.WindowManager;
-import android.view.WindowManagerPolicy;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
@@ -39,8 +37,26 @@
import java.io.PrintWriter;
-import static android.view.WindowManagerPolicy.TRANSIT_NONE;
-import static android.view.WindowManagerPolicy.TRANSIT_UNSET;
+import static com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
// State management of app transitions. When we are preparing for a
// transition, mNextAppTransition will be the kind of transition to
@@ -53,32 +69,81 @@
WindowManagerService.DEBUG_APP_TRANSITIONS;
private static final boolean DEBUG_ANIM = WindowManagerService.DEBUG_ANIM;
+ /** Bit mask that is set for all enter transition. */
+ public static final int TRANSIT_ENTER_MASK = 0x1000;
+
+ /** Bit mask that is set for all exit transitions. */
+ public static final int TRANSIT_EXIT_MASK = 0x2000;
+
+ /** Not set up for a transition. */
+ public static final int TRANSIT_UNSET = -1;
+ /** No animation for transition. */
+ public static final int TRANSIT_NONE = 0;
+ /** A window in a new activity is being opened on top of an existing one in the same task. */
+ public static final int TRANSIT_ACTIVITY_OPEN = 6 | TRANSIT_ENTER_MASK;
+ /** The window in the top-most activity is being closed to reveal the
+ * previous activity in the same task. */
+ public static final int TRANSIT_ACTIVITY_CLOSE = 7 | TRANSIT_EXIT_MASK;
+ /** A window in a new task is being opened on top of an existing one
+ * in another activity's task. */
+ public static final int TRANSIT_TASK_OPEN = 8 | TRANSIT_ENTER_MASK;
+ /** A window in the top-most activity is being closed to reveal the
+ * previous activity in a different task. */
+ public static final int TRANSIT_TASK_CLOSE = 9 | TRANSIT_EXIT_MASK;
+ /** A window in an existing task is being displayed on top of an existing one
+ * in another activity's task. */
+ public static final int TRANSIT_TASK_TO_FRONT = 10 | TRANSIT_ENTER_MASK;
+ /** A window in an existing task is being put below all other tasks. */
+ public static final int TRANSIT_TASK_TO_BACK = 11 | TRANSIT_EXIT_MASK;
+ /** A window in a new activity that doesn't have a wallpaper is being opened on top of one that
+ * does, effectively closing the wallpaper. */
+ public static final int TRANSIT_WALLPAPER_CLOSE = 12 | TRANSIT_EXIT_MASK;
+ /** A window in a new activity that does have a wallpaper is being opened on one that didn't,
+ * effectively opening the wallpaper. */
+ public static final int TRANSIT_WALLPAPER_OPEN = 13 | TRANSIT_ENTER_MASK;
+ /** A window in a new activity is being opened on top of an existing one, and both are on top
+ * of the wallpaper. */
+ public static final int TRANSIT_WALLPAPER_INTRA_OPEN = 14 | TRANSIT_ENTER_MASK;
+ /** The window in the top-most activity is being closed to reveal the previous activity, and
+ * both are on top of the wallpaper. */
+ public static final int TRANSIT_WALLPAPER_INTRA_CLOSE = 15 | TRANSIT_EXIT_MASK;
+
/** Fraction of animation at which the recents thumbnail becomes completely transparent */
- static final float RECENTS_THUMBNAIL_FADEOUT_FRACTION = 0.25f;
+ private static final float RECENTS_THUMBNAIL_FADEOUT_FRACTION = 0.25f;
- static final long DEFAULT_APP_TRANSITION_DURATION = 250;
+ private static final long DEFAULT_APP_TRANSITION_DURATION = 250;
- final Context mContext;
- final Handler mH;
+ private final Context mContext;
+ private final Handler mH;
- int mNextAppTransition = TRANSIT_UNSET;
- int mNextAppTransitionType = ActivityOptions.ANIM_NONE;
- String mNextAppTransitionPackage;
- Bitmap mNextAppTransitionThumbnail;
+ private int mNextAppTransition = TRANSIT_UNSET;
+
+ private static final int NEXT_TRANSIT_TYPE_NONE = 0;
+ private static final int NEXT_TRANSIT_TYPE_CUSTOM = 1;
+ private static final int NEXT_TRANSIT_TYPE_SCALE_UP = 2;
+ private static final int NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP = 3;
+ private static final int NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN = 4;
+ private int mNextAppTransitionType = NEXT_TRANSIT_TYPE_NONE;
+
+ private String mNextAppTransitionPackage;
+ private Bitmap mNextAppTransitionThumbnail;
// Used for thumbnail transitions. True if we're scaling up, false if scaling down
- boolean mNextAppTransitionScaleUp;
- IRemoteCallback mNextAppTransitionCallback;
- int mNextAppTransitionEnter;
- int mNextAppTransitionExit;
- int mNextAppTransitionStartX;
- int mNextAppTransitionStartY;
- int mNextAppTransitionStartWidth;
- int mNextAppTransitionStartHeight;
- boolean mAppTransitionReady = false;
- boolean mAppTransitionRunning = false;
- boolean mAppTransitionTimeout = false;
+ private boolean mNextAppTransitionScaleUp;
+ private IRemoteCallback mNextAppTransitionCallback;
+ private int mNextAppTransitionEnter;
+ private int mNextAppTransitionExit;
+ private int mNextAppTransitionStartX;
+ private int mNextAppTransitionStartY;
+ private int mNextAppTransitionStartWidth;
+ private int mNextAppTransitionStartHeight;
- final int mConfigShortAnimTime;
+ private final static int APP_STATE_IDLE = 0;
+ private final static int APP_STATE_READY = 1;
+ private final static int APP_STATE_RUNNING = 2;
+ private final static int APP_STATE_TIMEOUT = 3;
+ private int mAppTransitionState = APP_STATE_IDLE;
+
+ private final int mConfigShortAnimTime;
private final Interpolator mDecelerateInterpolator;
private final Interpolator mThumbnailFadeoutInterpolator;
@@ -122,27 +187,28 @@
}
boolean isReady() {
- return mAppTransitionReady;
+ return mAppTransitionState == APP_STATE_READY
+ || mAppTransitionState == APP_STATE_TIMEOUT;
}
void setReady() {
- mAppTransitionReady = true;
+ mAppTransitionState = APP_STATE_READY;
}
boolean isRunning() {
- return mAppTransitionRunning;
+ return mAppTransitionState == APP_STATE_RUNNING;
}
- void setRunning(boolean running) {
- mAppTransitionRunning = running;
+ void setIdle() {
+ mAppTransitionState = APP_STATE_IDLE;
}
boolean isTimeout() {
- return mAppTransitionTimeout;
+ return mAppTransitionState == APP_STATE_TIMEOUT;
}
- void setTimeout(boolean timeout) {
- mAppTransitionTimeout = timeout;
+ void setTimeout() {
+ mAppTransitionState = APP_STATE_TIMEOUT;
}
Bitmap getNextAppTransitionThumbnail() {
@@ -154,28 +220,29 @@
outPoint.y = mNextAppTransitionStartY;
}
- int getType() {
- return mNextAppTransitionType;
- }
-
void prepare() {
- mAppTransitionReady = false;
- mAppTransitionTimeout = false;
+ if (!isRunning()) {
+ mAppTransitionState = APP_STATE_IDLE;
+ }
}
void goodToGo() {
- mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
- mAppTransitionReady = false;
- mAppTransitionRunning = true;
- mAppTransitionTimeout = false;
+ mNextAppTransition = TRANSIT_UNSET;
+ mAppTransitionState = APP_STATE_RUNNING;
}
void clear() {
- mNextAppTransitionType = ActivityOptions.ANIM_NONE;
+ mNextAppTransitionType = NEXT_TRANSIT_TYPE_NONE;
mNextAppTransitionPackage = null;
mNextAppTransitionThumbnail = null;
}
+ void freeze() {
+ setAppTransition(AppTransition.TRANSIT_UNSET);
+ clear();
+ setReady();
+ }
+
private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) {
if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg="
+ (lp != null ? lp.packageName : null)
@@ -282,8 +349,8 @@
set.addAnimation(alpha);
set.setDetachWallpaper(true);
a = set;
- } else if (transit == WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN ||
- transit == WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE) {
+ } else if (transit == TRANSIT_WALLPAPER_INTRA_OPEN ||
+ transit == TRANSIT_WALLPAPER_INTRA_CLOSE) {
// If we are on top of the wallpaper, we need an animation that
// correctly handles the wallpaper staying static behind all of
// the animated elements. To do this, will just have the existing
@@ -300,8 +367,8 @@
// task transition duration.
final long duration;
switch (transit) {
- case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
- case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
+ case TRANSIT_ACTIVITY_OPEN:
+ case TRANSIT_ACTIVITY_CLOSE:
duration = mConfigShortAnimTime;
break;
default:
@@ -363,7 +430,7 @@
} else {
// Exiting app
if (mNextAppTransitionScaleUp) {
- if (transit == WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN) {
+ if (transit == TRANSIT_WALLPAPER_INTRA_OPEN) {
// Fade out while bringing up selected activity. This keeps the
// current activity from showing through a launching wallpaper
// activity.
@@ -394,8 +461,8 @@
// task transition duration.
final long duration;
switch (transit) {
- case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
- case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
+ case TRANSIT_ACTIVITY_OPEN:
+ case TRANSIT_ACTIVITY_CLOSE:
duration = mConfigShortAnimTime;
break;
default:
@@ -413,7 +480,7 @@
Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
int appWidth, int appHeight) {
Animation a;
- if (mNextAppTransitionType == ActivityOptions.ANIM_CUSTOM) {
+ if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_CUSTOM) {
a = loadAnimation(mNextAppTransitionPackage, enter ?
mNextAppTransitionEnter : mNextAppTransitionExit);
if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG,
@@ -421,17 +488,17 @@
+ " anim=" + a + " nextAppTransition=ANIM_CUSTOM"
+ " transit=" + transit + " isEntrance=" + enter
+ " Callers=" + Debug.getCallers(3));
- } else if (mNextAppTransitionType == ActivityOptions.ANIM_SCALE_UP) {
+ } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_SCALE_UP) {
a = createScaleUpAnimationLocked(transit, enter, appWidth, appHeight);
if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG,
"applyAnimation:"
+ " anim=" + a + " nextAppTransition=ANIM_SCALE_UP"
+ " transit=" + transit + " isEntrance=" + enter
+ " Callers=" + Debug.getCallers(3));
- } else if (mNextAppTransitionType == ActivityOptions.ANIM_THUMBNAIL_SCALE_UP ||
- mNextAppTransitionType == ActivityOptions.ANIM_THUMBNAIL_SCALE_DOWN) {
+ } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP ||
+ mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN) {
mNextAppTransitionScaleUp =
- (mNextAppTransitionType == ActivityOptions.ANIM_THUMBNAIL_SCALE_UP);
+ (mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP);
a = createThumbnailAnimationLocked(transit, enter, false, appWidth, appHeight);
if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) {
String animName = mNextAppTransitionScaleUp ?
@@ -444,55 +511,55 @@
} else {
int animAttr = 0;
switch (transit) {
- case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
+ case TRANSIT_ACTIVITY_OPEN:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
+ ? WindowAnimation_activityOpenEnterAnimation
+ : WindowAnimation_activityOpenExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
+ case TRANSIT_ACTIVITY_CLOSE:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
+ ? WindowAnimation_activityCloseEnterAnimation
+ : WindowAnimation_activityCloseExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_TASK_OPEN:
+ case TRANSIT_TASK_OPEN:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
+ ? WindowAnimation_taskOpenEnterAnimation
+ : WindowAnimation_taskOpenExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
+ case TRANSIT_TASK_CLOSE:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
+ ? WindowAnimation_taskCloseEnterAnimation
+ : WindowAnimation_taskCloseExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
+ case TRANSIT_TASK_TO_FRONT:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
+ ? WindowAnimation_taskToFrontEnterAnimation
+ : WindowAnimation_taskToFrontExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
+ case TRANSIT_TASK_TO_BACK:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
+ ? WindowAnimation_taskToBackEnterAnimation
+ : WindowAnimation_taskToBackExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN:
+ case TRANSIT_WALLPAPER_OPEN:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
+ ? WindowAnimation_wallpaperOpenEnterAnimation
+ : WindowAnimation_wallpaperOpenExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE:
+ case TRANSIT_WALLPAPER_CLOSE:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
+ ? WindowAnimation_wallpaperCloseEnterAnimation
+ : WindowAnimation_wallpaperCloseExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN:
+ case TRANSIT_WALLPAPER_INTRA_OPEN:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
+ ? WindowAnimation_wallpaperIntraOpenEnterAnimation
+ : WindowAnimation_wallpaperIntraOpenExitAnimation;
break;
- case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE:
+ case TRANSIT_WALLPAPER_INTRA_CLOSE:
animAttr = enter
- ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
- : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
+ ? WindowAnimation_wallpaperIntraCloseEnterAnimation
+ : WindowAnimation_wallpaperIntraCloseExitAnimation;
break;
}
a = animAttr != 0 ? loadAnimation(lp, animAttr) : null;
@@ -516,7 +583,7 @@
void overridePendingAppTransition(String packageName, int enterAnim, int exitAnim,
IRemoteCallback startedCallback) {
if (isTransitionSet()) {
- mNextAppTransitionType = ActivityOptions.ANIM_CUSTOM;
+ mNextAppTransitionType = NEXT_TRANSIT_TYPE_CUSTOM;
mNextAppTransitionPackage = packageName;
mNextAppTransitionThumbnail = null;
mNextAppTransitionEnter = enterAnim;
@@ -531,7 +598,7 @@
void overridePendingAppTransitionScaleUp(int startX, int startY, int startWidth,
int startHeight) {
if (isTransitionSet()) {
- mNextAppTransitionType = ActivityOptions.ANIM_SCALE_UP;
+ mNextAppTransitionType = NEXT_TRANSIT_TYPE_SCALE_UP;
mNextAppTransitionPackage = null;
mNextAppTransitionThumbnail = null;
mNextAppTransitionStartX = startX;
@@ -546,8 +613,8 @@
void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX, int startY,
IRemoteCallback startedCallback, boolean scaleUp) {
if (isTransitionSet()) {
- mNextAppTransitionType = scaleUp ? ActivityOptions.ANIM_THUMBNAIL_SCALE_UP
- : ActivityOptions.ANIM_THUMBNAIL_SCALE_DOWN;
+ mNextAppTransitionType = scaleUp ? NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP
+ : NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN;
mNextAppTransitionPackage = null;
mNextAppTransitionThumbnail = srcThumb;
mNextAppTransitionScaleUp = scaleUp;
@@ -565,17 +632,100 @@
return "mNextAppTransition=0x" + Integer.toHexString(mNextAppTransition);
}
+ /**
+ * Returns the human readable name of a window transition.
+ *
+ * @param transition The window transition.
+ * @return The transition symbolic name.
+ */
+ public static String appTransitionToString(int transition) {
+ switch (transition) {
+ case TRANSIT_UNSET: {
+ return "TRANSIT_UNSET";
+ }
+ case TRANSIT_NONE: {
+ return "TRANSIT_NONE";
+ }
+ case TRANSIT_EXIT_MASK: {
+ return "TRANSIT_EXIT_MASK";
+ }
+ case TRANSIT_ACTIVITY_OPEN: {
+ return "TRANSIT_ACTIVITY_OPEN";
+ }
+ case TRANSIT_ACTIVITY_CLOSE: {
+ return "TRANSIT_ACTIVITY_CLOSE";
+ }
+ case TRANSIT_TASK_OPEN: {
+ return "TRANSIT_TASK_OPEN";
+ }
+ case TRANSIT_TASK_CLOSE: {
+ return "TRANSIT_TASK_CLOSE";
+ }
+ case TRANSIT_TASK_TO_FRONT: {
+ return "TRANSIT_TASK_TO_FRONT";
+ }
+ case TRANSIT_TASK_TO_BACK: {
+ return "TRANSIT_TASK_TO_BACK";
+ }
+ case TRANSIT_WALLPAPER_CLOSE: {
+ return "TRANSIT_WALLPAPER_CLOSE";
+ }
+ case TRANSIT_WALLPAPER_OPEN: {
+ return "TRANSIT_WALLPAPER_OPEN";
+ }
+ case TRANSIT_WALLPAPER_INTRA_OPEN: {
+ return "TRANSIT_WALLPAPER_INTRA_OPEN";
+ }
+ case TRANSIT_WALLPAPER_INTRA_CLOSE: {
+ return "TRANSIT_WALLPAPER_INTRA_CLOSE";
+ }
+ default: {
+ return "<UNKNOWN>";
+ }
+ }
+ }
+
+ private String appStateToString() {
+ switch (mAppTransitionState) {
+ case APP_STATE_IDLE:
+ return "APP_STATE_IDLE";
+ case APP_STATE_READY:
+ return "APP_STATE_READY";
+ case APP_STATE_RUNNING:
+ return "APP_STATE_RUNNING";
+ case APP_STATE_TIMEOUT:
+ return "APP_STATE_TIMEOUT";
+ default:
+ return "unknown state=" + mAppTransitionState;
+ }
+ }
+
+ private String transitTypeToString() {
+ switch (mNextAppTransitionType) {
+ case NEXT_TRANSIT_TYPE_NONE:
+ return "NEXT_TRANSIT_TYPE_NONE";
+ case NEXT_TRANSIT_TYPE_CUSTOM:
+ return "NEXT_TRANSIT_TYPE_CUSTOM";
+ case NEXT_TRANSIT_TYPE_SCALE_UP:
+ return "NEXT_TRANSIT_TYPE_SCALE_UP";
+ case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP:
+ return "NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP";
+ case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN:
+ return "NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN";
+ default:
+ return "unknown type=" + mNextAppTransitionType;
+ }
+ }
+
@Override
public void dump(PrintWriter pw) {
pw.print(" " + this);
- pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady);
- pw.print(" mAppTransitionRunning="); pw.print(mAppTransitionRunning);
- pw.print(" mAppTransitionTimeout="); pw.println(mAppTransitionTimeout);
- if (mNextAppTransitionType != ActivityOptions.ANIM_NONE) {
- pw.print(" mNextAppTransitionType="); pw.println(mNextAppTransitionType);
+ pw.print(" mAppTransitionState="); pw.println(appStateToString());
+ if (mNextAppTransitionType != NEXT_TRANSIT_TYPE_NONE) {
+ pw.print(" mNextAppTransitionType="); pw.println(transitTypeToString());
}
switch (mNextAppTransitionType) {
- case ActivityOptions.ANIM_CUSTOM:
+ case NEXT_TRANSIT_TYPE_CUSTOM:
pw.print(" mNextAppTransitionPackage=");
pw.println(mNextAppTransitionPackage);
pw.print(" mNextAppTransitionEnter=0x");
@@ -583,7 +733,7 @@
pw.print(" mNextAppTransitionExit=0x");
pw.println(Integer.toHexString(mNextAppTransitionExit));
break;
- case ActivityOptions.ANIM_SCALE_UP:
+ case NEXT_TRANSIT_TYPE_SCALE_UP:
pw.print(" mNextAppTransitionStartX="); pw.print(mNextAppTransitionStartX);
pw.print(" mNextAppTransitionStartY=");
pw.println(mNextAppTransitionStartY);
@@ -592,8 +742,8 @@
pw.print(" mNextAppTransitionStartHeight=");
pw.println(mNextAppTransitionStartHeight);
break;
- case ActivityOptions.ANIM_THUMBNAIL_SCALE_UP:
- case ActivityOptions.ANIM_THUMBNAIL_SCALE_DOWN:
+ case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP:
+ case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN:
pw.print(" mNextAppTransitionThumbnail=");
pw.print(mNextAppTransitionThumbnail);
pw.print(" mNextAppTransitionStartX=");
diff --git a/services/java/com/android/server/wm/AppWindowToken.java b/services/java/com/android/server/wm/AppWindowToken.java
index adad09d8..0ada604 100644
--- a/services/java/com/android/server/wm/AppWindowToken.java
+++ b/services/java/com/android/server/wm/AppWindowToken.java
@@ -225,7 +225,6 @@
boolean isVisible() {
final int N = allAppWindows.size();
- // TODO: Consider using allDrawn instead of a single window.
for (int i=0; i<N; i++) {
WindowState win = allAppWindows.get(i);
if (!win.mAppFreezing
diff --git a/services/java/com/android/server/wm/DimAnimator.java b/services/java/com/android/server/wm/DimAnimator.java
deleted file mode 100644
index 5874202..0000000
--- a/services/java/com/android/server/wm/DimAnimator.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import android.content.res.Resources;
-import android.graphics.PixelFormat;
-import android.util.Slog;
-import android.util.TypedValue;
-import android.view.Surface;
-import android.view.SurfaceSession;
-
-import java.io.PrintWriter;
-
-/**
- * DimAnimator class that controls the dim animation. This holds the surface and
- * all state used for dim animation.
- */
-class DimAnimator {
- static final String TAG = "DimAnimator";
-
- Surface mDimSurface;
- boolean mDimShown = false;
- float mDimCurrentAlpha;
- float mDimTargetAlpha;
- float mDimDeltaPerMs;
- long mLastDimAnimTime;
-
- int mLastDimWidth, mLastDimHeight;
-
- DimAnimator (SurfaceSession session, final int layerStack) {
- try {
- if (WindowManagerService.DEBUG_SURFACE_TRACE) {
- mDimSurface = new WindowStateAnimator.SurfaceTrace(session,
- "DimAnimator",
- 16, 16, PixelFormat.OPAQUE,
- Surface.FX_SURFACE_DIM | Surface.HIDDEN);
- } else {
- mDimSurface = new Surface(session, "DimAnimator",
- 16, 16, PixelFormat.OPAQUE,
- Surface.FX_SURFACE_DIM | Surface.HIDDEN);
- }
- if (WindowManagerService.SHOW_TRANSACTIONS ||
- WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG,
- " DIM " + mDimSurface + ": CREATE");
- mDimSurface.setLayerStack(layerStack);
- mDimSurface.setAlpha(0.0f);
- mDimSurface.show();
- } catch (Exception e) {
- Slog.e(WindowManagerService.TAG, "Exception creating Dim surface", e);
- }
- }
-
- /**
- * Set's the dim surface's layer and update dim parameters that will be used in
- * {@link #updateSurface} after all windows are examined.
- */
- void updateParameters(final Resources res, final Parameters params, final long currentTime) {
- if (mDimSurface == null) {
- Slog.e(TAG, "updateParameters: no Surface");
- return;
- }
-
- // Multiply by 1.5 so that rotating a frozen surface that includes this does not expose a
- // corner.
- final int dw = (int) (params.mDimWidth * 1.5);
- final int dh = (int) (params.mDimHeight * 1.5);
- final WindowStateAnimator winAnimator = params.mDimWinAnimator;
- final float target = params.mDimTarget;
- if (!mDimShown) {
- if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG,
- " DIM " + mDimSurface + ": SHOW pos=(0,0) (" + dw + "x" + dh + ")");
- mDimShown = true;
- try {
- mLastDimWidth = dw;
- mLastDimHeight = dh;
- // back off position so mDimXXX/4 is before and mDimXXX/4 is after
- mDimSurface.setPosition(-1 * dw / 6, -1 * dh /6);
- mDimSurface.setSize(dw, dh);
- mDimSurface.show();
- } catch (RuntimeException e) {
- Slog.w(WindowManagerService.TAG, "Failure showing dim surface", e);
- }
- } else if (mLastDimWidth != dw || mLastDimHeight != dh) {
- mLastDimWidth = dw;
- mLastDimHeight = dh;
- mDimSurface.setSize(dw, dh);
- // back off position so mDimXXX/4 is before and mDimXXX/4 is after
- mDimSurface.setPosition(-1 * dw / 6, -1 * dh /6);
- }
-
- mDimSurface.setLayer(winAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM);
-
- if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM "
- + mDimSurface + ": layer=" + (winAnimator.mAnimLayer-1) + " target=" + target);
- if (mDimTargetAlpha != target) {
- // If the desired dim level has changed, then
- // start an animation to it.
- mLastDimAnimTime = currentTime;
- long duration = (winAnimator.mAnimating && winAnimator.mAnimation != null)
- ? winAnimator.mAnimation.computeDurationHint()
- : WindowManagerService.DEFAULT_DIM_DURATION;
- if (target > mDimTargetAlpha) {
- TypedValue tv = new TypedValue();
- res.getValue(com.android.internal.R.fraction.config_dimBehindFadeDuration,
- tv, true);
- if (tv.type == TypedValue.TYPE_FRACTION) {
- duration = (long)tv.getFraction(duration, duration);
- } else if (tv.type >= TypedValue.TYPE_FIRST_INT
- && tv.type <= TypedValue.TYPE_LAST_INT) {
- duration = tv.data;
- }
- }
- if (duration < 1) {
- // Don't divide by zero
- duration = 1;
- }
- mDimTargetAlpha = target;
- mDimDeltaPerMs = (mDimTargetAlpha-mDimCurrentAlpha) / duration;
- }
- }
-
- /**
- * Updating the surface's alpha. Returns true if the animation continues, or returns
- * false when the animation is finished and the dim surface is hidden.
- */
- boolean updateSurface(boolean dimming, long currentTime, boolean displayFrozen) {
- if (mDimSurface == null) {
- Slog.e(TAG, "updateSurface: no Surface");
- return false;
- }
-
- if (!dimming) {
- if (mDimTargetAlpha != 0) {
- mLastDimAnimTime = currentTime;
- mDimTargetAlpha = 0;
- mDimDeltaPerMs = (-mDimCurrentAlpha) / WindowManagerService.DEFAULT_DIM_DURATION;
- }
- }
-
- boolean animating = mLastDimAnimTime != 0;
- if (animating) {
- mDimCurrentAlpha += mDimDeltaPerMs
- * (currentTime-mLastDimAnimTime);
- if (displayFrozen) {
- // If the display is frozen, there is no reason to animate.
- animating = false;
- } else if (mDimDeltaPerMs > 0) {
- if (mDimCurrentAlpha > mDimTargetAlpha) {
- animating = false;
- }
- } else if (mDimDeltaPerMs < 0) {
- if (mDimCurrentAlpha < mDimTargetAlpha) {
- animating = false;
- }
- } else {
- animating = false;
- }
-
- // Do we need to continue animating?
- if (animating) {
- if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM "
- + mDimSurface + ": alpha=" + mDimCurrentAlpha);
- mLastDimAnimTime = currentTime;
- mDimSurface.setAlpha(mDimCurrentAlpha);
- } else {
- mDimCurrentAlpha = mDimTargetAlpha;
- mLastDimAnimTime = 0;
- if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM "
- + mDimSurface + ": final alpha=" + mDimCurrentAlpha);
- mDimSurface.setAlpha(mDimCurrentAlpha);
- if (!dimming) {
- if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM " + mDimSurface
- + ": HIDE");
- try {
- mDimSurface.hide();
- } catch (RuntimeException e) {
- Slog.w(WindowManagerService.TAG, "Illegal argument exception hiding dim surface");
- }
- mDimShown = false;
- }
- }
- }
- return animating;
- }
-
- public void kill() {
- if (mDimSurface != null) {
- mDimSurface.destroy();
- mDimSurface = null;
- }
- }
-
- public void printTo(String prefix, PrintWriter pw) {
- pw.print(prefix);
- pw.print("mDimSurface="); pw.print(mDimSurface);
- pw.print(" "); pw.print(mLastDimWidth); pw.print(" x ");
- pw.println(mLastDimHeight);
- pw.print(prefix);
- pw.print("mDimShown="); pw.print(mDimShown);
- pw.print(" current="); pw.print(mDimCurrentAlpha);
- pw.print(" target="); pw.print(mDimTargetAlpha);
- pw.print(" delta="); pw.print(mDimDeltaPerMs);
- pw.print(" lastAnimTime="); pw.println(mLastDimAnimTime);
- }
-
- static class Parameters {
- final WindowStateAnimator mDimWinAnimator;
- final int mDimWidth;
- final int mDimHeight;
- final float mDimTarget;
- Parameters(final WindowStateAnimator dimWinAnimator, final int dimWidth,
- final int dimHeight, final float dimTarget) {
- mDimWinAnimator = dimWinAnimator;
- mDimWidth = dimWidth;
- mDimHeight = dimHeight;
- mDimTarget = dimTarget;
- }
-
- Parameters(Parameters o) {
- mDimWinAnimator = o.mDimWinAnimator;
- mDimWidth = o.mDimWidth;
- mDimHeight = o.mDimHeight;
- mDimTarget = o.mDimTarget;
- }
-
- public void printTo(String prefix, PrintWriter pw) {
- pw.print(prefix);
- pw.print("mDimWinAnimator="); pw.print(mDimWinAnimator.mWin.mAttrs.getTitle());
- pw.print(" "); pw.print(mDimWidth); pw.print(" x ");
- pw.print(mDimHeight);
- pw.print(" mDimTarget="); pw.println(mDimTarget);
- }
- }
-}
diff --git a/services/java/com/android/server/wm/DimLayer.java b/services/java/com/android/server/wm/DimLayer.java
new file mode 100644
index 0000000..162caf5
--- /dev/null
+++ b/services/java/com/android/server/wm/DimLayer.java
@@ -0,0 +1,257 @@
+// Copyright 2012 Google Inc. All Rights Reserved.
+
+package com.android.server.wm;
+
+import android.graphics.PixelFormat;
+import android.os.SystemClock;
+import android.util.Slog;
+import android.view.DisplayInfo;
+import android.view.Surface;
+
+import java.io.PrintWriter;
+
+public class DimLayer {
+ private static final String TAG = "DimLayer";
+ private static final boolean DEBUG = true;
+
+ /** Reference to the owner of this object. */
+ final DisplayContent mDisplayContent;
+
+ /** Actual surface that dims */
+ Surface mDimSurface;
+
+ /** Last value passed to mDimSurface.setAlpha() */
+ float mAlpha = 0;
+
+ /** Last value passed to mDimSurface.setLayer() */
+ int mLayer = -1;
+
+ /** Last values passed to mDimSurface.setSize() */
+ int mLastDimWidth, mLastDimHeight;
+
+ /** True after mDimSurface.show() has been called, false after mDimSurface.hide(). */
+ private boolean mShowing = false;
+
+ /** Value of mAlpha when beginning transition to mTargetAlpha */
+ float mStartAlpha = 0;
+
+ /** Final value of mAlpha following transition */
+ float mTargetAlpha = 0;
+
+ /** Time in units of SystemClock.uptimeMillis() at which the current transition started */
+ long mStartTime;
+
+ /** Time in milliseconds to take to transition from mStartAlpha to mTargetAlpha */
+ long mDuration;
+
+ DimLayer(WindowManagerService service, int displayId) {
+ if (DEBUG) Slog.v(TAG, "Ctor: displayId=" + displayId);
+ mDisplayContent = service.getDisplayContentLocked(displayId);
+ Surface.openTransaction();
+ try {
+ if (WindowManagerService.DEBUG_SURFACE_TRACE) {
+ mDimSurface = new WindowStateAnimator.SurfaceTrace(service.mFxSession,
+ "DimSurface",
+ 16, 16, PixelFormat.OPAQUE,
+ Surface.FX_SURFACE_DIM | Surface.HIDDEN);
+ } else {
+ mDimSurface = new Surface(service.mFxSession, TAG,
+ 16, 16, PixelFormat.OPAQUE,
+ Surface.FX_SURFACE_DIM | Surface.HIDDEN);
+ }
+ if (WindowManagerService.SHOW_TRANSACTIONS ||
+ WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(TAG,
+ " DIM " + mDimSurface + ": CREATE");
+ mDimSurface.setLayerStack(displayId);
+ } catch (Exception e) {
+ Slog.e(WindowManagerService.TAG, "Exception creating Dim surface", e);
+ } finally {
+ Surface.closeTransaction();
+ }
+ }
+
+ /** Return true if dim layer is showing */
+ boolean isDimming() {
+ return mTargetAlpha != 0;
+ }
+
+ /** Return true if in a transition period */
+ boolean isAnimating() {
+ return mTargetAlpha != mAlpha;
+ }
+
+ float getTargetAlpha() {
+ return mTargetAlpha;
+ }
+
+ private void setAlpha(float alpha) {
+ if (mAlpha != alpha) {
+ if (DEBUG) Slog.v(TAG, "setAlpha alpha=" + alpha);
+ try {
+ mDimSurface.setAlpha(alpha);
+ if (alpha == 0 && mShowing) {
+ if (DEBUG) Slog.v(TAG, "setAlpha hiding");
+ mDimSurface.hide();
+ mShowing = false;
+ } else if (alpha > 0 && !mShowing) {
+ if (DEBUG) Slog.v(TAG, "setAlpha showing");
+ mDimSurface.show();
+ mShowing = true;
+ }
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Failure setting alpha immediately", e);
+ }
+ mAlpha = alpha;
+ }
+ }
+
+ /**
+ * @param duration The time to test.
+ * @return True if the duration would lead to an earlier end to the current animation.
+ */
+ private boolean durationEndsEarlier(long duration) {
+ return SystemClock.uptimeMillis() + duration < mStartTime + mDuration;
+ }
+
+ /** Jump to the end of the animation.
+ * NOTE: Must be called with Surface transaction open. */
+ void show() {
+ if (isAnimating()) {
+ if (DEBUG) Slog.v(TAG, "show: immediate");
+ show(mLayer, mTargetAlpha, 0);
+ }
+ }
+
+ /**
+ * Begin an animation to a new dim value.
+ * NOTE: Must be called with Surface transaction open.
+ *
+ * @param layer The layer to set the surface to.
+ * @param alpha The dim value to end at.
+ * @param duration How long to take to get there in milliseconds.
+ */
+ void show(int layer, float alpha, long duration) {
+ if (DEBUG) Slog.v(TAG, "show: layer=" + layer + " alpha=" + alpha
+ + " duration=" + duration);
+ if (mDimSurface == null) {
+ Slog.e(TAG, "show: no Surface");
+ // Make sure isAnimating() returns false.
+ mTargetAlpha = mAlpha = 0;
+ return;
+ }
+
+ // Set surface size to screen size.
+ final DisplayInfo info = mDisplayContent.getDisplayInfo();
+ // Multiply by 1.5 so that rotating a frozen surface that includes this does not expose a
+ // corner.
+ final int dw = (int) (info.logicalWidth * 1.5);
+ final int dh = (int) (info.logicalHeight * 1.5);
+ // back off position so 1/4 of Surface is before and 1/4 is after.
+ final float xPos = -1 * dw / 6;
+ final float yPos = -1 * dh / 6;
+
+ if (mLastDimWidth != dw || mLastDimHeight != dh || mLayer != layer) {
+ try {
+ mDimSurface.setPosition(xPos, yPos);
+ mDimSurface.setSize(dw, dh);
+ mDimSurface.setLayer(layer);
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Failure setting size or layer", e);
+ }
+ mLastDimWidth = dw;
+ mLastDimHeight = dh;
+ mLayer = layer;
+ }
+
+ long curTime = SystemClock.uptimeMillis();
+ final boolean animating = isAnimating();
+ if ((animating && (mTargetAlpha != alpha || durationEndsEarlier(duration)))
+ || (!animating && mAlpha != alpha)) {
+ if (duration <= 0) {
+ // No animation required, just set values.
+ setAlpha(alpha);
+ } else {
+ // Start or continue animation with new parameters.
+ mStartAlpha = mAlpha;
+ mStartTime = curTime;
+ mDuration = duration;
+ }
+ }
+ if (DEBUG) Slog.v(TAG, "show: mStartAlpha=" + mStartAlpha + " mStartTime=" + mStartTime);
+ mTargetAlpha = alpha;
+ }
+
+ /** Immediate hide.
+ * NOTE: Must be called with Surface transaction open. */
+ void hide() {
+ if (mShowing) {
+ if (DEBUG) Slog.v(TAG, "hide: immediate");
+ hide(0);
+ }
+ }
+
+ /**
+ * Gradually fade to transparent.
+ * NOTE: Must be called with Surface transaction open.
+ *
+ * @param duration Time to fade in milliseconds.
+ */
+ void hide(long duration) {
+ if (mShowing && (mTargetAlpha != 0 || durationEndsEarlier(duration))) {
+ if (DEBUG) Slog.v(TAG, "hide: duration=" + duration);
+ show(mLayer, 0, duration);
+ }
+ }
+
+ /**
+ * Advance the dimming per the last #show(int, float, long) call.
+ * NOTE: Must be called with Surface transaction open.
+ *
+ * @return True if animation is still required after this step.
+ */
+ boolean stepAnimation() {
+ if (mDimSurface == null) {
+ Slog.e(TAG, "stepAnimation: null Surface");
+ // Ensure that isAnimating() returns false;
+ mTargetAlpha = mAlpha = 0;
+ return false;
+ }
+
+ if (isAnimating()) {
+ final long curTime = SystemClock.uptimeMillis();
+ final float alphaDelta = mTargetAlpha - mStartAlpha;
+ float alpha = mStartAlpha + alphaDelta * (curTime - mStartTime) / mDuration;
+ if (alphaDelta > 0 && alpha > mTargetAlpha ||
+ alphaDelta < 0 && alpha < mTargetAlpha) {
+ // Don't exceed limits.
+ alpha = mTargetAlpha;
+ }
+ if (DEBUG) Slog.v(TAG, "stepAnimation: curTime=" + curTime + " alpha=" + alpha);
+ setAlpha(alpha);
+ }
+
+ return isAnimating();
+ }
+
+ /** Cleanup */
+ void destroySurface() {
+ if (DEBUG) Slog.v(TAG, "destroySurface.");
+ if (mDimSurface != null) {
+ mDimSurface.destroy();
+ mDimSurface = null;
+ }
+ }
+
+ public void printTo(String prefix, PrintWriter pw) {
+ pw.print(prefix); pw.print("mDimSurface="); pw.println(mDimSurface);
+ pw.print(prefix); pw.print(" mLayer="); pw.print(mLayer);
+ pw.print(" mAlpha="); pw.println(mAlpha);
+ pw.print(prefix); pw.print("mLastDimWidth="); pw.print(mLastDimWidth);
+ pw.print(" mLastDimWidth="); pw.println(mLastDimWidth);
+ pw.print(prefix); pw.print("Last animation: mStartTime="); pw.print(mStartTime);
+ pw.print(" mDuration="); pw.print(mDuration);
+ pw.print(" curTime="); pw.println(SystemClock.uptimeMillis());
+ pw.print(" mStartAlpha="); pw.println(mStartAlpha);
+ pw.print(" mTargetAlpha="); pw.print(mTargetAlpha);
+ }
+}
diff --git a/services/java/com/android/server/wm/DimSurface.java b/services/java/com/android/server/wm/DimSurface.java
deleted file mode 100644
index 511d388..0000000
--- a/services/java/com/android/server/wm/DimSurface.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import android.graphics.PixelFormat;
-import android.util.Slog;
-import android.view.DisplayInfo;
-import android.view.Surface;
-import android.view.SurfaceSession;
-
-import java.io.PrintWriter;
-
-class DimSurface {
- static final String TAG = "DimSurface";
-
- Surface mDimSurface;
- boolean mDimShown = false;
- int mDimColor = 0;
- int mLayer = -1;
- int mLastDimWidth, mLastDimHeight;
- final DisplayContent mDisplayContent;
-
- DimSurface(SurfaceSession session, DisplayContent displayContent) {
- mDisplayContent = displayContent;
- final int layerStack = displayContent.getDisplayId();
- try {
- if (WindowManagerService.DEBUG_SURFACE_TRACE) {
- mDimSurface = new WindowStateAnimator.SurfaceTrace(session,
- "DimSurface",
- 16, 16, PixelFormat.OPAQUE,
- Surface.FX_SURFACE_DIM | Surface.HIDDEN);
- } else {
- mDimSurface = new Surface(session, "DimSurface",
- 16, 16, PixelFormat.OPAQUE,
- Surface.FX_SURFACE_DIM | Surface.HIDDEN);
- }
- if (WindowManagerService.SHOW_TRANSACTIONS ||
- WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG,
- " DIM " + mDimSurface + ": CREATE");
- mDimSurface.setLayerStack(layerStack);
- mDimSurface.setAlpha(0.0f);
- mDimSurface.show();
- } catch (Exception e) {
- Slog.e(WindowManagerService.TAG, "Exception creating Dim surface", e);
- }
- }
-
- /**
- * Show the dim surface.
- */
- void show(int layer, int color) {
- final DisplayInfo info = mDisplayContent.getDisplayInfo();
- final int dw = info.logicalWidth;
- final int dh = info.logicalHeight;
- if (mDimSurface == null) {
- Slog.e(TAG, "show: no Surface");
- return;
- }
-
- if (!mDimShown) {
- if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM " + mDimSurface + ": SHOW pos=(0,0) (" +
- dw + "x" + dh + " layer=" + layer + ")");
- mDimShown = true;
- try {
- mLastDimWidth = dw;
- mLastDimHeight = dh;
- mDimSurface.setPosition(0, 0);
- mDimSurface.setSize(dw, dh);
- mDimSurface.setLayer(layer);
- mDimSurface.show();
- } catch (RuntimeException e) {
- Slog.w(WindowManagerService.TAG, "Failure showing dim surface", e);
- }
- } else if (mLastDimWidth != dw || mLastDimHeight != dh || mDimColor != color
- || mLayer != layer) {
- if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM " + mDimSurface + ": pos=(0,0) (" +
- dw + "x" + dh + " layer=" + layer + ")");
- mLastDimWidth = dw;
- mLastDimHeight = dh;
- mLayer = layer;
- mDimColor = color;
- mDimSurface.setSize(dw, dh);
- mDimSurface.setLayer(layer);
- mDimSurface.setAlpha(((color>>24)&0xff)/255.0f);
- }
- }
-
- void hide() {
- if (mDimSurface == null) {
- Slog.e(TAG, "hide: no Surface");
- return;
- }
-
- if (mDimShown) {
- mDimShown = false;
- try {
- if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " HIDE " + mDimSurface);
- mDimSurface.hide();
- } catch (RuntimeException e) {
- Slog.w(WindowManagerService.TAG, "Illegal argument exception hiding dim surface");
- }
- }
- }
-
- void kill() {
- if (mDimSurface != null) {
- mDimSurface.destroy();
- mDimSurface = null;
- }
- }
-
- public void printTo(String prefix, PrintWriter pw) {
- pw.print(prefix); pw.print("mDimSurface="); pw.println(mDimSurface);
- pw.print(prefix); pw.print("mDimShown="); pw.print(mDimShown);
- pw.print(" mLayer="); pw.print(mLayer);
- pw.print(" mDimColor=0x"); pw.println(Integer.toHexString(mDimColor));
- pw.print(prefix); pw.print("mLastDimWidth="); pw.print(mLastDimWidth);
- pw.print(" mLastDimWidth="); pw.println(mLastDimWidth);
- }
-}
diff --git a/services/java/com/android/server/wm/DisplayMagnifier.java b/services/java/com/android/server/wm/DisplayMagnifier.java
index cd5ae4b..d3c01f0 100644
--- a/services/java/com/android/server/wm/DisplayMagnifier.java
+++ b/services/java/com/android/server/wm/DisplayMagnifier.java
@@ -50,7 +50,6 @@
import com.android.internal.R;
import com.android.internal.os.SomeArgs;
-import com.android.internal.policy.impl.PhoneWindowManager;
/**
* This class is a part of the window manager and encapsulates the
@@ -137,25 +136,34 @@
mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_ROTATION_CHANGED);
}
- public void onWindowTransitionLocked(WindowState windowState, int transition) {
+ public void onAppWindowTransitionLocked(WindowState windowState, int transition) {
if (DEBUG_WINDOW_TRANSITIONS) {
Slog.i(LOG_TAG, "Window transition: "
- + PhoneWindowManager.windowTransitionToString(transition)
+ + AppTransition.appTransitionToString(transition)
+ " displayId: " + windowState.getDisplayId());
}
final boolean magnifying = mMagnifedViewport.isMagnifyingLocked();
if (magnifying) {
switch (transition) {
- case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
- case WindowManagerPolicy.TRANSIT_TASK_OPEN:
- case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
- case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN:
- case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE:
- case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN: {
+ case AppTransition.TRANSIT_ACTIVITY_OPEN:
+ case AppTransition.TRANSIT_TASK_OPEN:
+ case AppTransition.TRANSIT_TASK_TO_FRONT:
+ case AppTransition.TRANSIT_WALLPAPER_OPEN:
+ case AppTransition.TRANSIT_WALLPAPER_CLOSE:
+ case AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN: {
mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_USER_CONTEXT_CHANGED);
}
}
}
+ }
+
+ public void onWindowTransitionLocked(WindowState windowState, int transition) {
+ if (DEBUG_WINDOW_TRANSITIONS) {
+ Slog.i(LOG_TAG, "Window transition: "
+ + AppTransition.appTransitionToString(transition)
+ + " displayId: " + windowState.getDisplayId());
+ }
+ final boolean magnifying = mMagnifedViewport.isMagnifyingLocked();
final int type = windowState.mAttrs.type;
switch (transition) {
case WindowManagerPolicy.TRANSIT_ENTER:
@@ -459,7 +467,6 @@
private static final int MIN_ALPHA = 0;
private static final int MAX_ALPHA = 255;
- private final Point mTempPoint = new Point();
private final Region mBounds = new Region();
private final Rect mDirtyRect = new Rect();
private final Paint mPaint = new Paint();
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index a9f3c0f..d5144fb 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -19,6 +19,7 @@
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.util.TimeUtils;
+import android.util.TypedValue;
import android.view.Display;
import android.view.Surface;
import android.view.WindowManagerPolicy;
@@ -37,6 +38,10 @@
public class WindowAnimator {
private static final String TAG = "WindowAnimator";
+ /** Amount of time in milliseconds to animate the dim surface from one value to another,
+ * when no window animation is driving it. */
+ static final int DEFAULT_DIM_DURATION = 200;
+
final WindowManagerService mService;
final Context mContext;
final WindowManagerPolicy mPolicy;
@@ -115,7 +120,7 @@
final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
if (displayAnimator != null) {
if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
- displayAnimator.mWindowAnimationBackgroundSurface.kill();
+ displayAnimator.mWindowAnimationBackgroundSurface.destroySurface();
displayAnimator.mWindowAnimationBackgroundSurface = null;
}
if (displayAnimator.mScreenRotationAnimation != null) {
@@ -123,7 +128,7 @@
displayAnimator.mScreenRotationAnimation = null;
}
if (displayAnimator.mDimAnimator != null) {
- displayAnimator.mDimAnimator.kill();
+ displayAnimator.mDimAnimator.destroySurface();
displayAnimator.mDimAnimator = null;
}
}
@@ -359,8 +364,6 @@
WindowStateAnimator windowAnimationBackground = null;
int windowAnimationBackgroundColor = 0;
WindowState detachedWallpaper = null;
- final DimSurface windowAnimationBackgroundSurface =
- displayAnimator.mWindowAnimationBackgroundSurface;
for (int i = windows.size() - 1; i >= 0; i--) {
final WindowState win = windows.get(i);
@@ -440,15 +443,11 @@
}
}
- if (windowAnimationBackgroundSurface != null) {
- windowAnimationBackgroundSurface.show(
- animLayer - WindowManagerService.LAYER_OFFSET_DIM,
- windowAnimationBackgroundColor);
- }
+ displayAnimator.mWindowAnimationBackgroundSurface.show(
+ animLayer - WindowManagerService.LAYER_OFFSET_DIM,
+ ((windowAnimationBackgroundColor >> 24) & 0xff) / 255f, 0);
} else {
- if (windowAnimationBackgroundSurface != null) {
- windowAnimationBackgroundSurface.hide();
- }
+ displayAnimator.mWindowAnimationBackgroundSurface.hide();
}
}
@@ -499,8 +498,19 @@
updateWallpaperLocked(displayId);
}
- // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
- /** Locked on mService.mWindowMap and this. */
+ private long getDimBehindFadeDuration(long duration) {
+ TypedValue tv = new TypedValue();
+ mContext.getResources().getValue(
+ com.android.internal.R.fraction.config_dimBehindFadeDuration, tv, true);
+ if (tv.type == TypedValue.TYPE_FRACTION) {
+ duration = (long)tv.getFraction(duration, duration);
+ } else if (tv.type >= TypedValue.TYPE_FIRST_INT && tv.type <= TypedValue.TYPE_LAST_INT) {
+ duration = tv.data;
+ }
+ return duration;
+ }
+
+ /** Locked on mService.mWindowMap. */
private void animateLocked() {
if (!mInitialized) {
return;
@@ -561,15 +571,38 @@
screenRotationAnimation.updateSurfacesInTransaction();
}
- final DimAnimator.Parameters dimParams = displayAnimator.mDimParams;
- final DimAnimator dimAnimator = displayAnimator.mDimAnimator;
- if (dimAnimator != null && dimParams != null) {
- dimAnimator.updateParameters(mContext.getResources(), dimParams, mCurrentTime);
+ final DimLayer dimAnimator = displayAnimator.mDimAnimator;
+ final WindowStateAnimator winAnimator = displayAnimator.mDimWinAnimator;
+ final float dimAmount;
+ if (winAnimator == null) {
+ dimAmount = 0;
+ } else {
+ dimAmount = winAnimator.mWin.mAttrs.dimAmount;
}
- if (dimAnimator != null && dimAnimator.mDimShown) {
- mAnimating |= dimAnimator.updateSurface(isDimmingLocked(displayId),
- mCurrentTime, !mService.okToDisplay());
+ final float targetAlpha = dimAnimator.getTargetAlpha();
+ if (targetAlpha != dimAmount) {
+ if (winAnimator == null) {
+ dimAnimator.hide(DEFAULT_DIM_DURATION);
+ } else {
+ long duration = (winAnimator.mAnimating && winAnimator.mAnimation != null)
+ ? winAnimator.mAnimation.computeDurationHint()
+ : DEFAULT_DIM_DURATION;
+ if (targetAlpha > dimAmount) {
+ duration = getDimBehindFadeDuration(duration);
+ }
+ dimAnimator.show(winAnimator.mAnimLayer -
+ WindowManagerService.LAYER_OFFSET_DIM, dimAmount, duration);
+ }
}
+ if (dimAnimator.isAnimating()) {
+ if (!mService.okToDisplay()) {
+ // Jump to the end of the animation.
+ dimAnimator.show();
+ } else {
+ mAnimating |= dimAnimator.stepAnimation();
+ }
+ }
+
//TODO (multidisplay): Magnification is supported only for the default display.
if (mService.mDisplayMagnifier != null && displayId == Display.DEFAULT_DISPLAY) {
mService.mDisplayMagnifier.drawMagnifiedRegionBorderIfNeededLocked();
@@ -628,13 +661,18 @@
}
boolean isDimmingLocked(int displayId) {
- return getDisplayContentsAnimatorLocked(displayId).mDimParams != null;
+ return getDisplayContentsAnimatorLocked(displayId).mDimAnimator.isDimming();
}
boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
- DimAnimator.Parameters dimParams =
- getDisplayContentsAnimatorLocked(winAnimator.mWin.getDisplayId()).mDimParams;
- return dimParams != null && dimParams.mDimWinAnimator == winAnimator;
+ final int displayId = winAnimator.mWin.getDisplayId();
+ DisplayContentsAnimator displayAnimator =
+ getDisplayContentsAnimatorLocked(displayId);
+ if (displayAnimator != null) {
+ return displayAnimator.mDimWinAnimator == winAnimator
+ && displayAnimator.mDimAnimator.isDimming();
+ }
+ return false;
}
static String bulkUpdateParamsToString(int bulkUpdateParams) {
@@ -675,24 +713,16 @@
pw.print(": "); pw.println(wanim);
}
if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
- if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.mDimShown) {
+ if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.isDimming()) {
pw.print(subPrefix); pw.println("mWindowAnimationBackgroundSurface:");
displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
}
}
- if (displayAnimator.mDimAnimator != null) {
- if (dumpAll || displayAnimator.mDimAnimator.mDimShown) {
- pw.print(subPrefix); pw.println("mDimAnimator:");
- displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
- }
- } else if (dumpAll) {
- pw.print(subPrefix); pw.println("no DimAnimator ");
- }
- if (displayAnimator.mDimParams != null) {
- pw.print(subPrefix); pw.println("mDimParams:");
- displayAnimator.mDimParams.printTo(subSubPrefix, pw);
- } else if (dumpAll) {
- pw.print(subPrefix); pw.println("no DimParams ");
+ if (dumpAll || displayAnimator.mDimAnimator.isDimming()) {
+ pw.print(subPrefix); pw.println("mDimAnimator:");
+ displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
+ pw.print(subPrefix); pw.print("mDimWinAnimator=");
+ pw.println(displayAnimator.mDimWinAnimator);
}
if (displayAnimator.mScreenRotationAnimation != null) {
pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
@@ -751,23 +781,18 @@
}
}
- void setDimParamsLocked(int displayId, DimAnimator.Parameters dimParams) {
+ void setDimWinAnimatorLocked(int displayId, WindowStateAnimator newWinAnimator) {
DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
- if (dimParams == null) {
- displayAnimator.mDimParams = null;
+ if (newWinAnimator == null) {
+ displayAnimator.mDimWinAnimator = null;
} else {
- final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
-
// Only set dim params on the highest dimmed layer.
- final WindowStateAnimator existingDimWinAnimator =
- displayAnimator.mDimParams == null ?
- null : displayAnimator.mDimParams.mDimWinAnimator;
- // Don't turn on for an unshown surface, or for any layer but the highest
- // dimmed layer.
+ final WindowStateAnimator existingDimWinAnimator = displayAnimator.mDimWinAnimator;
+ // Don't turn on for an unshown surface, or for any layer but the highest dimmed layer.
if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null
|| !existingDimWinAnimator.mSurfaceShown
|| existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
- displayAnimator.mDimParams = new DimAnimator.Parameters(dimParams);
+ displayAnimator.mDimWinAnimator = newWinAnimator;
}
}
}
@@ -790,15 +815,14 @@
}
private class DisplayContentsAnimator {
- DimAnimator mDimAnimator = null;
- DimAnimator.Parameters mDimParams = null;
- DimSurface mWindowAnimationBackgroundSurface = null;
+ DimLayer mDimAnimator = null;
+ WindowStateAnimator mDimWinAnimator = null;
+ DimLayer mWindowAnimationBackgroundSurface = null;
ScreenRotationAnimation mScreenRotationAnimation = null;
public DisplayContentsAnimator(int displayId) {
- mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
- mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession,
- mService.getDisplayContentLocked(displayId));
+ mDimAnimator = new DimLayer(mService, displayId);
+ mWindowAnimationBackgroundSurface = new DimLayer(mService, displayId);
}
}
}
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index c67a465..dd99322 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -250,11 +250,6 @@
*/
static final int MAX_ANIMATION_DURATION = 10*1000;
- /** Amount of time (in milliseconds) to animate the dim surface from one
- * value to another, when no window animation is driving it.
- */
- static final int DEFAULT_DIM_DURATION = 200;
-
/** Amount of time (in milliseconds) to animate the fade-in-out transition for
* compatible windows.
*/
@@ -324,6 +319,7 @@
/**
* Mapping from an IWindow IBinder to the server's Window object.
* This is also used as the lock for all of our state.
+ * NOTE: Never call into methods that lock ActivityManagerService while holding this object.
*/
final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>();
@@ -1113,7 +1109,6 @@
}
}
- /** TODO(cmautner): Is this the same as {@link WindowState#canReceiveKeys()} */
static boolean canBeImeTarget(WindowState w) {
final int fl = w.mAttrs.flags
& (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM);
@@ -1969,12 +1964,7 @@
winAnimator.computeShownFrameLocked();
// No need to lay out the windows - we can just set the wallpaper position
// directly.
- // TODO(cmautner): Don't move this from here, just lock the WindowAnimator.
- if (winAnimator.mSurfaceX != wallpaper.mShownFrame.left
- || winAnimator.mSurfaceY != wallpaper.mShownFrame.top) {
- winAnimator.setWallpaperOffset((int) wallpaper.mShownFrame.left,
- (int) wallpaper.mShownFrame.top);
- }
+ winAnimator.setWallpaperOffset(wallpaper.mShownFrame);
// We only want to be synchronous with one wallpaper.
sync = false;
}
@@ -2478,19 +2468,13 @@
}
}
- // TODO(cmautner): Move to WindowStateAnimator.
- void setTransparentRegionHint(final WindowStateAnimator winAnimator, final Region region) {
- mH.sendMessage(mH.obtainMessage(H.SET_TRANSPARENT_REGION,
- new Pair<WindowStateAnimator, Region>(winAnimator, region)));
- }
-
void setTransparentRegionWindow(Session session, IWindow client, Region region) {
long origId = Binder.clearCallingIdentity();
try {
synchronized (mWindowMap) {
WindowState w = windowForClientLocked(session, client, false);
if ((w != null) && w.mHasSurface) {
- setTransparentRegionHint(w.mWinAnimator, region);
+ w.mWinAnimator.setTransparentRegionHintLocked(region);
}
}
} finally {
@@ -2652,7 +2636,6 @@
long origId = Binder.clearCallingIdentity();
synchronized(mWindowMap) {
- // TODO(cmautner): synchronize on mAnimator or win.mWinAnimator.
WindowState win = windowForClientLocked(session, client, false);
if (win == null) {
return 0;
@@ -2973,18 +2956,21 @@
public void finishDrawingWindow(Session session, IWindow client) {
final long origId = Binder.clearCallingIdentity();
- synchronized (mWindowMap) {
- WindowState win = windowForClientLocked(session, client, false);
- if (win != null && win.mWinAnimator.finishDrawingLocked()) {
- if ((win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
- getDefaultDisplayContentLocked().pendingLayoutChanges |=
- WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
+ try {
+ synchronized (mWindowMap) {
+ WindowState win = windowForClientLocked(session, client, false);
+ if (win != null && win.mWinAnimator.finishDrawingLocked()) {
+ if ((win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
+ getDefaultDisplayContentLocked().pendingLayoutChanges |=
+ WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
+ }
+ win.mDisplayContent.layoutNeeded = true;
+ requestTraversalLocked();
}
- win.mDisplayContent.layoutNeeded = true;
- performLayoutAndPlaceSurfacesLocked();
}
+ } finally {
+ Binder.restoreCallingIdentity(origId);
}
- Binder.restoreCallingIdentity(origId);
}
@Override
@@ -3622,14 +3608,14 @@
if (!mAppTransition.isTransitionSet() || mAppTransition.isTransitionNone()) {
mAppTransition.setAppTransition(transit);
} else if (!alwaysKeepCurrent) {
- if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN
+ if (transit == AppTransition.TRANSIT_TASK_OPEN
&& mAppTransition.isTransitionEqual(
- WindowManagerPolicy.TRANSIT_TASK_CLOSE)) {
+ AppTransition.TRANSIT_TASK_CLOSE)) {
// Opening a new task always supersedes a close for the anim.
mAppTransition.setAppTransition(transit);
- } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
+ } else if (transit == AppTransition.TRANSIT_ACTIVITY_OPEN
&& mAppTransition.isTransitionEqual(
- WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE)) {
+ AppTransition.TRANSIT_ACTIVITY_CLOSE)) {
// Opening a new activity always supersedes a close for the anim.
mAppTransition.setAppTransition(transit);
}
@@ -3948,7 +3934,7 @@
boolean runningAppAnimation = false;
- if (transit != WindowManagerPolicy.TRANSIT_UNSET) {
+ if (transit != AppTransition.TRANSIT_UNSET) {
if (wtoken.mAppAnimator.animation == AppWindowAnimator.sDummyAnimation) {
wtoken.mAppAnimator.animation = null;
}
@@ -3959,7 +3945,7 @@
//TODO (multidisplay): Magnification is supported only for the default display.
if (window != null && mDisplayMagnifier != null
&& window.getDisplayId() == Display.DEFAULT_DISPLAY) {
- mDisplayMagnifier.onWindowTransitionLocked(window, transit);
+ mDisplayMagnifier.onAppWindowTransitionLocked(window, transit);
}
changed = true;
}
@@ -4127,7 +4113,7 @@
}
final long origId = Binder.clearCallingIdentity();
- setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET,
+ setTokenVisibilityLocked(wtoken, null, visible, AppTransition.TRANSIT_UNSET,
true);
wtoken.updateReportedVisibilityLocked();
Binder.restoreCallingIdentity(origId);
@@ -4259,7 +4245,7 @@
if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) {
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken);
delayed = setTokenVisibilityLocked(wtoken, null, false,
- WindowManagerPolicy.TRANSIT_UNSET, true);
+ AppTransition.TRANSIT_UNSET, true);
wtoken.inPendingTransaction = false;
mOpeningApps.remove(wtoken);
wtoken.waitingToShow = false;
@@ -4812,6 +4798,7 @@
mH.sendEmptyMessage(H.PERSIST_ANIMATION_SCALE);
}
+ @Override
public void setAnimationScales(float[] scales) {
if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
"setAnimationScale()")) {
@@ -4839,6 +4826,7 @@
ValueAnimator.setDurationScale(scale);
}
+ @Override
public float getAnimationScale(int which) {
switch (which) {
case 0: return mWindowAnimationScale;
@@ -4848,6 +4836,7 @@
return 0;
}
+ @Override
public float[] getAnimationScales() {
return new float[] { mWindowAnimationScale, mTransitionAnimationScale,
mAnimatorDurationScale };
@@ -6621,12 +6610,6 @@
public static final int CLIENT_FREEZE_TIMEOUT = 30;
- public static final int ANIMATOR_WHAT_OFFSET = 100000;
- public static final int SET_TRANSPARENT_REGION = ANIMATOR_WHAT_OFFSET + 1;
-
- public H() {
- }
-
@Override
public void handleMessage(Message msg) {
if (DEBUG_WINDOW_TRACE) {
@@ -6878,10 +6861,8 @@
case APP_TRANSITION_TIMEOUT: {
synchronized (mWindowMap) {
if (mAppTransition.isTransitionSet()) {
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
- "*** APP TRANSITION TIMEOUT");
- mAppTransition.setReady();
- mAppTransition.setTimeout(true);
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** APP TRANSITION TIMEOUT");
+ mAppTransition.setTimeout();
mAnimatingAppTokens.clear();
mAnimatingAppTokens.addAll(mAppTokens);
performLayoutAndPlaceSurfacesLocked();
@@ -7030,15 +7011,6 @@
break;
}
- // Animation messages. Move to Window{State}Animator
- case SET_TRANSPARENT_REGION: {
- Pair<WindowStateAnimator, Region> pair =
- (Pair<WindowStateAnimator, Region>) msg.obj;
- final WindowStateAnimator winAnimator = pair.first;
- winAnimator.setTransparentRegionHint(pair.second);
- break;
- }
-
case DO_ANIMATION_CALLBACK: {
try {
((IRemoteCallback)msg.obj).sendResult(null);
@@ -7146,13 +7118,13 @@
}
public void getInitialDisplaySize(int displayId, Point size) {
- // TODO(cmautner): Access to DisplayContent should be locked on mWindowMap. Doing that
- // could lead to deadlock since this is called from ActivityManager.
- final DisplayContent displayContent = getDisplayContentLocked(displayId);
- if (displayContent != null) {
- synchronized(displayContent.mDisplaySizeLock) {
- size.x = displayContent.mInitialDisplayWidth;
- size.y = displayContent.mInitialDisplayHeight;
+ synchronized (mWindowMap) {
+ final DisplayContent displayContent = getDisplayContentLocked(displayId);
+ if (displayContent != null) {
+ synchronized(displayContent.mDisplaySizeLock) {
+ size.x = displayContent.mInitialDisplayWidth;
+ size.y = displayContent.mInitialDisplayHeight;
+ }
}
}
}
@@ -7813,7 +7785,7 @@
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
int transit = mAppTransition.getAppTransition();
if (mSkipAppTransitionAnimation) {
- transit = WindowManagerPolicy.TRANSIT_UNSET;
+ transit = AppTransition.TRANSIT_UNSET;
}
mAppTransition.goodToGo();
mStartingIconInTransition = false;
@@ -7901,28 +7873,28 @@
if (closingAppHasWallpaper && openingAppHasWallpaper) {
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!");
switch (transit) {
- case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
- case WindowManagerPolicy.TRANSIT_TASK_OPEN:
- case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
- transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN;
+ case AppTransition.TRANSIT_ACTIVITY_OPEN:
+ case AppTransition.TRANSIT_TASK_OPEN:
+ case AppTransition.TRANSIT_TASK_TO_FRONT:
+ transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN;
break;
- case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
- case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
- case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
- transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE;
+ case AppTransition.TRANSIT_ACTIVITY_CLOSE:
+ case AppTransition.TRANSIT_TASK_CLOSE:
+ case AppTransition.TRANSIT_TASK_TO_BACK:
+ transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE;
break;
}
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit: " + transit);
} else if ((oldWallpaper != null) && !mOpeningApps.contains(oldWallpaper.mAppToken)) {
// We are transitioning from an activity with
// a wallpaper to one without.
- transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE;
+ transit = AppTransition.TRANSIT_WALLPAPER_CLOSE;
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
"New transit away from wallpaper: " + transit);
} else if (mWallpaperTarget != null && mWallpaperTarget.isVisibleLw()) {
// We are transitioning from an activity without
// a wallpaper to now showing the wallpaper
- transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN;
+ transit = AppTransition.TRANSIT_WALLPAPER_OPEN;
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
"New transit into wallpaper: " + transit);
}
@@ -8065,7 +8037,7 @@
private int handleAnimatingStoppedAndTransitionLocked() {
int changes = 0;
- mAppTransition.setRunning(false);
+ mAppTransition.setIdle();
// Restore window app tokens to the ActivityManager views
for (int i = mAnimatingAppTokens.size() - 1; i >= 0; i--) {
mAnimatingAppTokens.get(i).sendingToBottom = false;
@@ -8219,18 +8191,8 @@
mInnerFields.mDimming = true;
final WindowStateAnimator winAnimator = w.mWinAnimator;
if (!mAnimator.isDimmingLocked(winAnimator)) {
- final int width, height;
- if (attrs.type == TYPE_BOOT_PROGRESS) {
- final DisplayInfo displayInfo = w.mDisplayContent.getDisplayInfo();
- width = displayInfo.logicalWidth;
- height = displayInfo.logicalHeight;
- } else {
- width = innerDw;
- height = innerDh;
- }
if (localLOGV) Slog.v(TAG, "Win " + w + " start dimming.");
- startDimmingLocked(
- winAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount, width, height);
+ startDimmingLocked(winAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount);
}
}
}
@@ -8926,14 +8888,12 @@
}
}
- void startDimmingLocked(final WindowStateAnimator winAnimator, final float target,
- final int width, final int height) {
- mAnimator.setDimParamsLocked(winAnimator.mWin.getDisplayId(),
- new DimAnimator.Parameters(winAnimator, width, height, target));
+ void startDimmingLocked(final WindowStateAnimator winAnimator, final float target) {
+ mAnimator.setDimWinAnimatorLocked(winAnimator.mWin.getDisplayId(), winAnimator);
}
void stopDimmingLocked(int displayId) {
- mAnimator.setDimParamsLocked(displayId, null);
+ mAnimator.setDimWinAnimatorLocked(displayId, null);
}
private boolean needsLayout() {
@@ -8950,8 +8910,6 @@
boolean doRequest = false;
final int bulkUpdateParams = mAnimator.mBulkUpdateParams;
- // TODO(cmautner): As the number of bits grows, use masks of bit groups to
- // eliminate unnecessary tests.
if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
mInnerFields.mUpdateRotation = true;
doRequest = true;
@@ -9250,9 +9208,7 @@
mPolicy.setLastInputMethodWindowLw(null, null);
if (mAppTransition.isTransitionSet()) {
- mAppTransition.setAppTransition(WindowManagerPolicy.TRANSIT_UNSET);
- mAppTransition.clear();
- mAppTransition.setReady();
+ mAppTransition.freeze();
}
if (PROFILE_ORIENTATION) {
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index 5fd42c2..cb11be3 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -945,11 +945,11 @@
}
}
- /** Returns true if this window desires key events.
- * TODO(cmautner): Is this the same as {@link WindowManagerService#canBeImeTarget}
+ /**
+ * @return true if this window desires key events.
*/
public final boolean canReceiveKeys() {
- return isVisibleOrAdding()
+ return isVisibleOrAdding()
&& (mViewVisibility == View.VISIBLE)
&& ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0);
}
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index 5b7cb99..a4c6a9e 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -12,6 +12,7 @@
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.graphics.Region;
import android.os.Debug;
import android.util.Slog;
@@ -1183,9 +1184,7 @@
mAnimator.setPendingLayoutChanges(displayId,
WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
if ((w.mAttrs.flags & LayoutParams.FLAG_DIM_BEHIND) != 0) {
- final DisplayInfo displayInfo = mWin.mDisplayContent.getDisplayInfo();
- mService.startDimmingLocked(this, w.mExiting ? 0 : w.mAttrs.dimAmount,
- displayInfo.appWidth, displayInfo.appHeight);
+ mService.startDimmingLocked(this, w.mExiting ? 0 : w.mAttrs.dimAmount);
}
} catch (RuntimeException e) {
// If something goes wrong with the surface (such
@@ -1318,7 +1317,7 @@
}
}
- void setTransparentRegionHint(final Region region) {
+ void setTransparentRegionHintLocked(final Region region) {
if (mSurface == null) {
Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true");
return;
@@ -1337,31 +1336,35 @@
}
}
- void setWallpaperOffset(int left, int top) {
- mSurfaceX = left;
- mSurfaceY = top;
- if (mAnimating) {
- // If this window (or its app token) is animating, then the position
- // of the surface will be re-computed on the next animation frame.
- // We can't poke it directly here because it depends on whatever
- // transformation is being applied by the animation.
- return;
- }
- if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
- ">>> OPEN TRANSACTION setWallpaperOffset");
- Surface.openTransaction();
- try {
- if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin,
- "POS " + left + ", " + top, null);
- mSurface.setPosition(mWin.mFrame.left + left, mWin.mFrame.top + top);
- updateSurfaceWindowCrop(false);
- } catch (RuntimeException e) {
- Slog.w(TAG, "Error positioning surface of " + mWin
- + " pos=(" + left + "," + top + ")", e);
- } finally {
- Surface.closeTransaction();
+ void setWallpaperOffset(RectF shownFrame) {
+ final int left = (int) shownFrame.left;
+ final int top = (int) shownFrame.top;
+ if (mSurfaceX != left || mSurfaceY != top) {
+ mSurfaceX = left;
+ mSurfaceY = top;
+ if (mAnimating) {
+ // If this window (or its app token) is animating, then the position
+ // of the surface will be re-computed on the next animation frame.
+ // We can't poke it directly here because it depends on whatever
+ // transformation is being applied by the animation.
+ return;
+ }
if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
- "<<< CLOSE TRANSACTION setWallpaperOffset");
+ ">>> OPEN TRANSACTION setWallpaperOffset");
+ Surface.openTransaction();
+ try {
+ if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin,
+ "POS " + left + ", " + top, null);
+ mSurface.setPosition(mWin.mFrame.left + left, mWin.mFrame.top + top);
+ updateSurfaceWindowCrop(false);
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Error positioning surface of " + mWin
+ + " pos=(" + left + "," + top + ")", e);
+ } finally {
+ Surface.closeTransaction();
+ if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
+ "<<< CLOSE TRANSACTION setWallpaperOffset");
+ }
}
}
@@ -1511,10 +1514,9 @@
}
}
- // TODO(cmautner): Move back to WindowState?
/**
* Choose the correct animation and set it to the passed WindowState.
- * @param transit If WindowManagerPolicy.TRANSIT_PREVIEW_DONE and the app window has been drawn
+ * @param transit If AppTransition.TRANSIT_PREVIEW_DONE and the app window has been drawn
* then the animation will be app_starting_exit. Any other value loads the animation from
* the switch statement below.
* @param isEntrance The animation type the last time this was called. Used to keep from
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index 1974e0f..7d2ba19 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -33,6 +33,24 @@
<meta-data android:name="android.graphics.renderThread" android:value="true" />
<activity
+ android:name="ScaledTextActivity"
+ android:label="_ScaledText">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name="ScaledPathsActivity"
+ android:label="_ScaledPaths">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name="Alpha8BitmapActivity"
android:label="_Alpha8Bitmap">
<intent-filter>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ScaledPathsActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ScaledPathsActivity.java
new file mode 100644
index 0000000..deb4b6b
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ScaledPathsActivity.java
@@ -0,0 +1,92 @@
+/*
+ * 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.test.hwui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.RectF;
+import android.os.Bundle;
+import android.view.View;
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class ScaledPathsActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ final PathsView view = new PathsView(this);
+ setContentView(view);
+ }
+
+ public static class PathsView extends View {
+ private final Paint mPathPaint;
+ private final Path mPath;
+ private final RectF mPathBounds = new RectF();
+
+ public PathsView(Context c) {
+ super(c);
+
+ mPathPaint = new Paint();
+ mPathPaint.setAntiAlias(true);
+ mPathPaint.setColor(0xff0000ff);
+ mPathPaint.setStrokeWidth(5.0f);
+ mPathPaint.setStyle(Paint.Style.FILL);
+
+ mPath = new Path();
+ mPath.moveTo(0.0f, 0.0f);
+ mPath.cubicTo(0.0f, 0.0f, 100.0f, 150.0f, 100.0f, 200.0f);
+ mPath.cubicTo(100.0f, 200.0f, 50.0f, 300.0f, -80.0f, 200.0f);
+ mPath.cubicTo(-80.0f, 200.0f, 100.0f, 200.0f, 200.0f, 0.0f);
+
+ mPath.computeBounds(mPathBounds, true);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ canvas.drawARGB(255, 255, 255, 255);
+
+ mPathPaint.setColor(0xff0000ff);
+ mPathPaint.setStyle(Paint.Style.FILL);
+
+ canvas.save();
+ drawPath(canvas, 1.0f, 1.0f);
+ drawPath(canvas, 2.0f, 2.0f);
+ drawPath(canvas, 4.0f, 4.0f);
+ canvas.restore();
+
+ mPathPaint.setColor(0xffff0000);
+ mPathPaint.setStyle(Paint.Style.STROKE);
+
+ canvas.save();
+ drawPath(canvas, 1.0f, 1.0f);
+ drawPath(canvas, 2.0f, 2.0f);
+ drawPath(canvas, 4.0f, 4.0f);
+ canvas.restore();
+ }
+
+ private void drawPath(Canvas canvas, float scaleX, float scaleY) {
+ canvas.save();
+ canvas.scale(scaleX, scaleY);
+ canvas.drawPath(mPath, mPathPaint);
+ canvas.restore();
+ canvas.translate(mPathBounds.width() * scaleX, 0.0f);
+ }
+ }
+}
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ScaledTextActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ScaledTextActivity.java
new file mode 100644
index 0000000..2e1487d
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ScaledTextActivity.java
@@ -0,0 +1,79 @@
+/*
+ * 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.test.hwui;
+
+import android.animation.ObjectAnimator;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.os.Bundle;
+import android.view.View;
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class ScaledTextActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final ScaledTextView view = new ScaledTextView(this);
+ setContentView(view);
+
+ ObjectAnimator animation = ObjectAnimator.ofFloat(view, "textScale", 1.0f, 10.0f);
+ animation.setDuration(3000);
+ animation.setRepeatCount(ObjectAnimator.INFINITE);
+ animation.setRepeatMode(ObjectAnimator.REVERSE);
+ animation.start();
+
+ }
+
+ public static class ScaledTextView extends View {
+ private final Paint mPaint;
+ private float mScale = 1.0f;
+
+ public ScaledTextView(Context c) {
+ super(c);
+
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true);
+ mPaint.setTextSize(20.0f);
+ }
+
+ public float getTextScale() {
+ return mScale;
+ }
+
+ public void setTextScale(float scale) {
+ mScale = scale;
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ canvas.drawARGB(255, 255, 255, 255);
+
+ canvas.drawText("Hello libhwui!", 30.0f, 30.0f, mPaint);
+ canvas.translate(0.0f, 50.0f);
+ canvas.save();
+ canvas.scale(mScale, mScale);
+ canvas.drawText("Hello libhwui!", 30.0f, 30.0f, mPaint);
+ canvas.restore();
+ }
+ }
+}