Merge "Allow pattern to start from outside pattern view" into jb-mr1-dev
diff --git a/api/current.txt b/api/current.txt
index 9d7bb14..1e3e2bb 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -3353,6 +3353,7 @@
method public final android.app.FragmentManager getFragmentManager();
method public final int getId();
method public android.app.LoaderManager getLoaderManager();
+ method public final android.app.Fragment getParentFragment();
method public final android.content.res.Resources getResources();
method public final boolean getRetainInstance();
method public final java.lang.String getString(int);
@@ -10216,6 +10217,7 @@
method public final android.os.IBinder onBind(android.content.Intent);
method public abstract android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodImpl onCreateInputMethodInterface();
method public abstract android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodSessionImpl onCreateInputMethodSessionInterface();
+ method public boolean onGenericMotionEvent(android.view.MotionEvent);
method public boolean onTrackballEvent(android.view.MotionEvent);
}
@@ -10228,6 +10230,7 @@
public abstract class AbstractInputMethodService.AbstractInputMethodSessionImpl implements android.view.inputmethod.InputMethodSession {
ctor public AbstractInputMethodService.AbstractInputMethodSessionImpl();
+ method public void dispatchGenericMotionEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
method public void dispatchKeyEvent(int, android.view.KeyEvent, android.view.inputmethod.InputMethodSession.EventCallback);
method public void dispatchTrackballEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
method public boolean isEnabled();
@@ -18383,6 +18386,7 @@
field public static final java.lang.String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH";
field public static final deprecated java.lang.String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER";
field public static final java.lang.String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
+ field public static final java.lang.String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE = "android.media.action.STILL_IMAGE_CAMERA_SECURE";
field public static final java.lang.String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
field public static final java.lang.String MEDIA_IGNORE_FILENAME = ".nomedia";
field public static final java.lang.String MEDIA_SCANNER_VOLUME = "volume";
@@ -26695,6 +26699,7 @@
public abstract interface InputMethodSession {
method public abstract void appPrivateCommand(java.lang.String, android.os.Bundle);
+ method public abstract void dispatchGenericMotionEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
method public abstract void dispatchKeyEvent(int, android.view.KeyEvent, android.view.inputmethod.InputMethodSession.EventCallback);
method public abstract void dispatchTrackballEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
method public abstract void displayCompletions(android.view.inputmethod.CompletionInfo[]);
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index bb108c8..89287ad 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -63,7 +63,7 @@
private boolean mStopOption = false;
private int mRepeat = 0;
- private int mUserId = 0;
+ private int mUserId;
private String mProfileFile;
@@ -160,7 +160,7 @@
return userId;
}
- private Intent makeIntent() throws URISyntaxException {
+ private Intent makeIntent(int defUser) throws URISyntaxException {
Intent intent = new Intent();
Intent baseIntent = intent;
boolean hasIntentInfo = false;
@@ -170,7 +170,7 @@
mStopOption = false;
mRepeat = 0;
mProfileFile = null;
- mUserId = 0;
+ mUserId = defUser;
Uri data = null;
String type = null;
@@ -404,7 +404,7 @@
}
private void runStartService() throws Exception {
- Intent intent = makeIntent();
+ Intent intent = makeIntent(UserHandle.USER_CURRENT);
if (mUserId == UserHandle.USER_ALL) {
System.err.println("Error: Can't start activity with user 'all'");
return;
@@ -417,7 +417,7 @@
}
private void runStart() throws Exception {
- Intent intent = makeIntent();
+ Intent intent = makeIntent(UserHandle.USER_CURRENT);
if (mUserId == UserHandle.USER_ALL) {
System.err.println("Error: Can't start service with user 'all'");
@@ -456,7 +456,7 @@
packageName = activities.get(0).activityInfo.packageName;
}
System.out.println("Stopping: " + packageName);
- mAm.forceStopPackage(packageName);
+ mAm.forceStopPackage(packageName, mUserId);
Thread.sleep(250);
}
@@ -570,11 +570,33 @@
}
private void runForceStop() throws Exception {
- mAm.forceStopPackage(nextArgRequired());
+ int userId = UserHandle.USER_ALL;
+
+ String opt;
+ while ((opt=nextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = parseUserArg(nextArgRequired());
+ } else {
+ System.err.println("Error: Unknown option: " + opt);
+ return;
+ }
+ }
+ mAm.forceStopPackage(nextArgRequired(), userId);
}
private void runKill() throws Exception {
- mAm.killBackgroundProcesses(nextArgRequired());
+ int userId = UserHandle.USER_ALL;
+
+ String opt;
+ while ((opt=nextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = parseUserArg(nextArgRequired());
+ } else {
+ System.err.println("Error: Unknown option: " + opt);
+ return;
+ }
+ }
+ mAm.killBackgroundProcesses(nextArgRequired(), userId);
}
private void runKillAll() throws Exception {
@@ -582,7 +604,7 @@
}
private void sendBroadcast() throws Exception {
- Intent intent = makeIntent();
+ Intent intent = makeIntent(UserHandle.USER_ALL);
IntentReceiver receiver = new IntentReceiver();
System.out.println("Broadcasting: " + intent);
mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false,
@@ -595,7 +617,7 @@
boolean wait = false;
boolean rawMode = false;
boolean no_window_animation = false;
- int userId = 0;
+ int userId = UserHandle.USER_CURRENT;
Bundle args = new Bundle();
String argKey = null, argValue = null;
IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
@@ -672,17 +694,37 @@
String profileFile = null;
boolean start = false;
boolean wall = false;
+ int userId = UserHandle.USER_CURRENT;
int profileType = 0;
-
+
String process = null;
-
+
String cmd = nextArgRequired();
if ("start".equals(cmd)) {
start = true;
- wall = "--wall".equals(nextOption());
+ String opt;
+ while ((opt=nextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = parseUserArg(nextArgRequired());
+ } else if (opt.equals("--wall")) {
+ wall = true;
+ } else {
+ System.err.println("Error: Unknown option: " + opt);
+ return;
+ }
+ }
process = nextArgRequired();
} else if ("stop".equals(cmd)) {
+ String opt;
+ while ((opt=nextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = parseUserArg(nextArgRequired());
+ } else {
+ System.err.println("Error: Unknown option: " + opt);
+ return;
+ }
+ }
process = nextArg();
} else {
// Compatibility with old syntax: process is specified first.
@@ -694,7 +736,12 @@
throw new IllegalArgumentException("Profile command " + process + " not valid");
}
}
-
+
+ if (userId == UserHandle.USER_ALL) {
+ System.err.println("Error: Can't profile with user 'all'");
+ return;
+ }
+
ParcelFileDescriptor fd = null;
if (start) {
@@ -722,7 +769,7 @@
} else if (start) {
//removeWallOption();
}
- if (!mAm.profileControl(process, start, profileFile, fd, profileType)) {
+ if (!mAm.profileControl(process, userId, start, profileFile, fd, profileType)) {
wall = false;
throw new AndroidException("PROFILE FAILED on process " + process);
}
@@ -734,7 +781,24 @@
}
private void runDumpHeap() throws Exception {
- boolean managed = !"-n".equals(nextOption());
+ boolean managed = true;
+ int userId = UserHandle.USER_CURRENT;
+
+ String opt;
+ while ((opt=nextOption()) != null) {
+ if (opt.equals("--user")) {
+ userId = parseUserArg(nextArgRequired());
+ if (userId == UserHandle.USER_ALL) {
+ System.err.println("Error: Can't dump heap with user 'all'");
+ return;
+ }
+ } else if (opt.equals("-n")) {
+ managed = false;
+ } else {
+ System.err.println("Error: Unknown option: " + opt);
+ return;
+ }
+ }
String process = nextArgRequired();
String heapFile = nextArgRequired();
ParcelFileDescriptor fd = null;
@@ -750,7 +814,7 @@
return;
}
- if (!mAm.dumpHeap(process, managed, heapFile, fd)) {
+ if (!mAm.dumpHeap(process, userId, managed, heapFile, fd)) {
throw new AndroidException("HEAP DUMP FAILED on process " + process);
}
}
@@ -1204,7 +1268,7 @@
}
private void runToUri(boolean intentScheme) throws Exception {
- Intent intent = makeIntent();
+ Intent intent = makeIntent(UserHandle.USER_CURRENT);
System.out.println(intent.toUri(intentScheme ? Intent.URI_INTENT_SCHEME : 0));
}
@@ -1363,18 +1427,19 @@
System.err.println(
"usage: am [subcommand] [options]\n" +
"usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]\n" +
- " [--R COUNT] [-S] [--opengl-trace] <INTENT>\n" +
- " am startservice <INTENT>\n" +
- " am force-stop <PACKAGE>\n" +
- " am kill <PACKAGE>\n" +
+ " [--R COUNT] [-S] [--opengl-trace]\n" +
+ " [--user <USER_ID> | current] <INTENT>\n" +
+ " am startservice [--user <USER_ID> | current] <INTENT>\n" +
+ " am force-stop [--user <USER_ID> | all | current] <PACKAGE>\n" +
+ " am kill [--user <USER_ID> | all | current] <PACKAGE>\n" +
" am kill-all\n" +
- " am broadcast <INTENT>\n" +
+ " am broadcast [--user <USER_ID> | all | current] <INTENT>\n" +
" am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" +
- " [--user <USER_ID> | all | current]\n" +
+ " [--user <USER_ID> | current]\n" +
" [--no-window-animation] <COMPONENT>\n" +
- " am profile start <PROCESS> <FILE>\n" +
- " am profile stop [<PROCESS>]\n" +
- " am dumpheap [flags] <PROCESS> <FILE>\n" +
+ " am profile start [--user <USER_ID> current] <PROCESS> <FILE>\n" +
+ " am profile stop [--user <USER_ID> current] [<PROCESS>]\n" +
+ " am dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>\n" +
" am set-debug-app [-w] [--persistent] <PACKAGE>\n" +
" am clear-debug-app\n" +
" am monitor [--gdb <port>]\n" +
@@ -1395,18 +1460,28 @@
" the top activity will be finished.\n" +
" -S: force stop the target app before starting the activity\n" +
" --opengl-trace: enable tracing of OpenGL functions\n" +
+ " --user <USER_ID> | current: Specify which user to run as; if not\n" +
+ " specified then run as the current user.\n" +
"\n" +
- "am startservice: start a Service.\n" +
+ "am startservice: start a Service. Options are:\n" +
+ " --user <USER_ID> | current: Specify which user to run as; if not\n" +
+ " specified then run as the current user.\n" +
"\n" +
"am force-stop: force stop everything associated with <PACKAGE>.\n" +
+ " --user <USER_ID> | all | current: Specify user to force stop;\n" +
+ " all users if not specified.\n" +
"\n" +
"am kill: Kill all processes associated with <PACKAGE>. Only kills.\n" +
" processes that are safe to kill -- that is, will not impact the user\n" +
" experience.\n" +
+ " --user <USER_ID> | all | current: Specify user whose processes to kill;\n" +
+ " all users if not specified.\n" +
"\n" +
"am kill-all: Kill all background processes.\n" +
"\n" +
- "am broadcast: send a broadcast Intent.\n" +
+ "am broadcast: send a broadcast Intent. Options are:\n" +
+ " --user <USER_ID> | all | current: Specify which user to send to; if not\n" +
+ " specified then send to all users.\n" +
"\n" +
"am instrument: start an Instrumentation. Typically this target <COMPONENT>\n" +
" is the form <TEST_PACKAGE>/<RUNNER_CLASS>. Options are:\n" +
@@ -1417,13 +1492,20 @@
" -p <FILE>: write profiling data to <FILE>\n" +
" -w: wait for instrumentation to finish before returning. Required for\n" +
" test runners.\n" +
- " --user [<USER_ID> | all | current]: Specify user instrumentation runs in.\n" +
+ " --user <USER_ID> | current: Specify user instrumentation runs in;\n" +
+ " current user if not specified.\n" +
" --no-window-animation: turn off window animations will running.\n" +
"\n" +
- "am profile: start and stop profiler on a process.\n" +
+ "am profile: start and stop profiler on a process. The given <PROCESS> argument\n" +
+ " may be either a process name or pid. Options are:\n" +
+ " --user <USER_ID> | current: When supplying a process name,\n" +
+ " specify user of process to profile; uses current user if not specified.\n" +
"\n" +
- "am dumpheap: dump the heap of a process. Options are:\n" +
+ "am dumpheap: dump the heap of a process. The given <PROCESS> argument may\n" +
+ " be either a process name or pid. Options are:\n" +
" -n: dump native heap instead of managed heap\n" +
+ " --user <USER_ID> | current: When supplying a process name,\n" +
+ " specify user of process to dump; uses current user if not specified.\n" +
"\n" +
"am set-debug-app: set application <PACKAGE> to debug. Options are:\n" +
" -w: wait for debugger when application starts\n" +
@@ -1444,10 +1526,10 @@
"\n" +
"am to-intent-uri: print the given Intent specification as an intent: URI.\n" +
"\n" +
- "am switch-user: switch to put USER_ID in the foreground, starting" +
+ "am switch-user: switch to put USER_ID in the foreground, starting\n" +
" execution of that user if it is currently stopped.\n" +
"\n" +
- "am stop-user: stop execution of USER_ID, not allowing it to run any" +
+ "am stop-user: stop execution of USER_ID, not allowing it to run any\n" +
" code until a later explicit switch to it.\n" +
"\n" +
"<INTENT> specifications include these flags and arguments:\n" +
@@ -1465,7 +1547,6 @@
" [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]\n" +
" [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]\n" +
" [-n <COMPONENT>] [-f <FLAGS>]\n" +
- " [--user [<USER_ID> | all | current]\n" +
" [--grant-read-uri-permission] [--grant-write-uri-permission]\n" +
" [--debug-log-resolution] [--exclude-stopped-packages]\n" +
" [--include-stopped-packages]\n" +
diff --git a/cmds/input/src/com/android/commands/input/Input.java b/cmds/input/src/com/android/commands/input/Input.java
index 341f30f..a21df0d 100755
--- a/cmds/input/src/com/android/commands/input/Input.java
+++ b/cmds/input/src/com/android/commands/input/Input.java
@@ -66,15 +66,54 @@
}
} else if (command.equals("tap")) {
if (args.length == 3) {
- sendTap(Float.parseFloat(args[1]), Float.parseFloat(args[2]));
+ sendTap(InputDevice.SOURCE_TOUCHSCREEN, Float.parseFloat(args[1]), Float.parseFloat(args[2]));
return;
}
} else if (command.equals("swipe")) {
if (args.length == 5) {
- sendSwipe(Float.parseFloat(args[1]), Float.parseFloat(args[2]),
+ sendSwipe(InputDevice.SOURCE_TOUCHSCREEN, Float.parseFloat(args[1]), Float.parseFloat(args[2]),
Float.parseFloat(args[3]), Float.parseFloat(args[4]));
return;
}
+ } else if (command.equals("touchscreen") || command.equals("touchpad")) {
+ // determine input source
+ int inputSource = InputDevice.SOURCE_TOUCHSCREEN;
+ if (command.equals("touchpad")) {
+ inputSource = InputDevice.SOURCE_TOUCHPAD;
+ }
+ // determine subcommand
+ if (args.length > 1) {
+ String subcommand = args[1];
+ if (subcommand.equals("tap")) {
+ if (args.length == 4) {
+ sendTap(inputSource, Float.parseFloat(args[2]),
+ Float.parseFloat(args[3]));
+ return;
+ }
+ } else if (subcommand.equals("swipe")) {
+ if (args.length == 6) {
+ sendSwipe(inputSource, Float.parseFloat(args[2]),
+ Float.parseFloat(args[3]), Float.parseFloat(args[4]),
+ Float.parseFloat(args[5]));
+ return;
+ }
+ }
+ }
+ } else if (command.equals("trackball")) {
+ // determine subcommand
+ if (args.length > 1) {
+ String subcommand = args[1];
+ if (subcommand.equals("press")) {
+ sendTap(InputDevice.SOURCE_TRACKBALL, 0.0f, 0.0f);
+ return;
+ } else if (subcommand.equals("roll")) {
+ if (args.length == 4) {
+ sendMove(InputDevice.SOURCE_TRACKBALL, Float.parseFloat(args[2]),
+ Float.parseFloat(args[3]));
+ return;
+ }
+ }
+ }
} else {
System.err.println("Error: Unknown command: " + command);
showUsage();
@@ -127,33 +166,64 @@
KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, InputDevice.SOURCE_KEYBOARD));
}
- private void sendTap(float x, float y) {
+ private void sendTap(int inputSource, float x, float y) {
long now = SystemClock.uptimeMillis();
- injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, x, y, 0));
- injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, x, y, 0));
+ injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x, y, 1.0f);
+ injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x, y, 0.0f);
}
- private void sendSwipe(float x1, float y1, float x2, float y2) {
+ private void sendSwipe(int inputSource, float x1, float y1, float x2, float y2) {
final int NUM_STEPS = 11;
long now = SystemClock.uptimeMillis();
- injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, x1, y1, 0));
+ injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x1, y1, 1.0f);
for (int i = 1; i < NUM_STEPS; i++) {
- float alpha = (float)i / NUM_STEPS;
- injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_MOVE,
- lerp(x1, x2, alpha), lerp(y1, y2, alpha), 0));
+ float alpha = (float) i / NUM_STEPS;
+ injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, lerp(x1, x2, alpha),
+ lerp(y1, y2, alpha), 1.0f);
}
- injectPointerEvent(MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, x2, y2, 0));
+ injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x1, y1, 0.0f);
+ }
+
+ /**
+ * Sends a simple zero-pressure move event.
+ *
+ * @param inputSource the InputDevice.SOURCE_* sending the input event
+ * @param dx change in x coordinate due to move
+ * @param dy change in y coordinate due to move
+ */
+ private void sendMove(int inputSource, float dx, float dy) {
+ long now = SystemClock.uptimeMillis();
+ injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, dx, dy, 0.0f);
}
private void injectKeyEvent(KeyEvent event) {
- Log.i(TAG, "InjectKeyEvent: " + event);
+ Log.i(TAG, "injectKeyEvent: " + event);
InputManager.getInstance().injectInputEvent(event,
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
}
- private void injectPointerEvent(MotionEvent event) {
- event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
- Log.i("Input", "InjectPointerEvent: " + event);
+ /**
+ * Builds a MotionEvent and injects it into the event stream.
+ *
+ * @param inputSource the InputDevice.SOURCE_* sending the input event
+ * @param action the MotionEvent.ACTION_* for the event
+ * @param when the value of SystemClock.uptimeMillis() at which the event happened
+ * @param x x coordinate of event
+ * @param y y coordinate of event
+ * @param pressure pressure of event
+ */
+ private void injectMotionEvent(int inputSource, int action, long when, float x, float y, float pressure) {
+ final float DEFAULT_SIZE = 1.0f;
+ final int DEFAULT_META_STATE = 0;
+ final float DEFAULT_PRECISION_X = 1.0f;
+ final float DEFAULT_PRECISION_Y = 1.0f;
+ final int DEFAULT_DEVICE_ID = 0;
+ final int DEFAULT_EDGE_FLAGS = 0;
+ MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, DEFAULT_SIZE,
+ DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID,
+ DEFAULT_EDGE_FLAGS);
+ event.setSource(inputSource);
+ Log.i("Input", "injectMotionEvent: " + event);
InputManager.getInstance().injectInputEvent(event,
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
}
@@ -166,7 +236,9 @@
System.err.println("usage: input ...");
System.err.println(" input text <string>");
System.err.println(" input keyevent <key code number or name>");
- System.err.println(" input tap <x> <y>");
- System.err.println(" input swipe <x1> <y1> <x2> <y2>");
+ System.err.println(" input [touchscreen|touchpad] tap <x> <y>");
+ System.err.println(" input [touchscreen|touchpad] swipe <x1> <y1> <x2> <y2>");
+ System.err.println(" input trackball press");
+ System.err.println(" input trackball roll <dx> <dy>");
}
}
diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c
index 697d8ec..68f8400 100644
--- a/cmds/installd/commands.c
+++ b/cmds/installd/commands.c
@@ -403,37 +403,6 @@
}
}
-int protect(char *pkgname, gid_t gid)
-{
- struct stat s;
- char pkgpath[PKG_PATH_MAX];
-
- if (gid < AID_SYSTEM) return -1;
-
- if (create_pkg_path_in_dir(pkgpath, &android_app_private_dir, pkgname, ".apk"))
- return -1;
-
- if (stat(pkgpath, &s) < 0) return -1;
-
- if (chown(pkgpath, s.st_uid, gid) < 0) {
- ALOGE("failed to chgrp '%s': %s\n", pkgpath, strerror(errno));
- return -1;
- }
- if (chmod(pkgpath, S_IRUSR|S_IWUSR|S_IRGRP) < 0) {
- ALOGE("protect(): failed to chmod '%s': %s\n", pkgpath, strerror(errno));
- return -1;
- }
-
-#ifdef HAVE_SELINUX
- if (selinux_android_setfilecon(pkgpath, pkgname, s.st_uid) < 0) {
- ALOGE("cannot setfilecon dir '%s': %s\n", pkgpath, strerror(errno));
- return -1;
- }
-#endif
-
- return 0;
-}
-
int get_size(const char *pkgname, int persona, const char *apkpath,
const char *fwdlock_apkpath, const char *asecpath,
int64_t *_codesize, int64_t *_datasize, int64_t *_cachesize,
diff --git a/cmds/installd/installd.c b/cmds/installd/installd.c
index 652543fd..cc8f014 100644
--- a/cmds/installd/installd.c
+++ b/cmds/installd/installd.c
@@ -75,11 +75,6 @@
return delete_cache(arg[0]); /* pkgname */
}
-static int do_protect(char **arg, char reply[REPLY_MAX])
-{
- return protect(arg[0], atoi(arg[1])); /* pkgname, gid */
-}
-
static int do_get_size(char **arg, char reply[REPLY_MAX])
{
int64_t codesize = 0;
@@ -153,7 +148,6 @@
{ "fixuid", 3, do_fixuid },
{ "freecache", 1, do_free_cache },
{ "rmcache", 1, do_rm_cache },
- { "protect", 2, do_protect },
{ "getsize", 5, do_get_size },
{ "rmuserdata", 2, do_rm_user_data },
{ "movefiles", 0, do_movefiles },
diff --git a/cmds/svc/src/com/android/commands/svc/PowerCommand.java b/cmds/svc/src/com/android/commands/svc/PowerCommand.java
index ec3ec3e..58105fa 100644
--- a/cmds/svc/src/com/android/commands/svc/PowerCommand.java
+++ b/cmds/svc/src/com/android/commands/svc/PowerCommand.java
@@ -16,14 +16,12 @@
package com.android.commands.svc;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.IPowerManager;
-import android.os.PowerManager;
-import android.os.ServiceManager;
-import android.os.RemoteException;
-import android.os.BatteryManager;
import android.content.Context;
+import android.os.BatteryManager;
+import android.os.IPowerManager;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemClock;
public class PowerCommand extends Svc.Command {
public PowerCommand() {
@@ -65,10 +63,12 @@
IPowerManager pm
= IPowerManager.Stub.asInterface(ServiceManager.getService(Context.POWER_SERVICE));
try {
- IBinder lock = new Binder();
- pm.acquireWakeLock(lock, PowerManager.FULL_WAKE_LOCK, "svc power", null);
+ if (val != 0) {
+ // if the request is not to set it to false, wake up the screen so that
+ // it can stay on as requested
+ pm.wakeUp(SystemClock.uptimeMillis());
+ }
pm.setStayOnSetting(val);
- pm.releaseWakeLock(lock, 0);
}
catch (RemoteException e) {
System.err.println("Faild to set setting: " + e);
diff --git a/core/java/android/animation/Keyframe.java b/core/java/android/animation/Keyframe.java
index e98719a..dc8538f 100644
--- a/core/java/android/animation/Keyframe.java
+++ b/core/java/android/animation/Keyframe.java
@@ -261,7 +261,7 @@
@Override
public ObjectKeyframe clone() {
- ObjectKeyframe kfClone = new ObjectKeyframe(getFraction(), mValue);
+ ObjectKeyframe kfClone = new ObjectKeyframe(getFraction(), mHasValue ? mValue : null);
kfClone.setInterpolator(getInterpolator());
return kfClone;
}
@@ -306,7 +306,9 @@
@Override
public IntKeyframe clone() {
- IntKeyframe kfClone = new IntKeyframe(getFraction(), mValue);
+ IntKeyframe kfClone = mHasValue ?
+ new IntKeyframe(getFraction(), mValue) :
+ new IntKeyframe(getFraction());
kfClone.setInterpolator(getInterpolator());
return kfClone;
}
@@ -350,7 +352,9 @@
@Override
public FloatKeyframe clone() {
- FloatKeyframe kfClone = new FloatKeyframe(getFraction(), mValue);
+ FloatKeyframe kfClone = mHasValue ?
+ new FloatKeyframe(getFraction(), mValue) :
+ new FloatKeyframe(getFraction());
kfClone.setInterpolator(getInterpolator());
return kfClone;
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index bb3c56a..06f79e7 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -1693,7 +1693,8 @@
*/
public void killBackgroundProcesses(String packageName) {
try {
- ActivityManagerNative.getDefault().killBackgroundProcesses(packageName);
+ ActivityManagerNative.getDefault().killBackgroundProcesses(packageName,
+ UserHandle.myUserId());
} catch (RemoteException e) {
}
}
@@ -1718,7 +1719,8 @@
*/
public void forceStopPackage(String packageName) {
try {
- ActivityManagerNative.getDefault().forceStopPackage(packageName);
+ ActivityManagerNative.getDefault().forceStopPackage(packageName,
+ UserHandle.myUserId());
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index e5dd7b1..bf77f6e 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -1214,7 +1214,8 @@
case KILL_BACKGROUND_PROCESSES_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
String packageName = data.readString();
- killBackgroundProcesses(packageName);
+ int userId = data.readInt();
+ killBackgroundProcesses(packageName, userId);
reply.writeNoException();
return true;
}
@@ -1229,7 +1230,8 @@
case FORCE_STOP_PACKAGE_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
String packageName = data.readString();
- forceStopPackage(packageName);
+ int userId = data.readInt();
+ forceStopPackage(packageName, userId);
reply.writeNoException();
return true;
}
@@ -1255,12 +1257,13 @@
case PROFILE_CONTROL_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
String process = data.readString();
+ int userId = data.readInt();
boolean start = data.readInt() != 0;
int profileType = data.readInt();
String path = data.readString();
ParcelFileDescriptor fd = data.readInt() != 0
? data.readFileDescriptor() : null;
- boolean res = profileControl(process, start, path, fd, profileType);
+ boolean res = profileControl(process, userId, start, path, fd, profileType);
reply.writeNoException();
reply.writeInt(res ? 1 : 0);
return true;
@@ -1484,9 +1487,10 @@
String process = data.readString();
boolean managed = data.readInt() != 0;
String path = data.readString();
+ int userId = data.readInt();
ParcelFileDescriptor fd = data.readInt() != 0
? data.readFileDescriptor() : null;
- boolean res = dumpHeap(process, managed, path, fd);
+ boolean res = dumpHeap(process, userId, managed, path, fd);
reply.writeNoException();
reply.writeInt(res ? 1 : 0);
return true;
@@ -3264,11 +3268,12 @@
reply.recycle();
}
- public void killBackgroundProcesses(String packageName) throws RemoteException {
+ public void killBackgroundProcesses(String packageName, int userId) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(packageName);
+ data.writeInt(userId);
mRemote.transact(KILL_BACKGROUND_PROCESSES_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
@@ -3285,11 +3290,12 @@
reply.recycle();
}
- public void forceStopPackage(String packageName) throws RemoteException {
+ public void forceStopPackage(String packageName, int userId) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(packageName);
+ data.writeInt(userId);
mRemote.transact(FORCE_STOP_PACKAGE_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
@@ -3322,13 +3328,14 @@
return res;
}
- public boolean profileControl(String process, boolean start,
+ public boolean profileControl(String process, int userId, boolean start,
String path, ParcelFileDescriptor fd, int profileType) throws RemoteException
{
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(process);
+ data.writeInt(userId);
data.writeInt(start ? 1 : 0);
data.writeInt(profileType);
data.writeString(path);
@@ -3601,12 +3608,13 @@
return res;
}
- public boolean dumpHeap(String process, boolean managed,
+ public boolean dumpHeap(String process, int userId, boolean managed,
String path, ParcelFileDescriptor fd) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(process);
+ data.writeInt(userId);
data.writeInt(managed ? 1 : 0);
data.writeString(path);
if (fd != null) {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 38e6970..09fa99c 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4066,7 +4066,8 @@
// send up app name; do this *before* waiting for debugger
Process.setArgV0(data.processName);
- android.ddm.DdmHandleAppName.setAppName(data.processName);
+ android.ddm.DdmHandleAppName.setAppName(data.processName,
+ UserHandle.myUserId());
if (data.persistent) {
// Persistent processes on low-memory devices do not get to
@@ -4792,7 +4793,8 @@
ensureJitEnabled();
}
});
- android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");
+ android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
+ UserHandle.myUserId());
RuntimeInit.setApplicationObject(mAppThread.asBinder());
IActivityManager mgr = ActivityManagerNative.getDefault();
try {
@@ -4803,7 +4805,8 @@
} else {
// Don't set application object here -- if the system crashes,
// we can't display an alert, we just want to die die die.
- android.ddm.DdmHandleAppName.setAppName("system_process");
+ android.ddm.DdmHandleAppName.setAppName("system_process",
+ UserHandle.myUserId());
try {
mInstrumentation = new Instrumentation();
ContextImpl context = new ContextImpl();
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 3ff9df5..c5a382d 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -615,7 +615,7 @@
+ " did not call through to super.onViewStateRestored()");
}
}
-
+
final void setIndex(int index, Fragment parent) {
mIndex = index;
if (parent != null) {
@@ -623,8 +623,8 @@
} else {
mWho = "android:fragment:" + mIndex;
}
- }
-
+ }
+
final boolean isInBackStack() {
return mBackStackNesting > 0;
}
@@ -832,6 +832,14 @@
}
/**
+ * Returns the parent Fragment containing this Fragment. If this Fragment
+ * is attached directly to an Activity, returns null.
+ */
+ final public Fragment getParentFragment() {
+ return mParentFragment;
+ }
+
+ /**
* Return true if the fragment is currently added to its activity.
*/
final public boolean isAdded() {
@@ -1180,20 +1188,7 @@
public void onCreate(Bundle savedInstanceState) {
mCalled = true;
}
-
- /**
- * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}
- * has returned, but before any saved state has been restored in to the view.
- * This gives subclasses a chance to initialize themselves once
- * they know their view hierarchy has been completely created. The fragment's
- * view hierarchy is not however attached to its parent at this point.
- * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
- * @param savedInstanceState If non-null, this fragment is being re-constructed
- * from a previous saved state as given here.
- */
- public void onViewCreated(View view, Bundle savedInstanceState) {
- }
-
+
/**
* Called to have the fragment instantiate its user interface view.
* This is optional, and non-graphical fragments can return null (which
@@ -1217,6 +1212,19 @@
Bundle savedInstanceState) {
return null;
}
+
+ /**
+ * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}
+ * has returned, but before any saved state has been restored in to the view.
+ * This gives subclasses a chance to initialize themselves once
+ * they know their view hierarchy has been completely created. The fragment's
+ * view hierarchy is not however attached to its parent at this point.
+ * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
+ * @param savedInstanceState If non-null, this fragment is being re-constructed
+ * from a previous saved state as given here.
+ */
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ }
/**
* Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
@@ -1237,7 +1245,7 @@
* as this callback tells the fragment when it is fully associated with
* the new activity instance. This is called after {@link #onCreateView}
* and before {@link #onViewStateRestored(Bundle)}.
- *
+ *
* @param savedInstanceState If the fragment is being re-created from
* a previous saved state, this is the state.
*/
@@ -1252,7 +1260,7 @@
* whether check box widgets are currently checked. This is called
* after {@link #onActivityCreated(Bundle)} and before
* {@link #onStart()}.
- *
+ *
* @param savedInstanceState If the fragment is being re-created from
* a previous saved state, this is the state.
*/
@@ -1590,10 +1598,6 @@
writer.print(prefix); writer.print("mActivity=");
writer.println(mActivity);
}
- if (mChildFragmentManager != null) {
- writer.print(prefix); writer.print("mChildFragmentManager=");
- writer.println(mChildFragmentManager);
- }
if (mParentFragment != null) {
writer.print(prefix); writer.print("mParentFragment=");
writer.println(mParentFragment);
@@ -1633,7 +1637,7 @@
mLoaderManager.dump(prefix + " ", fd, writer, args);
}
if (mChildFragmentManager != null) {
- writer.print(prefix); writer.println("Child Fragment Manager:");
+ writer.print(prefix); writer.println("Child " + mChildFragmentManager + ":");
mChildFragmentManager.dump(prefix + " ", fd, writer, args);
}
}
@@ -1662,6 +1666,9 @@
}
void performCreate(Bundle savedInstanceState) {
+ if (mChildFragmentManager != null) {
+ mChildFragmentManager.noteStateNotSaved();
+ }
mCalled = false;
onCreate(savedInstanceState);
if (!mCalled) {
@@ -1680,7 +1687,18 @@
}
}
+ View performCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ if (mChildFragmentManager != null) {
+ mChildFragmentManager.noteStateNotSaved();
+ }
+ return onCreateView(inflater, container, savedInstanceState);
+ }
+
void performActivityCreated(Bundle savedInstanceState) {
+ if (mChildFragmentManager != null) {
+ mChildFragmentManager.noteStateNotSaved();
+ }
mCalled = false;
onActivityCreated(savedInstanceState);
if (!mCalled) {
@@ -1713,6 +1731,7 @@
void performResume() {
if (mChildFragmentManager != null) {
+ mChildFragmentManager.noteStateNotSaved();
mChildFragmentManager.execPendingActions();
}
mCalled = false;
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index eaaf0d7..7f11437 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -834,7 +834,9 @@
throw new SuperNotCalledException("Fragment " + f
+ " did not call through to super.onAttach()");
}
- mActivity.onAttachFragment(f);
+ if (f.mParentFragment == null) {
+ mActivity.onAttachFragment(f);
+ }
if (!f.mRetaining) {
f.performCreate(f.mSavedFragmentState);
@@ -844,8 +846,8 @@
// For fragments that are part of the content view
// layout, we need to instantiate the view immediately
// and the inflater will take care of adding it.
- f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState),
- null, f.mSavedFragmentState);
+ f.mView = f.performCreateView(f.getLayoutInflater(
+ f.mSavedFragmentState), null, f.mSavedFragmentState);
if (f.mView != null) {
f.mView.setSaveFromParentEnabled(false);
if (f.mHidden) f.mView.setVisibility(View.GONE);
@@ -868,8 +870,8 @@
}
}
f.mContainer = container;
- f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState),
- container, f.mSavedFragmentState);
+ f.mView = f.performCreateView(f.getLayoutInflater(
+ f.mSavedFragmentState), container, f.mSavedFragmentState);
if (f.mView != null) {
f.mView.setSaveFromParentEnabled(false);
if (container != null) {
@@ -885,7 +887,7 @@
f.onViewCreated(f.mView, f.mSavedFragmentState);
}
}
-
+
f.performActivityCreated(f.mSavedFragmentState);
if (f.mView != null) {
f.restoreViewState(f.mSavedFragmentState);
@@ -1824,7 +1826,7 @@
public void dispatchDestroyView() {
moveToState(Fragment.CREATED, false);
}
-
+
public void dispatchDestroy() {
mDestroyed = true;
execPendingActions();
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 9cb3621..4c0e2a7 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -208,9 +208,10 @@
public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) throws RemoteException;
- public void killBackgroundProcesses(final String packageName) throws RemoteException;
+ public void killBackgroundProcesses(final String packageName, int userId)
+ throws RemoteException;
public void killAllBackgroundProcesses() throws RemoteException;
- public void forceStopPackage(final String packageName) throws RemoteException;
+ public void forceStopPackage(final String packageName, int userId) throws RemoteException;
// Note: probably don't want to allow applications access to these.
public void goingToSleep() throws RemoteException;
@@ -267,7 +268,7 @@
public ConfigurationInfo getDeviceConfigurationInfo() throws RemoteException;
// Turn on/off profiling in a particular process.
- public boolean profileControl(String process, boolean start,
+ public boolean profileControl(String process, int userId, boolean start,
String path, ParcelFileDescriptor fd, int profileType) throws RemoteException;
public boolean shutdown(int timeout) throws RemoteException;
@@ -308,7 +309,7 @@
Uri uri, int modeFlags) throws RemoteException;
// Cause the specified process to dump the specified heap.
- public boolean dumpHeap(String process, boolean managed, String path,
+ public boolean dumpHeap(String process, int userId, boolean managed, String path,
ParcelFileDescriptor fd) throws RemoteException;
public int startActivities(IApplicationThread caller,
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index 810e790..2df675e 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -237,8 +237,9 @@
/**
* Sent when the custom extras for an AppWidget change.
*
- * @see AppWidgetProvider#onAppWidgetExtrasChanged AppWidgetProvider#onAppWidgetExtrasChanged(
- * Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newExtras)
+ * @see AppWidgetProvider#onAppWidgetOptionsChanged
+ * AppWidgetProvider.onAppWidgetOptionsChanged(Context context,
+ * AppWidgetManager appWidgetManager, int appWidgetId, Bundle newExtras)
*/
public static final String ACTION_APPWIDGET_OPTIONS_CHANGED = "android.appwidget.action.APPWIDGET_UPDATE_OPTIONS";
diff --git a/core/java/android/ddm/DdmHandleAppName.java b/core/java/android/ddm/DdmHandleAppName.java
index 78dd23e..7e39e47 100644
--- a/core/java/android/ddm/DdmHandleAppName.java
+++ b/core/java/android/ddm/DdmHandleAppName.java
@@ -69,14 +69,14 @@
* before or after DDMS connects. For the latter we need to send up
* an APNM message.
*/
- public static void setAppName(String name) {
+ public static void setAppName(String name, int userId) {
if (name == null || name.length() == 0)
return;
mAppName = name;
// if DDMS is already connected, send the app name up
- sendAPNM(name);
+ sendAPNM(name, userId);
}
public static String getAppName() {
@@ -86,14 +86,18 @@
/*
* Send an APNM (APplication NaMe) chunk.
*/
- private static void sendAPNM(String appName) {
+ private static void sendAPNM(String appName, int userId) {
if (false)
Log.v("ddm", "Sending app name");
- ByteBuffer out = ByteBuffer.allocate(4 + appName.length()*2);
+ ByteBuffer out = ByteBuffer.allocate(
+ 4 /* appName's length */
+ + appName.length()*2 /* appName */
+ + 4 /* userId */);
out.order(ChunkHandler.CHUNK_ORDER);
out.putInt(appName.length());
putString(out, appName);
+ out.putInt(userId);
Chunk chunk = new Chunk(CHUNK_APNM, out);
DdmServer.sendChunk(chunk);
diff --git a/core/java/android/ddm/DdmHandleHello.java b/core/java/android/ddm/DdmHandleHello.java
index 5088d22..e99fa92 100644
--- a/core/java/android/ddm/DdmHandleHello.java
+++ b/core/java/android/ddm/DdmHandleHello.java
@@ -21,6 +21,7 @@
import org.apache.harmony.dalvik.ddmc.DdmServer;
import android.util.Log;
import android.os.Debug;
+import android.os.UserHandle;
import java.nio.ByteBuffer;
@@ -119,7 +120,7 @@
// appName = "unknown";
String appName = DdmHandleAppName.getAppName();
- ByteBuffer out = ByteBuffer.allocate(16
+ ByteBuffer out = ByteBuffer.allocate(20
+ vmIdent.length()*2 + appName.length()*2);
out.order(ChunkHandler.CHUNK_ORDER);
out.putInt(DdmServer.CLIENT_PROTOCOL_VERSION);
@@ -128,6 +129,7 @@
out.putInt(appName.length());
putString(out, vmIdent);
putString(out, appName);
+ out.putInt(UserHandle.myUserId());
Chunk reply = new Chunk(CHUNK_HELO, out);
diff --git a/core/java/android/inputmethodservice/AbstractInputMethodService.java b/core/java/android/inputmethodservice/AbstractInputMethodService.java
index 27af013..3c3182a 100644
--- a/core/java/android/inputmethodservice/AbstractInputMethodService.java
+++ b/core/java/android/inputmethodservice/AbstractInputMethodService.java
@@ -149,6 +149,17 @@
callback.finishedEvent(seq, handled);
}
}
+
+ /**
+ * Take care of dispatching incoming generic motion events to the appropriate
+ * callbacks on the service, and tell the client when this is done.
+ */
+ public void dispatchGenericMotionEvent(int seq, MotionEvent event, EventCallback callback) {
+ boolean handled = onGenericMotionEvent(event);
+ if (callback != null) {
+ callback.finishedEvent(seq, handled);
+ }
+ }
}
/**
@@ -189,7 +200,25 @@
return new IInputMethodWrapper(this, mInputMethod);
}
+ /**
+ * Implement this to handle trackball events on your input method.
+ *
+ * @param event The motion event being received.
+ * @return True if the event was handled in this function, false otherwise.
+ * @see View#onTrackballEvent
+ */
public boolean onTrackballEvent(MotionEvent event) {
return false;
}
+
+ /**
+ * Implement this to handle generic motion events on your input method.
+ *
+ * @param event The motion event being received.
+ * @return True if the event was handled in this function, false otherwise.
+ * @see View#onGenericMotionEvent
+ */
+ public boolean onGenericMotionEvent(MotionEvent event) {
+ return false;
+ }
}
diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
index ce797d1..5324f81 100644
--- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
+++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
@@ -43,6 +43,7 @@
private static final int DO_UPDATE_EXTRACTED_TEXT = 67;
private static final int DO_DISPATCH_KEY_EVENT = 70;
private static final int DO_DISPATCH_TRACKBALL_EVENT = 80;
+ private static final int DO_DISPATCH_GENERIC_MOTION_EVENT = 85;
private static final int DO_UPDATE_SELECTION = 90;
private static final int DO_UPDATE_CURSOR = 95;
private static final int DO_APP_PRIVATE_COMMAND = 100;
@@ -109,6 +110,15 @@
args.recycle();
return;
}
+ case DO_DISPATCH_GENERIC_MOTION_EVENT: {
+ SomeArgs args = (SomeArgs)msg.obj;
+ mInputMethodSession.dispatchGenericMotionEvent(msg.arg1,
+ (MotionEvent)args.arg1,
+ new InputMethodEventCallbackWrapper(
+ (IInputMethodCallback)args.arg2));
+ args.recycle();
+ return;
+ }
case DO_UPDATE_SELECTION: {
SomeArgs args = (SomeArgs)msg.obj;
mInputMethodSession.updateSelection(args.argi1, args.argi2,
@@ -167,6 +177,12 @@
event, callback));
}
+ public void dispatchGenericMotionEvent(int seq, MotionEvent event,
+ IInputMethodCallback callback) {
+ mCaller.executeOrSendMessage(mCaller.obtainMessageIOO(DO_DISPATCH_GENERIC_MOTION_EVENT, seq,
+ event, callback));
+ }
+
public void updateSelection(int oldSelStart, int oldSelEnd,
int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd) {
mCaller.executeOrSendMessage(mCaller.obtainMessageIIIIII(DO_UPDATE_SELECTION,
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index d5b9edc..cf3b802 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -1773,7 +1773,7 @@
* Override this to intercept special key multiple events before they are
* processed by the
* application. If you return true, the application will not itself
- * process the event. If you return true, the normal application processing
+ * process the event. If you return false, the normal application processing
* will occur as if the IME had not seen the event at all.
*
* <p>The default implementation always returns false, except when
@@ -1788,7 +1788,7 @@
/**
* Override this to intercept key up events before they are processed by the
* application. If you return true, the application will not itself
- * process the event. If you return true, the normal application processing
+ * process the event. If you return false, the normal application processing
* will occur as if the IME had not seen the event at all.
*
* <p>The default implementation intercepts {@link KeyEvent#KEYCODE_BACK
@@ -1806,8 +1806,29 @@
return doMovementKey(keyCode, event, MOVEMENT_UP);
}
+ /**
+ * Override this to intercept trackball motion events before they are
+ * processed by the application.
+ * If you return true, the application will not itself process the event.
+ * If you return false, the normal application processing will occur as if
+ * the IME had not seen the event at all.
+ */
@Override
public boolean onTrackballEvent(MotionEvent event) {
+ if (DEBUG) Log.v(TAG, "onTrackballEvent: " + event);
+ return false;
+ }
+
+ /**
+ * Override this to intercept generic motion events before they are
+ * processed by the application.
+ * If you return true, the application will not itself process the event.
+ * If you return false, the normal application processing will occur as if
+ * the IME had not seen the event at all.
+ */
+ @Override
+ public boolean onGenericMotionEvent(MotionEvent event) {
+ if (DEBUG) Log.v(TAG, "onGenericMotionEvent(): event " + event);
return false;
}
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index fff7d5f..7e4666c 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -40,7 +40,7 @@
/** @hide A user id to indicate that we would like to send to the current
* user, but if this is calling from a user process then we will send it
* to the caller's user instead of failing wiht a security exception */
- public static final int USER_CURRENT_OR_SELF = -2;
+ public static final int USER_CURRENT_OR_SELF = -3;
/** @hide A user handle to indicate that we would like to send to the current
* user, but if this is calling from a user process then we will send it
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 48d84c1..3c2d164 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -183,8 +183,6 @@
* on top of the lock screen while secured. There is no activity stack when
* this flag is used, so launching more than one activity is strongly
* discouraged.
- *
- * @hide
*/
public static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE =
"android.media.action.STILL_IMAGE_CAMERA_SECURE";
diff --git a/core/java/android/view/InputEventConsistencyVerifier.java b/core/java/android/view/InputEventConsistencyVerifier.java
index fafe416..5dda934 100644
--- a/core/java/android/view/InputEventConsistencyVerifier.java
+++ b/core/java/android/view/InputEventConsistencyVerifier.java
@@ -322,7 +322,7 @@
final int action = event.getAction();
final boolean newStream = action == MotionEvent.ACTION_DOWN
- || action == MotionEvent.ACTION_CANCEL;
+ || action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_OUTSIDE;
if (newStream && (mTouchEventStreamIsTainted || mTouchEventStreamUnhandled)) {
mTouchEventStreamIsTainted = false;
mTouchEventStreamUnhandled = false;
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index a4c0235..3006b5d 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -3211,6 +3211,33 @@
mInputEventConsistencyVerifier.onTrackballEvent(event, 0);
}
+ if (mView != null && mAdded && (q.mFlags & QueuedInputEvent.FLAG_DELIVER_POST_IME) == 0) {
+ if (LOCAL_LOGV)
+ Log.v(TAG, "Dispatching trackball " + event + " to " + mView);
+
+ // Dispatch to the IME before propagating down the view hierarchy.
+ // The IME will eventually call back into handleImeFinishedEvent.
+ if (mLastWasImTarget) {
+ InputMethodManager imm = InputMethodManager.peekInstance();
+ if (imm != null) {
+ final int seq = event.getSequenceNumber();
+ if (DEBUG_IMF)
+ Log.v(TAG, "Sending trackball event to IME: seq="
+ + seq + " event=" + event);
+ imm.dispatchTrackballEvent(mView.getContext(), seq, event,
+ mInputMethodCallback);
+ return;
+ }
+ }
+ }
+
+ // Not dispatching to IME, continue with post IME actions.
+ deliverTrackballEventPostIme(q);
+ }
+
+ private void deliverTrackballEventPostIme(QueuedInputEvent q) {
+ final MotionEvent event = (MotionEvent) q.mEvent;
+
// If there is no view, then the event will not be handled.
if (mView == null || !mAdded) {
finishInputEvent(q, false);
@@ -3344,8 +3371,33 @@
mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
}
- final int source = event.getSource();
- final boolean isJoystick = (source & InputDevice.SOURCE_CLASS_JOYSTICK) != 0;
+ if (mView != null && mAdded && (q.mFlags & QueuedInputEvent.FLAG_DELIVER_POST_IME) == 0) {
+ if (LOCAL_LOGV)
+ Log.v(TAG, "Dispatching generic motion " + event + " to " + mView);
+
+ // Dispatch to the IME before propagating down the view hierarchy.
+ // The IME will eventually call back into handleImeFinishedEvent.
+ if (mLastWasImTarget) {
+ InputMethodManager imm = InputMethodManager.peekInstance();
+ if (imm != null) {
+ final int seq = event.getSequenceNumber();
+ if (DEBUG_IMF)
+ Log.v(TAG, "Sending generic motion event to IME: seq="
+ + seq + " event=" + event);
+ imm.dispatchGenericMotionEvent(mView.getContext(), seq, event,
+ mInputMethodCallback);
+ return;
+ }
+ }
+ }
+
+ // Not dispatching to IME, continue with post IME actions.
+ deliverGenericMotionEventPostIme(q);
+ }
+
+ private void deliverGenericMotionEventPostIme(QueuedInputEvent q) {
+ final MotionEvent event = (MotionEvent) q.mEvent;
+ final boolean isJoystick = (event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0;
// If there is no view, then the event will not be handled.
if (mView == null || !mAdded) {
@@ -3366,7 +3418,8 @@
}
if (isJoystick) {
- // Translate the joystick event into DPAD keys and try to deliver those.
+ // Translate the joystick event into DPAD keys and try to deliver
+ // those.
updateJoystickDirection(event, true);
finishInputEvent(q, true);
} else {
@@ -3521,13 +3574,7 @@
mInputEventConsistencyVerifier.onKeyEvent(event, 0);
}
- if ((q.mFlags & QueuedInputEvent.FLAG_DELIVER_POST_IME) == 0) {
- // If there is no view, then the event will not be handled.
- if (mView == null || !mAdded) {
- finishInputEvent(q, false);
- return;
- }
-
+ if (mView != null && mAdded && (q.mFlags & QueuedInputEvent.FLAG_DELIVER_POST_IME) == 0) {
if (LOCAL_LOGV) Log.v(TAG, "Dispatching key " + event + " to " + mView);
// Perform predispatching before the IME.
@@ -3557,15 +3604,23 @@
void handleImeFinishedEvent(int seq, boolean handled) {
final QueuedInputEvent q = mCurrentInputEvent;
if (q != null && q.mEvent.getSequenceNumber() == seq) {
- final KeyEvent event = (KeyEvent)q.mEvent;
if (DEBUG_IMF) {
Log.v(TAG, "IME finished event: seq=" + seq
- + " handled=" + handled + " event=" + event);
+ + " handled=" + handled + " event=" + q);
}
if (handled) {
finishInputEvent(q, true);
} else {
- deliverKeyEventPostIme(q);
+ if (q.mEvent instanceof KeyEvent) {
+ deliverKeyEventPostIme(q);
+ } else {
+ final int source = q.mEvent.getSource();
+ if ((source & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) {
+ deliverTrackballEventPostIme(q);
+ } else {
+ deliverGenericMotionEventPostIme(q);
+ }
+ }
}
} else {
if (DEBUG_IMF) {
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index e754adc..3ea6df3 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1593,7 +1593,7 @@
/**
* @hide
*/
- void dispatchTrackballEvent(Context context, int seq, MotionEvent motion,
+ public void dispatchTrackballEvent(Context context, int seq, MotionEvent motion,
FinishedEventCallback callback) {
synchronized (mH) {
if (DEBUG) Log.d(TAG, "dispatchTrackballEvent");
@@ -1614,6 +1614,30 @@
callback.finishedEvent(seq, false);
}
+ /**
+ * @hide
+ */
+ public void dispatchGenericMotionEvent(Context context, int seq, MotionEvent motion,
+ FinishedEventCallback callback) {
+ synchronized (mH) {
+ if (DEBUG) Log.d(TAG, "dispatchGenericMotionEvent");
+
+ if (mCurMethod != null && mCurrentTextBoxAttribute != null) {
+ try {
+ if (DEBUG) Log.v(TAG, "DISPATCH GENERIC MOTION: " + mCurMethod);
+ final long startTime = SystemClock.uptimeMillis();
+ enqueuePendingEventLocked(startTime, seq, mCurId, callback);
+ mCurMethod.dispatchGenericMotionEvent(seq, motion, mInputMethodCallback);
+ return;
+ } catch (RemoteException e) {
+ Log.w(TAG, "IME died: " + mCurId + " dropping generic motion: " + motion, e);
+ }
+ }
+ }
+
+ callback.finishedEvent(seq, false);
+ }
+
void finishedEvent(int seq, boolean handled) {
final FinishedEventCallback callback;
synchronized (mH) {
diff --git a/core/java/android/view/inputmethod/InputMethodSession.java b/core/java/android/view/inputmethod/InputMethodSession.java
index ea6f5ee..6386299 100644
--- a/core/java/android/view/inputmethod/InputMethodSession.java
+++ b/core/java/android/view/inputmethod/InputMethodSession.java
@@ -138,6 +138,21 @@
public void dispatchTrackballEvent(int seq, MotionEvent event, EventCallback callback);
/**
+ * This method is called when there is a generic motion event.
+ *
+ * <p>
+ * If the input method wants to handle this event, return true, otherwise
+ * return false and the caller (i.e. the application) will handle the event.
+ *
+ * @param event The motion event.
+ *
+ * @return Whether the input method wants to handle this event.
+ *
+ * @see android.view.MotionEvent
+ */
+ public void dispatchGenericMotionEvent(int seq, MotionEvent event, EventCallback callback);
+
+ /**
* Process a private command sent from the application to the input method.
* This can be used to provide domain-specific features that are
* only known between certain input methods and their clients.
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index 9334036..494a28c 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -27,7 +27,6 @@
import android.content.ComponentCallbacks2;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
@@ -69,7 +68,6 @@
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Log;
-import android.view.Display;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.HardwareCanvas;
@@ -87,7 +85,6 @@
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewRootImpl;
-import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -136,9 +133,6 @@
import java.util.Map;
import java.util.Set;
import java.util.Vector;
-import java.util.concurrent.CountDownLatch;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
/**
* Implements a backend provider for the {@link WebView} public API.
@@ -1891,9 +1885,9 @@
mSavePasswordDialog = null;
}
})
- .setOnCancelListener(new OnCancelListener() {
+ .setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
- public void onCancel(DialogInterface dialog) {
+ public void onDismiss(DialogInterface dialog) {
if (mResumeMsg != null) {
resumeMsg.sendToTarget();
mResumeMsg = null;
@@ -2098,14 +2092,18 @@
hideSoftKeyboard();
clearActionModes();
dismissFullScreenMode();
- cancelSelectDialog();
+ cancelDialogs();
}
- private void cancelSelectDialog() {
+ private void cancelDialogs() {
if (mListBoxDialog != null) {
mListBoxDialog.cancel();
mListBoxDialog = null;
}
+ if (mSavePasswordDialog != null) {
+ mSavePasswordDialog.dismiss();
+ mSavePasswordDialog = null;
+ }
}
/**
@@ -2133,15 +2131,6 @@
private void destroyJava() {
mCallbackProxy.blockMessages();
- clearHelpers();
- if (mListBoxDialog != null) {
- mListBoxDialog.dismiss();
- mListBoxDialog = null;
- }
- if (mSavePasswordDialog != null) {
- mSavePasswordDialog.dismiss();
- mSavePasswordDialog = null;
- }
if (mWebViewCore != null) {
// Tell WebViewCore to destroy itself
synchronized (this) {
@@ -3492,7 +3481,7 @@
nativeSetPauseDrawing(mNativeClass, true);
}
- cancelSelectDialog();
+ cancelDialogs();
WebCoreThreadWatchdog.pause();
}
}
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 938979a..03507b5 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -38,6 +38,7 @@
import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.ViewParent;
+import android.view.ViewRootImpl;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.RemoteViews.RemoteView;
@@ -1590,20 +1591,25 @@
}
// Remember which child, if any, had accessibility focus.
- final View accessFocusedView = getViewRootImpl().getAccessibilityFocusedHost();
- if (accessFocusedView != null) {
- final View accessFocusedChild = findAccessibilityFocusedChild(accessFocusedView);
- if (accessFocusedChild != null) {
- if (!dataChanged || isDirectChildHeaderOrFooter(accessFocusedChild)) {
- // If the views won't be changing, try to maintain focus
- // on the current view host and (if applicable) its
- // virtual view.
- accessibilityFocusLayoutRestoreView = accessFocusedView;
- accessibilityFocusLayoutRestoreNode = getViewRootImpl()
- .getAccessibilityFocusedVirtualView();
- } else {
- // Otherwise, try to maintain focus at the same position.
- accessibilityFocusPosition = getPositionForView(accessFocusedChild);
+ final ViewRootImpl viewRootImpl = getViewRootImpl();
+ if (viewRootImpl != null) {
+ final View accessFocusedView = viewRootImpl.getAccessibilityFocusedHost();
+ if (accessFocusedView != null) {
+ final View accessFocusedChild = findAccessibilityFocusedChild(
+ accessFocusedView);
+ if (accessFocusedChild != null) {
+ if (!dataChanged || isDirectChildHeaderOrFooter(accessFocusedChild)) {
+ // If the views won't be changing, try to maintain
+ // focus on the current view host and (if
+ // applicable) its virtual view.
+ accessibilityFocusLayoutRestoreView = accessFocusedView;
+ accessibilityFocusLayoutRestoreNode = viewRootImpl
+ .getAccessibilityFocusedVirtualView();
+ } else {
+ // Otherwise, try to maintain focus at the same
+ // position.
+ accessibilityFocusPosition = getPositionForView(accessFocusedChild);
+ }
}
}
}
diff --git a/core/java/com/android/internal/view/IInputMethodSession.aidl b/core/java/com/android/internal/view/IInputMethodSession.aidl
index f875cbd..cdec254 100644
--- a/core/java/com/android/internal/view/IInputMethodSession.aidl
+++ b/core/java/com/android/internal/view/IInputMethodSession.aidl
@@ -47,6 +47,8 @@
void dispatchTrackballEvent(int seq, in MotionEvent event, IInputMethodCallback callback);
+ void dispatchGenericMotionEvent(int seq, in MotionEvent event, IInputMethodCallback callback);
+
void appPrivateCommand(String action, in Bundle data);
void toggleSoftInput(int showFlags, int hideFlags);
diff --git a/core/jni/android/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index c48b974..bc58813 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -223,6 +223,10 @@
} else if (err < 0) {
jniThrowRuntimeException(env, "Error during updateTexImage (see logcat for details)");
}
+ err = surfaceTexture->doGLFenceWait();
+ if (err != NO_ERROR) {
+ jniThrowRuntimeException(env, "Error waiting for fence (see logcat for details)");
+ }
}
static jint SurfaceTexture_detachFromGLContext(JNIEnv* env, jobject thiz)
diff --git a/core/res/res/layout/preference_holo.xml b/core/res/res/layout/preference_holo.xml
index 7a0a494..1cc803b 100644
--- a/core/res/res/layout/preference_holo.xml
+++ b/core/res/res/layout/preference_holo.xml
@@ -33,11 +33,12 @@
android:orientation="horizontal">
<ImageView
android:id="@+android:id/icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
android:layout_gravity="center"
android:minWidth="48dp"
- android:paddingRight="@dimen/preference_item_padding_inner"
+ android:scaleType="centerInside"
+ android:layout_marginEnd="@dimen/preference_item_padding_inner"
/>
</LinearLayout>
@@ -56,7 +57,7 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="marquee"
android:fadingEdge="horizontal" />
-
+
<TextView android:id="@+android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java
index 216344d..561e33e 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java
@@ -36,6 +36,7 @@
import android.os.PowerManager;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
import android.view.KeyEvent;
@@ -696,12 +697,12 @@
*/
public void setAirplaneMode(Context context, boolean enableAM) {
//set the airplane mode
- Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
+ Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
enableAM ? 1 : 0);
// Post the intent
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", enableAM);
- context.sendBroadcast(intent);
+ context.sendBroadcastAsUser(intent, UserHandle.ALL);
}
protected static String convertToQuotedString(String string) {
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java
index bf188d3..7928822 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java
@@ -59,8 +59,8 @@
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "CMWakeLock");
wl.acquire();
// Each test case will start with cellular connection
- if (Settings.System.getInt(getInstrumentation().getContext().getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON) == 1) {
+ if (Settings.Global.getInt(getInstrumentation().getContext().getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON) == 1) {
log("airplane is not disabled, disable it.");
cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
}
@@ -84,8 +84,8 @@
wl.release();
cmActivity.removeConfiguredNetworksAndDisableWifi();
// if airplane mode is set, disable it.
- if (Settings.System.getInt(getInstrumentation().getContext().getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON) == 1) {
+ if (Settings.Global.getInt(getInstrumentation().getContext().getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON) == 1) {
log("disable airplane mode if it is enabled");
cmActivity.setAirplaneMode(getInstrumentation().getContext(), false);
}
diff --git a/core/tests/coretests/apks/FrameworkCoreTests_apk.mk b/core/tests/coretests/apks/FrameworkCoreTests_apk.mk
index ac545ca..1e03270 100644
--- a/core/tests/coretests/apks/FrameworkCoreTests_apk.mk
+++ b/core/tests/coretests/apks/FrameworkCoreTests_apk.mk
@@ -7,6 +7,9 @@
# Make sure every package name gets the FrameworkCoreTests_ prefix.
LOCAL_PACKAGE_NAME := FrameworkCoreTests_$(LOCAL_PACKAGE_NAME)
+# Every package should have a native library
+LOCAL_JNI_SHARED_LIBRARIES := libframeworks_coretests_jni
+
FrameworkCoreTests_all_apks += $(LOCAL_PACKAGE_NAME)
include $(BUILD_PACKAGE)
diff --git a/core/tests/coretests/apks/install_jni_lib/Android.mk b/core/tests/coretests/apks/install_jni_lib/Android.mk
new file mode 100644
index 0000000..de2993a
--- /dev/null
+++ b/core/tests/coretests/apks/install_jni_lib/Android.mk
@@ -0,0 +1,28 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ com_android_frameworks_coretests_JNITest.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libnativehelper
+
+LOCAL_MODULE := libframeworks_coretests_jni
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/core/tests/coretests/apks/install_jni_lib/com_android_frameworks_coretests_JNITest.cpp b/core/tests/coretests/apks/install_jni_lib/com_android_frameworks_coretests_JNITest.cpp
new file mode 100644
index 0000000..957fc4a
--- /dev/null
+++ b/core/tests/coretests/apks/install_jni_lib/com_android_frameworks_coretests_JNITest.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "nativehelper/JNIHelp.h"
+
+namespace android {
+
+static jint checkFunction(JNIEnv*, jclass) {
+ return 1;
+}
+
+static JNINativeMethod sMethods[] = {
+ /* name, signature, funcPtr */
+ { "checkFunction", "()I", (void*) checkFunction },
+};
+
+int register_com_android_framework_coretests_JNITests(JNIEnv* env) {
+ return jniRegisterNativeMethods(env, "com/android/framework/coretests/JNITests", sMethods,
+ NELEM(sMethods));
+}
+
+}
+
+/*
+ * JNI Initialization
+ */
+jint JNI_OnLoad(JavaVM *jvm, void *reserved) {
+ JNIEnv *e;
+ int status;
+
+ // Check JNI version
+ if (jvm->GetEnv((void **) &e, JNI_VERSION_1_6)) {
+ return JNI_ERR;
+ }
+
+ if ((status = android::register_com_android_framework_coretests_JNITests(e)) < 0) {
+ return JNI_ERR;
+ }
+
+ return JNI_VERSION_1_6;
+}
diff --git a/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java b/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
index b2075ae..af2a944 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
@@ -29,6 +29,7 @@
import android.net.wifi.WifiManager;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
+import android.os.UserHandle;
import android.os.ParcelFileDescriptor.AutoCloseInputStream;
import android.os.SystemClock;
import android.provider.Settings;
@@ -553,7 +554,7 @@
int state = enable ? 1 : 0;
// Change the system setting
- Settings.System.putInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
state);
String timeoutMessage = "Timed out waiting for airplane mode to be " +
@@ -561,8 +562,8 @@
// wait for airplane mode to change state
int currentWaitTime = 0;
- while (Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON, -1) != state) {
+ while (Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, -1) != state) {
timeoutWait(currentWaitTime, DEFAULT_WAIT_POLL_TIME, DEFAULT_MAX_WAIT_TIME,
timeoutMessage);
}
@@ -570,7 +571,7 @@
// Post the intent
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", true);
- mContext.sendBroadcast(intent);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
}
/**
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
index 607150a..785842f 100755
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -16,6 +16,8 @@
package android.content.pm;
+import static libcore.io.OsConstants.*;
+
import com.android.frameworks.coretests.R;
import com.android.internal.content.PackageHelper;
@@ -32,9 +34,11 @@
import android.os.Environment;
import android.os.FileUtils;
import android.os.IBinder;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StatFs;
+import android.os.SystemClock;
import android.os.storage.IMountService;
import android.os.storage.StorageListener;
import android.os.storage.StorageManager;
@@ -52,22 +56,39 @@
import java.io.InputStream;
import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import libcore.io.ErrnoException;
+import libcore.io.Libcore;
+import libcore.io.StructStat;
public class PackageManagerTests extends AndroidTestCase {
private static final boolean localLOGV = true;
- public static final String TAG="PackageManagerTests";
- public final long MAX_WAIT_TIME = 25*1000;
- public final long WAIT_TIME_INCR = 5*1000;
- private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec";
+
+ public static final String TAG = "PackageManagerTests";
+
+ public final long MAX_WAIT_TIME = 25 * 1000;
+
+ public final long WAIT_TIME_INCR = 5 * 1000;
+
+ private static final String APP_LIB_DIR_PREFIX = "/data/app-lib/";
+
+ private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec/";
+
private static final int APP_INSTALL_AUTO = PackageHelper.APP_INSTALL_AUTO;
+
private static final int APP_INSTALL_DEVICE = PackageHelper.APP_INSTALL_INTERNAL;
+
private static final int APP_INSTALL_SDCARD = PackageHelper.APP_INSTALL_EXTERNAL;
+
private boolean mOrigState;
void failStr(String errMsg) {
- Log.w(TAG, "errMsg="+errMsg);
+ Log.w(TAG, "errMsg=" + errMsg);
fail(errMsg);
}
+
void failStr(Exception e) {
failStr(e.getMessage());
}
@@ -97,10 +118,11 @@
private class PackageInstallObserver extends IPackageInstallObserver.Stub {
public int returnCode;
+
private boolean doneFlag = false;
public void packageInstalled(String packageName, int returnCode) {
- synchronized(this) {
+ synchronized (this) {
this.returnCode = returnCode;
doneFlag = true;
notifyAll();
@@ -114,10 +136,15 @@
abstract class GenericReceiver extends BroadcastReceiver {
private boolean doneFlag = false;
+
boolean received = false;
+
Intent intent;
+
IntentFilter filter;
+
abstract boolean notifyNow(Intent intent);
+
@Override
public void onReceive(Context context, Intent intent) {
if (notifyNow(intent)) {
@@ -179,11 +206,11 @@
mContext.registerReceiver(receiver, receiver.filter);
try {
// Wait on observer
- synchronized(observer) {
+ synchronized (observer) {
synchronized (receiver) {
getPm().installPackage(packageURI, observer, flags, null);
long waitTime = 0;
- while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
+ while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) {
try {
observer.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
@@ -191,7 +218,7 @@
Log.i(TAG, "Interrupted during sleep", e);
}
}
- if(!observer.isDone()) {
+ if (!observer.isDone()) {
fail("Timed out waiting for packageInstalled callback");
}
@@ -214,7 +241,7 @@
// Verify we received the broadcast
waitTime = 0;
- while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
+ while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) {
try {
receiver.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
@@ -222,7 +249,7 @@
Log.i(TAG, "Interrupted during sleep", e);
}
}
- if(!receiver.isDone()) {
+ if (!receiver.isDone()) {
fail("Timed out waiting for PACKAGE_ADDED notification");
}
}
@@ -236,10 +263,10 @@
PackageInstallObserver observer = new PackageInstallObserver();
try {
// Wait on observer
- synchronized(observer) {
+ synchronized (observer) {
getPm().installPackage(packageURI, observer, flags, null);
long waitTime = 0;
- while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
+ while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) {
try {
observer.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
@@ -247,7 +274,7 @@
Log.i(TAG, "Interrupted during sleep", e);
}
}
- if(!observer.isDone()) {
+ if (!observer.isDone()) {
fail("Timed out waiting for packageInstalled callback");
}
assertEquals(expectedResult, observer.returnCode);
@@ -280,39 +307,42 @@
File sourceFile = new File(archiveFilePath);
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
- PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
+ PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath,
+ metrics, 0);
packageParser = null;
return pkg;
}
+
private boolean checkSd(long pkgLen) {
String status = Environment.getExternalStorageState();
if (!status.equals(Environment.MEDIA_MOUNTED)) {
return false;
}
long sdSize = -1;
- StatFs sdStats = new StatFs(
- Environment.getExternalStorageDirectory().getPath());
- sdSize = (long)sdStats.getAvailableBlocks() *
- (long)sdStats.getBlockSize();
+ StatFs sdStats = new StatFs(Environment.getExternalStorageDirectory().getPath());
+ sdSize = (long) sdStats.getAvailableBlocks() * (long) sdStats.getBlockSize();
// TODO check for thresholds here
return pkgLen <= sdSize;
}
+
private boolean checkInt(long pkgLen) {
StatFs intStats = new StatFs(Environment.getDataDirectory().getPath());
- long intSize = (long)intStats.getBlockCount() *
- (long)intStats.getBlockSize();
- long iSize = (long)intStats.getAvailableBlocks() *
- (long)intStats.getBlockSize();
+ long intSize = (long) intStats.getBlockCount() * (long) intStats.getBlockSize();
+ long iSize = (long) intStats.getAvailableBlocks() * (long) intStats.getBlockSize();
// TODO check for thresholds here?
return pkgLen <= iSize;
}
+
private static final int INSTALL_LOC_INT = 1;
+
private static final int INSTALL_LOC_SD = 2;
+
private static final int INSTALL_LOC_ERR = -1;
+
private int getInstallLoc(int flags, int expInstallLocation, long pkgLen) {
// Flags explicitly over ride everything else.
- if ((flags & PackageManager.INSTALL_EXTERNAL) != 0 ) {
+ if ((flags & PackageManager.INSTALL_EXTERNAL) != 0) {
return INSTALL_LOC_SD;
} else if ((flags & PackageManager.INSTALL_INTERNAL) != 0) {
return INSTALL_LOC_INT;
@@ -320,7 +350,7 @@
// Manifest option takes precedence next
if (expInstallLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL) {
if (checkSd(pkgLen)) {
- return INSTALL_LOC_SD;
+ return INSTALL_LOC_SD;
}
if (checkInt(pkgLen)) {
return INSTALL_LOC_INT;
@@ -386,15 +416,12 @@
if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
assertTrue("The application should be installed forward locked",
(info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
- assertTrue("The APK path (" + srcPath + ") should start with "
- + SECURE_CONTAINERS_PREFIX,
- srcPath.startsWith(SECURE_CONTAINERS_PREFIX));
- assertTrue("The public APK path (" + publicSrcPath + ") should start with "
- + SECURE_CONTAINERS_PREFIX,
- publicSrcPath.startsWith(SECURE_CONTAINERS_PREFIX));
- assertTrue("The native library path (" + info.nativeLibraryDir
- + ") should start with " + SECURE_CONTAINERS_PREFIX,
- info.nativeLibraryDir.startsWith(SECURE_CONTAINERS_PREFIX));
+ assertStartsWith("The APK path should point to the ASEC",
+ SECURE_CONTAINERS_PREFIX, srcPath);
+ assertStartsWith("The public APK path should point to the ASEC",
+ SECURE_CONTAINERS_PREFIX, publicSrcPath);
+ assertStartsWith("The native library path should point to the ASEC",
+ SECURE_CONTAINERS_PREFIX, info.nativeLibraryDir);
try {
String compatLib = new File(info.dataDir + "/lib").getCanonicalPath();
assertEquals("The compatibility lib directory should be a symbolic link to "
@@ -407,7 +434,14 @@
assertFalse((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
assertEquals(srcPath, appInstallPath);
assertEquals(publicSrcPath, appInstallPath);
- assertTrue(info.nativeLibraryDir.startsWith(dataDir.getPath()));
+ assertStartsWith("Native library should point to shared lib directory",
+ new File(APP_LIB_DIR_PREFIX, info.packageName).getPath(),
+ info.nativeLibraryDir);
+ assertDirOwnerGroupPerms(
+ "Native library directory should be owned by system:system and 0755",
+ Process.SYSTEM_UID, Process.SYSTEM_UID,
+ S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH,
+ info.nativeLibraryDir);
}
assertFalse((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
@@ -417,12 +451,11 @@
nativeLibDir.exists());
try {
assertEquals("Native library dir should not be a symlink",
- info.nativeLibraryDir,
- nativeLibDir.getCanonicalPath());
+ info.nativeLibraryDir, nativeLibDir.getCanonicalPath());
} catch (IOException e) {
fail("Can't read " + nativeLibDir.getPath());
}
- } else if (rLoc == INSTALL_LOC_SD){
+ } else if (rLoc == INSTALL_LOC_SD) {
if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
assertTrue("The application should be installed forward locked",
(info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
@@ -435,14 +468,12 @@
(info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
// Might need to check:
// ((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0)
- assertTrue("The APK path (" + srcPath + ") should start with "
- + SECURE_CONTAINERS_PREFIX, srcPath.startsWith(SECURE_CONTAINERS_PREFIX));
- assertTrue("The public APK path (" + publicSrcPath + ") should start with "
- + SECURE_CONTAINERS_PREFIX,
- publicSrcPath.startsWith(SECURE_CONTAINERS_PREFIX));
- assertTrue("The native library path (" + info.nativeLibraryDir
- + ") should start with " + SECURE_CONTAINERS_PREFIX,
- info.nativeLibraryDir.startsWith(SECURE_CONTAINERS_PREFIX));
+ assertStartsWith("The APK path should point to the ASEC",
+ SECURE_CONTAINERS_PREFIX, srcPath);
+ assertStartsWith("The public APK path should point to the ASEC",
+ SECURE_CONTAINERS_PREFIX, publicSrcPath);
+ assertStartsWith("The native library path should point to the ASEC",
+ SECURE_CONTAINERS_PREFIX, info.nativeLibraryDir);
// Make sure the native library in /data/data/<app>/lib is a
// symlink to the ASEC
@@ -451,8 +482,8 @@
nativeLibSymLink.exists());
try {
assertEquals(nativeLibSymLink.getPath() + " should be a symlink to "
- + info.nativeLibraryDir, info.nativeLibraryDir, nativeLibSymLink
- .getCanonicalPath());
+ + info.nativeLibraryDir, info.nativeLibraryDir,
+ nativeLibSymLink.getCanonicalPath());
} catch (IOException e) {
fail("Can't read " + nativeLibSymLink.getPath());
}
@@ -465,6 +496,66 @@
}
}
+ private void assertDirOwnerGroupPerms(String reason, int uid, int gid, int perms, String path) {
+ final StructStat stat;
+
+ try {
+ stat = Libcore.os.lstat(path);
+ } catch (ErrnoException e) {
+ throw new AssertionError(reason + "\n" + "Got: " + path + " does not exist");
+ }
+
+ StringBuilder sb = new StringBuilder();
+
+ if (!S_ISDIR(stat.st_mode)) {
+ sb.append("\nExpected type: ");
+ sb.append(S_IFDIR);
+ sb.append("\ngot type: ");
+ sb.append((stat.st_mode & S_IFMT));
+ }
+
+ if (stat.st_uid != uid) {
+ sb.append("\nExpected owner: ");
+ sb.append(uid);
+ sb.append("\nGot owner: ");
+ sb.append(stat.st_uid);
+ }
+
+ if (stat.st_gid != gid) {
+ sb.append("\nExpected group: ");
+ sb.append(gid);
+ sb.append("\nGot group: ");
+ sb.append(stat.st_gid);
+ }
+
+ if ((stat.st_mode & ~S_IFMT) != perms) {
+ sb.append("\nExpected permissions: ");
+ sb.append(Integer.toOctalString(perms));
+ sb.append("\nGot permissions: ");
+ sb.append(Integer.toOctalString(stat.st_mode & ~S_IFMT));
+ }
+
+ if (sb.length() > 0) {
+ throw new AssertionError(reason + sb.toString());
+ }
+ }
+
+ private static void assertStartsWith(String prefix, String actual) {
+ assertStartsWith("", prefix, actual);
+ }
+
+ private static void assertStartsWith(String description, String prefix, String actual) {
+ if (!actual.startsWith(prefix)) {
+ StringBuilder sb = new StringBuilder(description);
+ sb.append("\nExpected prefix: ");
+ sb.append(prefix);
+ sb.append("\n got: ");
+ sb.append(actual);
+ sb.append('\n');
+ throw new AssertionError(sb.toString());
+ }
+ }
+
private void assertNotInstalled(String pkgName) {
try {
ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0);
@@ -475,30 +566,38 @@
class InstallParams {
Uri packageURI;
+
PackageParser.Package pkg;
+
InstallParams(String outFileName, int rawResId) {
this.pkg = getParsedPackage(outFileName, rawResId);
this.packageURI = Uri.fromFile(new File(pkg.mScanPath));
}
+
InstallParams(PackageParser.Package pkg) {
this.packageURI = Uri.fromFile(new File(pkg.mScanPath));
this.pkg = pkg;
}
+
long getApkSize() {
File file = new File(pkg.mScanPath);
return file.length();
}
}
- private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) {
- return installFromRawResource("install.apk", R.raw.install, flags, cleanUp,
- false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
+ private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) throws Exception {
+ return installFromRawResource("install.apk", R.raw.install, flags, cleanUp, false, -1,
+ PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
static final String PERM_PACKAGE = "package";
+
static final String PERM_DEFINED = "defined";
+
static final String PERM_UNDEFINED = "undefined";
+
static final String PERM_USED = "used";
+
static final String PERM_NOTUSED = "notused";
private void assertPermissions(String[] cmds) {
@@ -530,7 +629,7 @@
assertEquals(pi.name, cmd);
assertNotNull(pkgInfo);
boolean found = false;
- for (int j=0; j<pkgInfo.permissions.length && !found; j++) {
+ for (int j = 0; j < pkgInfo.permissions.length && !found; j++) {
if (pkgInfo.permissions[j].name.equals(cmd)) {
found = true;
}
@@ -549,7 +648,7 @@
}
if (pkgInfo != null) {
boolean found = false;
- for (int j=0; j<pkgInfo.permissions.length && !found; j++) {
+ for (int j = 0; j < pkgInfo.permissions.length && !found; j++) {
if (pkgInfo.permissions[j].name.equals(cmd)) {
found = true;
}
@@ -560,7 +659,7 @@
}
} else if (mode == PERM_USED || mode == PERM_NOTUSED) {
boolean found = false;
- for (int j=0; j<pkgInfo.requestedPermissions.length && !found; j++) {
+ for (int j = 0; j < pkgInfo.requestedPermissions.length && !found; j++) {
if (pkgInfo.requestedPermissions[j].equals(cmd)) {
found = true;
}
@@ -569,13 +668,11 @@
fail("Permission not requested: " + cmd);
}
if (mode == PERM_USED) {
- if (pm.checkPermission(cmd, pkg)
- != PackageManager.PERMISSION_GRANTED) {
+ if (pm.checkPermission(cmd, pkg) != PackageManager.PERMISSION_GRANTED) {
fail("Permission not granted: " + cmd);
}
} else {
- if (pm.checkPermission(cmd, pkg)
- != PackageManager.PERMISSION_DENIED) {
+ if (pm.checkPermission(cmd, pkg) != PackageManager.PERMISSION_DENIED) {
fail("Permission granted: " + cmd);
}
}
@@ -598,9 +695,8 @@
* copies it into own data directory and invokes
* PackageManager api to install it.
*/
- private void installFromRawResource(InstallParams ip,
- int flags, boolean cleanUp, boolean fail, int result,
- int expInstallLocation) {
+ private void installFromRawResource(InstallParams ip, int flags, boolean cleanUp, boolean fail,
+ int result, int expInstallLocation) throws Exception {
PackageManager pm = mContext.getPackageManager();
PackageParser.Package pkg = ip.pkg;
Uri packageURI = ip.packageURI;
@@ -640,26 +736,25 @@
* copies it into own data directory and invokes
* PackageManager api to install it.
*/
- private InstallParams installFromRawResource(String outFileName,
- int rawResId, int flags, boolean cleanUp, boolean fail, int result,
- int expInstallLocation) {
+ private InstallParams installFromRawResource(String outFileName, int rawResId, int flags,
+ boolean cleanUp, boolean fail, int result, int expInstallLocation) throws Exception {
InstallParams ip = new InstallParams(outFileName, rawResId);
installFromRawResource(ip, flags, cleanUp, fail, result, expInstallLocation);
return ip;
}
@LargeTest
- public void testInstallNormalInternal() {
+ public void testInstallNormalInternal() throws Exception {
sampleInstallFromRawResource(0, true);
}
@LargeTest
- public void testInstallFwdLockedInternal() {
+ public void testInstallFwdLockedInternal() throws Exception {
sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
}
@LargeTest
- public void testInstallSdcard() {
+ public void testInstallSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -669,14 +764,20 @@
sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true);
}
- /* ------------------------- Test replacing packages --------------*/
+ /* ------------------------- Test replacing packages -------------- */
class ReplaceReceiver extends GenericReceiver {
String pkgName;
+
final static int INVALID = -1;
+
final static int REMOVED = 1;
+
final static int ADDED = 2;
+
final static int REPLACED = 3;
+
int removed = INVALID;
+
// for updated system apps only
boolean update = false;
@@ -729,7 +830,7 @@
* PackageManager api to install first and then replace it
* again.
*/
- private void sampleReplaceFromRawResource(int flags) {
+ private void sampleReplaceFromRawResource(int flags) throws Exception {
InstallParams ip = sampleInstallFromRawResource(flags, false);
boolean replace = ((flags & PackageManager.INSTALL_REPLACE_EXISTING) != 0);
Log.i(TAG, "replace=" + replace);
@@ -751,17 +852,17 @@
}
@LargeTest
- public void testReplaceFailNormalInternal() {
+ public void testReplaceFailNormalInternal() throws Exception {
sampleReplaceFromRawResource(0);
}
@LargeTest
- public void testReplaceFailFwdLockedInternal() {
+ public void testReplaceFailFwdLockedInternal() throws Exception {
sampleReplaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK);
}
@LargeTest
- public void testReplaceFailSdcard() {
+ public void testReplaceFailSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -771,43 +872,72 @@
}
@LargeTest
- public void testReplaceNormalInternal() {
+ public void testReplaceNormalInternal() throws Exception {
sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING);
}
@LargeTest
- public void testReplaceFwdLockedInternal() {
- sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING |
- PackageManager.INSTALL_FORWARD_LOCK);
+ public void testReplaceFwdLockedInternal() throws Exception {
+ sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING
+ | PackageManager.INSTALL_FORWARD_LOCK);
}
@LargeTest
- public void testReplaceSdcard() {
+ public void testReplaceSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
}
- sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING |
- PackageManager.INSTALL_EXTERNAL);
+ sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING
+ | PackageManager.INSTALL_EXTERNAL);
}
- /* -------------- Delete tests ---*/
- class DeleteObserver extends IPackageDeleteObserver.Stub {
+ /* -------------- Delete tests --- */
+ private static class DeleteObserver extends IPackageDeleteObserver.Stub {
+ private CountDownLatch mLatch = new CountDownLatch(1);
- public boolean succeeded;
- private boolean doneFlag = false;
+ private int mReturnCode;
- public boolean isDone() {
- return doneFlag;
+ private final String mPackageName;
+
+ private String mObservedPackage;
+
+ public DeleteObserver(String packageName) {
+ mPackageName = packageName;
+ }
+
+ public boolean isSuccessful() {
+ return mReturnCode == PackageManager.DELETE_SUCCEEDED;
}
public void packageDeleted(String packageName, int returnCode) throws RemoteException {
- synchronized(this) {
- this.succeeded = returnCode == PackageManager.DELETE_SUCCEEDED;
- doneFlag = true;
- notifyAll();
+ mObservedPackage = packageName;
+
+ mReturnCode = returnCode;
+
+ mLatch.countDown();
+ }
+
+ public void waitForCompletion(long timeoutMillis) {
+ final long deadline = SystemClock.uptimeMillis() + timeoutMillis;
+
+ long waitTime = timeoutMillis;
+ while (waitTime > 0) {
+ try {
+ boolean done = mLatch.await(waitTime, TimeUnit.MILLISECONDS);
+ if (done) {
+ assertEquals(mPackageName, mObservedPackage);
+ return;
+ }
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ waitTime = deadline - SystemClock.uptimeMillis();
}
+
+ throw new AssertionError("Timeout waiting for package deletion");
}
}
@@ -835,53 +965,51 @@
}
}
- public boolean invokeDeletePackage(final String pkgName, int flags,
- GenericReceiver receiver) throws Exception {
- DeleteObserver observer = new DeleteObserver();
- final boolean received = false;
+ public boolean invokeDeletePackage(final String pkgName, int flags, GenericReceiver receiver)
+ throws Exception {
+ ApplicationInfo info = getPm().getApplicationInfo(pkgName,
+ PackageManager.GET_UNINSTALLED_PACKAGES);
+
mContext.registerReceiver(receiver, receiver.filter);
try {
- // Wait on observer
- synchronized(observer) {
- synchronized (receiver) {
- getPm().deletePackage(pkgName, observer, flags);
- long waitTime = 0;
- while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
- observer.wait(WAIT_TIME_INCR);
- waitTime += WAIT_TIME_INCR;
- }
- if(!observer.isDone()) {
- throw new Exception("Timed out waiting for packageInstalled callback");
- }
- // Verify we received the broadcast
- waitTime = 0;
- while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
- receiver.wait(WAIT_TIME_INCR);
- waitTime += WAIT_TIME_INCR;
- }
- if(!receiver.isDone()) {
- throw new Exception("Timed out waiting for PACKAGE_REMOVED notification");
- }
- return receiver.received;
- }
+ DeleteObserver observer = new DeleteObserver(pkgName);
+
+ getPm().deletePackage(pkgName, observer, flags);
+ observer.waitForCompletion(MAX_WAIT_TIME);
+
+ assertUninstalled(info);
+
+ // Verify we received the broadcast
+ long waitTime = 0;
+ while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) {
+ receiver.wait(WAIT_TIME_INCR);
+ waitTime += WAIT_TIME_INCR;
}
+ if (!receiver.isDone()) {
+ throw new Exception("Timed out waiting for PACKAGE_REMOVED notification");
+ }
+ return receiver.received;
} finally {
mContext.unregisterReceiver(receiver);
}
}
- public void deleteFromRawResource(int iFlags, int dFlags) {
+ private static void assertUninstalled(ApplicationInfo info) throws Exception {
+ File nativeLibraryFile = new File(info.nativeLibraryDir);
+ assertFalse("Native library directory should be erased", nativeLibraryFile.exists());
+ }
+
+ public void deleteFromRawResource(int iFlags, int dFlags) throws Exception {
InstallParams ip = sampleInstallFromRawResource(iFlags, false);
boolean retainData = ((dFlags & PackageManager.DELETE_KEEP_DATA) != 0);
GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName);
- DeleteObserver observer = new DeleteObserver();
try {
assertTrue(invokeDeletePackage(ip.pkg.packageName, dFlags, receiver));
ApplicationInfo info = null;
Log.i(TAG, "okay4");
try {
- info = getPm().getApplicationInfo(ip.pkg.packageName,
- PackageManager.GET_UNINSTALLED_PACKAGES);
+ info = getPm().getApplicationInfo(ip.pkg.packageName,
+ PackageManager.GET_UNINSTALLED_PACKAGES);
} catch (NameNotFoundException e) {
info = null;
}
@@ -901,17 +1029,17 @@
}
@LargeTest
- public void testDeleteNormalInternal() {
+ public void testDeleteNormalInternal() throws Exception {
deleteFromRawResource(0, 0);
}
@LargeTest
- public void testDeleteFwdLockedInternal() {
+ public void testDeleteFwdLockedInternal() throws Exception {
deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0);
}
@LargeTest
- public void testDeleteSdcard() {
+ public void testDeleteSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -921,17 +1049,17 @@
}
@LargeTest
- public void testDeleteNormalInternalRetainData() {
+ public void testDeleteNormalInternalRetainData() throws Exception {
deleteFromRawResource(0, PackageManager.DELETE_KEEP_DATA);
}
@LargeTest
- public void testDeleteFwdLockedInternalRetainData() {
+ public void testDeleteFwdLockedInternalRetainData() throws Exception {
deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DELETE_KEEP_DATA);
}
@LargeTest
- public void testDeleteSdcardRetainData() {
+ public void testDeleteSdcardRetainData() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -940,10 +1068,11 @@
deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.DELETE_KEEP_DATA);
}
- /* sdcard mount/unmount tests ******/
+ /* sdcard mount/unmount tests ***** */
class SdMountReceiver extends GenericReceiver {
String pkgNames[];
+
boolean status = true;
SdMountReceiver(String[] pkgNames) {
@@ -978,6 +1107,7 @@
class SdUnMountReceiver extends GenericReceiver {
String pkgNames[];
+
boolean status = true;
SdUnMountReceiver(String[] pkgNames) {
@@ -1089,14 +1219,14 @@
sm.registerListener(observer);
try {
// Wait on observer
- synchronized(observer) {
+ synchronized (observer) {
getMs().unmountVolume(path, true, false);
long waitTime = 0;
- while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
+ while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) {
observer.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
}
- if(!observer.isDone()) {
+ if (!observer.isDone()) {
throw new Exception("Timed out waiting for unmount media notification");
}
return true;
@@ -1109,7 +1239,7 @@
}
}
- private boolean mountFromRawResource() {
+ private boolean mountFromRawResource() throws Exception {
// Install pkg on sdcard
InstallParams ip = sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, false);
if (localLOGV) Log.i(TAG, "Installed pkg on sdcard");
@@ -1136,7 +1266,7 @@
long waitTime = 0;
// Verify we received the broadcast
waitTime = 0;
- while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
+ while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) {
receiver.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
}
@@ -1149,7 +1279,9 @@
failStr(e);
return false;
} finally {
- if (registeredReceiver) mContext.unregisterReceiver(receiver);
+ if (registeredReceiver) {
+ mContext.unregisterReceiver(receiver);
+ }
// Restore original media state
if (origState) {
mountMedia();
@@ -1167,7 +1299,7 @@
* Make sure the installed package is available.
*/
@LargeTest
- public void testMountSdNormalInternal() {
+ public void testMountSdNormalInternal() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1176,19 +1308,38 @@
assertTrue(mountFromRawResource());
}
- void cleanUpInstall(InstallParams ip) {
+ void cleanUpInstall(InstallParams ip) throws Exception {
if (ip == null) {
return;
}
Runtime.getRuntime().gc();
- Log.i(TAG, "Deleting package : " + ip.pkg.packageName);
- getPm().deletePackage(ip.pkg.packageName, null, 0);
- File outFile = new File(ip.pkg.mScanPath);
- if (outFile != null && outFile.exists()) {
- outFile.delete();
+
+ final String packageName = ip.pkg.packageName;
+ Log.i(TAG, "Deleting package : " + packageName);
+
+ ApplicationInfo info = null;
+ try {
+ info = getPm().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
+ } catch (NameNotFoundException ignored) {
+ }
+
+ DeleteObserver observer = new DeleteObserver(packageName);
+ getPm().deletePackage(packageName, observer, 0);
+ observer.waitForCompletion(MAX_WAIT_TIME);
+
+ try {
+ if (info != null) {
+ assertUninstalled(info);
+ }
+ } finally {
+ File outFile = new File(ip.pkg.mScanPath);
+ if (outFile != null && outFile.exists()) {
+ outFile.delete();
+ }
}
}
- void cleanUpInstall(String pkgName) {
+
+ private void cleanUpInstall(String pkgName) throws Exception {
if (pkgName == null) {
return;
}
@@ -1196,20 +1347,25 @@
try {
ApplicationInfo info = getPm().getApplicationInfo(pkgName,
PackageManager.GET_UNINSTALLED_PACKAGES);
+
if (info != null) {
- getPm().deletePackage(pkgName, null, 0);
+ DeleteObserver observer = new DeleteObserver(pkgName);
+ getPm().deletePackage(pkgName, observer, 0);
+ observer.waitForCompletion(MAX_WAIT_TIME);
+ assertUninstalled(info);
}
- } catch (NameNotFoundException e) {}
+ } catch (NameNotFoundException e) {
+ }
}
@LargeTest
- public void testManifestInstallLocationInternal() {
+ public void testManifestInstallLocationInternal() throws Exception {
installFromRawResource("install.apk", R.raw.install_loc_internal,
0, true, false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
}
@LargeTest
- public void testManifestInstallLocationSdcard() {
+ public void testManifestInstallLocationSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1220,19 +1376,19 @@
}
@LargeTest
- public void testManifestInstallLocationAuto() {
+ public void testManifestInstallLocationAuto() throws Exception {
installFromRawResource("install.apk", R.raw.install_loc_auto,
0, true, false, -1, PackageInfo.INSTALL_LOCATION_AUTO);
}
@LargeTest
- public void testManifestInstallLocationUnspecified() {
+ public void testManifestInstallLocationUnspecified() throws Exception {
installFromRawResource("install.apk", R.raw.install_loc_unspecified,
0, true, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
@LargeTest
- public void testManifestInstallLocationFwdLockedFlagSdcard() {
+ public void testManifestInstallLocationFwdLockedFlagSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1245,15 +1401,14 @@
}
@LargeTest
- public void testManifestInstallLocationFwdLockedSdcard() {
+ public void testManifestInstallLocationFwdLockedSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
}
installFromRawResource("install.apk", R.raw.install_loc_sdcard,
- PackageManager.INSTALL_FORWARD_LOCK, true, false,
- -1,
+ PackageManager.INSTALL_FORWARD_LOCK, true, false, -1,
PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
}
@@ -1263,7 +1418,7 @@
* the old install location.
*/
@LargeTest
- public void testReplaceFlagInternalSdcard() {
+ public void testReplaceFlagInternalSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1290,7 +1445,7 @@
* install location is retained.
*/
@LargeTest
- public void testReplaceFlagSdcardInternal() {
+ public void testReplaceFlagSdcardInternal() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1312,7 +1467,7 @@
}
@LargeTest
- public void testManifestInstallLocationReplaceInternalSdcard() {
+ public void testManifestInstallLocationReplaceInternalSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1340,7 +1495,7 @@
}
@LargeTest
- public void testManifestInstallLocationReplaceSdcardInternal() {
+ public void testManifestInstallLocationReplaceSdcardInternal() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1368,9 +1523,13 @@
class MoveReceiver extends GenericReceiver {
String pkgName;
+
final static int INVALID = -1;
+
final static int REMOVED = 1;
+
final static int ADDED = 2;
+
int removed = INVALID;
MoveReceiver(String pkgName) {
@@ -1414,17 +1573,21 @@
private class PackageMoveObserver extends IPackageMoveObserver.Stub {
public int returnCode;
+
private boolean doneFlag = false;
+
public String packageName;
+
public PackageMoveObserver(String pkgName) {
packageName = pkgName;
}
+
public void packageMoved(String packageName, int returnCode) {
Log.i("DEBUG_MOVE::", "pkg = " + packageName + ", " + "ret = " + returnCode);
if (!packageName.equals(this.packageName)) {
return;
}
- synchronized(this) {
+ synchronized (this) {
this.returnCode = returnCode;
doneFlag = true;
notifyAll();
@@ -1436,22 +1599,22 @@
}
}
- public boolean invokeMovePackage(String pkgName, int flags,
- GenericReceiver receiver) throws Exception {
+ public boolean invokeMovePackage(String pkgName, int flags, GenericReceiver receiver)
+ throws Exception {
PackageMoveObserver observer = new PackageMoveObserver(pkgName);
final boolean received = false;
mContext.registerReceiver(receiver, receiver.filter);
try {
// Wait on observer
- synchronized(observer) {
+ synchronized (observer) {
synchronized (receiver) {
getPm().movePackage(pkgName, observer, flags);
long waitTime = 0;
- while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
+ while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) {
observer.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
}
- if(!observer.isDone()) {
+ if (!observer.isDone()) {
throw new Exception("Timed out waiting for pkgmove callback");
}
if (observer.returnCode != PackageManager.MOVE_SUCCEEDED) {
@@ -1459,11 +1622,11 @@
}
// Verify we received the broadcast
waitTime = 0;
- while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
+ while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) {
receiver.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
}
- if(!receiver.isDone()) {
+ if (!receiver.isDone()) {
throw new Exception("Timed out waiting for MOVE notifications");
}
return receiver.received;
@@ -1473,18 +1636,19 @@
mContext.unregisterReceiver(receiver);
}
}
+
private boolean invokeMovePackageFail(String pkgName, int flags, int errCode) throws Exception {
PackageMoveObserver observer = new PackageMoveObserver(pkgName);
try {
// Wait on observer
- synchronized(observer) {
+ synchronized (observer) {
getPm().movePackage(pkgName, observer, flags);
long waitTime = 0;
- while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
+ while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) {
observer.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
}
- if(!observer.isDone()) {
+ if (!observer.isDone()) {
throw new Exception("Timed out waiting for pkgmove callback");
}
assertEquals(errCode, observer.returnCode);
@@ -1497,7 +1661,8 @@
private int getDefaultInstallLoc() {
int origDefaultLoc = PackageInfo.INSTALL_LOCATION_AUTO;
try {
- origDefaultLoc = Settings.System.getInt(mContext.getContentResolver(), Settings.Secure.DEFAULT_INSTALL_LOCATION);
+ origDefaultLoc = Settings.System.getInt(mContext.getContentResolver(),
+ Settings.Secure.DEFAULT_INSTALL_LOCATION);
} catch (SettingNotFoundException e1) {
}
return origDefaultLoc;
@@ -1507,6 +1672,7 @@
Settings.System.putInt(mContext.getContentResolver(),
Settings.Secure.DEFAULT_INSTALL_LOCATION, loc);
}
+
/*
* Tests for moving apps between internal and external storage
*/
@@ -1517,9 +1683,8 @@
* again.
*/
- private void moveFromRawResource(String outFileName,
- int rawResId, int installFlags, int moveFlags, boolean cleanUp,
- boolean fail, int result) {
+ private void moveFromRawResource(String outFileName, int rawResId, int installFlags,
+ int moveFlags, boolean cleanUp, boolean fail, int result) throws Exception {
int origDefaultLoc = getDefaultInstallLoc();
InstallParams ip = null;
try {
@@ -1536,8 +1701,7 @@
} else {
// Create receiver based on expRetCode
MoveReceiver receiver = new MoveReceiver(ip.pkg.packageName);
- boolean retCode = invokeMovePackage(ip.pkg.packageName, moveFlags,
- receiver);
+ boolean retCode = invokeMovePackage(ip.pkg.packageName, moveFlags, receiver);
assertTrue(retCode);
ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0);
assertNotNull("ApplicationInfo for recently installed application should exist",
@@ -1545,16 +1709,16 @@
if ((moveFlags & PackageManager.MOVE_INTERNAL) != 0) {
assertTrue("ApplicationInfo.FLAG_EXTERNAL_STORAGE flag should NOT be set",
(info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0);
- assertTrue("ApplicationInfo.nativeLibraryDir should start with " + info.dataDir,
- info.nativeLibraryDir.startsWith(info.dataDir));
- } else if ((moveFlags & PackageManager.MOVE_EXTERNAL_MEDIA) != 0){
+ assertStartsWith("Native library dir should be in dataDir",
+ info.dataDir, info.nativeLibraryDir);
+ } else if ((moveFlags & PackageManager.MOVE_EXTERNAL_MEDIA) != 0) {
assertTrue("ApplicationInfo.FLAG_EXTERNAL_STORAGE flag should be set",
(info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
- assertTrue("ApplicationInfo.nativeLibraryDir should start with " + SECURE_CONTAINERS_PREFIX,
- info.nativeLibraryDir.startsWith(SECURE_CONTAINERS_PREFIX));
+ assertStartsWith("Native library dir should point to ASEC",
+ SECURE_CONTAINERS_PREFIX, info.nativeLibraryDir);
final File nativeLibSymLink = new File(info.dataDir, "lib");
- assertTrue("The data directory should have a 'lib' symlink that points to the ASEC container",
- nativeLibSymLink.getCanonicalPath().startsWith(SECURE_CONTAINERS_PREFIX));
+ assertStartsWith("The data directory should have a 'lib' symlink that points to the ASEC container",
+ SECURE_CONTAINERS_PREFIX, nativeLibSymLink.getCanonicalPath());
}
}
} catch (NameNotFoundException e) {
@@ -1569,15 +1733,16 @@
setInstallLoc(origDefaultLoc);
}
}
+
private void sampleMoveFromRawResource(int installFlags, int moveFlags, boolean fail,
- int result) {
+ int result) throws Exception {
moveFromRawResource("install.apk",
R.raw.install, installFlags, moveFlags, true,
fail, result);
}
@LargeTest
- public void testMoveAppInternalToExternal() {
+ public void testMoveAppInternalToExternal() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1591,7 +1756,7 @@
}
@LargeTest
- public void testMoveAppInternalToInternal() {
+ public void testMoveAppInternalToInternal() throws Exception {
int installFlags = PackageManager.INSTALL_INTERNAL;
int moveFlags = PackageManager.MOVE_INTERNAL;
boolean fail = true;
@@ -1600,7 +1765,7 @@
}
@LargeTest
- public void testMoveAppExternalToExternal() {
+ public void testMoveAppExternalToExternal() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1614,7 +1779,7 @@
}
@LargeTest
- public void testMoveAppExternalToInternal() {
+ public void testMoveAppExternalToInternal() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1628,7 +1793,7 @@
}
@LargeTest
- public void testMoveAppForwardLocked() {
+ public void testMoveAppForwardLocked() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1642,7 +1807,7 @@
}
@LargeTest
- public void testMoveAppFailInternalToExternalDelete() {
+ public void testMoveAppFailInternalToExternalDelete() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1682,7 +1847,7 @@
* and package installed on sdcard via package manager flag.
*/
@LargeTest
- public void testInstallSdcardUnmount() {
+ public void testInstallSdcardUnmount() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1712,7 +1877,7 @@
* on sdcard. Make sure it gets installed on internal flash.
*/
@LargeTest
- public void testInstallManifestSdcardUnmount() {
+ public void testInstallManifestSdcardUnmount() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1735,22 +1900,22 @@
}
}
- /*---------- Recommended install location tests ----*/
- /* Precedence: FlagManifestExistingUser
- * PrecedenceSuffixes:
- * Flag : FlagI, FlagE, FlagF
- * I - internal, E - external, F - forward locked, Flag suffix absent if not using any option.
- * Manifest: ManifestI, ManifestE, ManifestA, Manifest suffix absent if not using any option.
- * Existing: Existing suffix absent if not existing.
- * User: UserI, UserE, UserA, User suffix absent if not existing.
- *
- */
+ /*---------- Recommended install location tests ----*/
+ /*
+ * PrecedenceSuffixes:
+ * Flag : FlagI, FlagE, FlagF
+ * I - internal, E - external, F - forward locked, Flag suffix absent if not using any option.
+ * Manifest: ManifestI, ManifestE, ManifestA, Manifest suffix absent if not using any option.
+ * Existing: Existing suffix absent if not existing.
+ * User: UserI, UserE, UserA, User suffix absent if not existing.
+ *
+ */
/*
* Install an app on internal flash
*/
@LargeTest
- public void testFlagI() {
+ public void testFlagI() throws Exception {
sampleInstallFromRawResource(PackageManager.INSTALL_INTERNAL, true);
}
@@ -1758,7 +1923,7 @@
* Install an app on sdcard.
*/
@LargeTest
- public void testFlagE() {
+ public void testFlagE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1771,7 +1936,7 @@
* Install an app forward-locked.
*/
@LargeTest
- public void testFlagF() {
+ public void testFlagF() throws Exception {
sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
}
@@ -1779,7 +1944,7 @@
* Install an app with both internal and external flags set. should fail
*/
@LargeTest
- public void testFlagIE() {
+ public void testFlagIE() throws Exception {
installFromRawResource("install.apk", R.raw.install,
PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_INTERNAL,
false,
@@ -1791,7 +1956,7 @@
* Install an app with both internal and forward-lock flags set.
*/
@LargeTest
- public void testFlagIF() {
+ public void testFlagIF() throws Exception {
sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK
| PackageManager.INSTALL_INTERNAL, true);
}
@@ -1800,7 +1965,7 @@
* Install an app with both external and forward-lock flags set.
*/
@LargeTest
- public void testFlagEF() {
+ public void testFlagEF() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1815,7 +1980,7 @@
* lock. Should fail.
*/
@LargeTest
- public void testFlagIEF() {
+ public void testFlagIEF() throws Exception {
installFromRawResource("install.apk", R.raw.install,
PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_INTERNAL |
PackageManager.INSTALL_EXTERNAL,
@@ -1824,66 +1989,66 @@
PackageInfo.INSTALL_LOCATION_AUTO);
}
- /*
- * Install an app with both internal and manifest option set.
- * should install on internal.
- */
- @LargeTest
- public void testFlagIManifestI() {
- installFromRawResource("install.apk", R.raw.install_loc_internal,
- PackageManager.INSTALL_INTERNAL,
- true,
- false, -1,
- PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
- }
- /*
- * Install an app with both internal and manifest preference for
- * preferExternal. Should install on internal.
- */
- @LargeTest
- public void testFlagIManifestE() {
- installFromRawResource("install.apk", R.raw.install_loc_sdcard,
- PackageManager.INSTALL_INTERNAL,
- true,
- false, -1,
- PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
- }
- /*
- * Install an app with both internal and manifest preference for
- * auto. should install internal.
- */
- @LargeTest
- public void testFlagIManifestA() {
- installFromRawResource("install.apk", R.raw.install_loc_auto,
- PackageManager.INSTALL_INTERNAL,
- true,
- false, -1,
- PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
- }
- /*
- * Install an app with both external and manifest option set.
- * should install externally.
- */
- @LargeTest
- public void testFlagEManifestI() {
+ /*
+ * Install an app with both internal and manifest option set.
+ * should install on internal.
+ */
+ @LargeTest
+ public void testFlagIManifestI() throws Exception {
+ installFromRawResource("install.apk", R.raw.install_loc_internal,
+ PackageManager.INSTALL_INTERNAL,
+ true,
+ false, -1,
+ PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
+ }
+ /*
+ * Install an app with both internal and manifest preference for
+ * preferExternal. Should install on internal.
+ */
+ @LargeTest
+ public void testFlagIManifestE() throws Exception {
+ installFromRawResource("install.apk", R.raw.install_loc_sdcard,
+ PackageManager.INSTALL_INTERNAL,
+ true,
+ false, -1,
+ PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
+ }
+ /*
+ * Install an app with both internal and manifest preference for
+ * auto. should install internal.
+ */
+ @LargeTest
+ public void testFlagIManifestA() throws Exception {
+ installFromRawResource("install.apk", R.raw.install_loc_auto,
+ PackageManager.INSTALL_INTERNAL,
+ true,
+ false, -1,
+ PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
+ }
+ /*
+ * Install an app with both external and manifest option set.
+ * should install externally.
+ */
+ @LargeTest
+ public void testFlagEManifestI() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
}
- installFromRawResource("install.apk", R.raw.install_loc_internal,
- PackageManager.INSTALL_EXTERNAL,
- true,
- false, -1,
- PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
- }
+ installFromRawResource("install.apk", R.raw.install_loc_internal,
+ PackageManager.INSTALL_EXTERNAL,
+ true,
+ false, -1,
+ PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
+ }
- /*
- * Install an app with both external and manifest preference for
- * preferExternal. Should install externally.
- */
- @LargeTest
- public void testFlagEManifestE() {
+ /*
+ * Install an app with both external and manifest preference for
+ * preferExternal. Should install externally.
+ */
+ @LargeTest
+ public void testFlagEManifestE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1901,7 +2066,7 @@
* auto. should install on external media.
*/
@LargeTest
- public void testFlagEManifestA() {
+ public void testFlagEManifestA() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1919,7 +2084,7 @@
* internal. should install internally.
*/
@LargeTest
- public void testFlagFManifestI() {
+ public void testFlagFManifestI() throws Exception {
installFromRawResource("install.apk", R.raw.install_loc_internal,
PackageManager.INSTALL_FORWARD_LOCK,
true,
@@ -1932,7 +2097,7 @@
* preferExternal. Should install externally.
*/
@LargeTest
- public void testFlagFManifestE() {
+ public void testFlagFManifestE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1950,7 +2115,7 @@
* should install externally.
*/
@LargeTest
- public void testFlagFManifestA() {
+ public void testFlagFManifestA() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -1963,7 +2128,8 @@
PackageInfo.INSTALL_LOCATION_AUTO);
}
- /* The following test functions verify install location for existing apps.
+ /*
+ * The following test functions verify install location for existing apps.
* ie existing app can be installed internally or externally. If install
* flag is explicitly set it should override current location. If manifest location
* is set, that should over ride current location too. if not the existing install
@@ -1971,7 +2137,7 @@
* testFlagI/E/F/ExistingI/E -
*/
@LargeTest
- public void testFlagIExistingI() {
+ public void testFlagIExistingI() throws Exception {
int iFlags = PackageManager.INSTALL_INTERNAL;
int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
// First install.
@@ -1989,7 +2155,7 @@
}
@LargeTest
- public void testFlagIExistingE() {
+ public void testFlagIExistingE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2012,7 +2178,7 @@
}
@LargeTest
- public void testFlagEExistingI() {
+ public void testFlagEExistingI() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2035,7 +2201,7 @@
}
@LargeTest
- public void testFlagEExistingE() {
+ public void testFlagEExistingE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2058,7 +2224,7 @@
}
@LargeTest
- public void testFlagFExistingI() {
+ public void testFlagFExistingI() throws Exception {
int iFlags = PackageManager.INSTALL_INTERNAL;
int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING;
// First install.
@@ -2076,7 +2242,7 @@
}
@LargeTest
- public void testFlagFExistingE() {
+ public void testFlagFExistingE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2106,7 +2272,7 @@
* TODO out of memory fall back behaviour.
*/
@LargeTest
- public void testManifestI() {
+ public void testManifestI() throws Exception {
installFromRawResource("install.apk", R.raw.install_loc_internal,
0,
true,
@@ -2115,7 +2281,7 @@
}
@LargeTest
- public void testManifestE() {
+ public void testManifestE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2129,7 +2295,7 @@
}
@LargeTest
- public void testManifestA() {
+ public void testManifestA() throws Exception {
installFromRawResource("install.apk", R.raw.install_loc_auto,
0,
true,
@@ -2145,7 +2311,7 @@
* testManifestI/E/AExistingI/E
*/
@LargeTest
- public void testManifestIExistingI() {
+ public void testManifestIExistingI() throws Exception {
int iFlags = PackageManager.INSTALL_INTERNAL;
int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
// First install.
@@ -2163,7 +2329,7 @@
}
@LargeTest
- public void testManifestIExistingE() {
+ public void testManifestIExistingE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2186,7 +2352,7 @@
}
@LargeTest
- public void testManifestEExistingI() {
+ public void testManifestEExistingI() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2209,7 +2375,7 @@
}
@LargeTest
- public void testManifestEExistingE() {
+ public void testManifestEExistingE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2232,7 +2398,7 @@
}
@LargeTest
- public void testManifestAExistingI() {
+ public void testManifestAExistingI() throws Exception {
int iFlags = PackageManager.INSTALL_INTERNAL;
int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
// First install.
@@ -2250,7 +2416,7 @@
}
@LargeTest
- public void testManifestAExistingE() {
+ public void testManifestAExistingE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2272,55 +2438,56 @@
PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
}
- /*
- * The following set of tests check install location for existing
- * application based on user setting.
- */
- private int getExpectedInstallLocation(int userSetting) {
- int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
- boolean enable = getUserSettingSetInstallLocation();
- if (enable) {
- if (userSetting == PackageHelper.APP_INSTALL_AUTO) {
- iloc = PackageInfo.INSTALL_LOCATION_AUTO;
- } else if (userSetting == PackageHelper.APP_INSTALL_EXTERNAL) {
- iloc = PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL;
- } else if (userSetting == PackageHelper.APP_INSTALL_INTERNAL) {
- iloc = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
- }
- }
- return iloc;
- }
- private void setExistingXUserX(int userSetting, int iFlags, int iloc) {
- int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
- // First install.
- installFromRawResource("install.apk", R.raw.install,
- iFlags,
- false,
- false, -1,
- PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
- int origSetting = getDefaultInstallLoc();
- try {
- // Set user setting
- setInstallLoc(userSetting);
- // Replace now
- installFromRawResource("install.apk", R.raw.install,
- rFlags,
- true,
- false, -1,
- iloc);
- } finally {
- setInstallLoc(origSetting);
- }
- }
- @LargeTest
- public void testExistingIUserI() {
- int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
- int iFlags = PackageManager.INSTALL_INTERNAL;
- setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
- }
+ /*
+ * The following set of tests check install location for existing
+ * application based on user setting.
+ */
+ private int getExpectedInstallLocation(int userSetting) {
+ int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
+ boolean enable = getUserSettingSetInstallLocation();
+ if (enable) {
+ if (userSetting == PackageHelper.APP_INSTALL_AUTO) {
+ iloc = PackageInfo.INSTALL_LOCATION_AUTO;
+ } else if (userSetting == PackageHelper.APP_INSTALL_EXTERNAL) {
+ iloc = PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL;
+ } else if (userSetting == PackageHelper.APP_INSTALL_INTERNAL) {
+ iloc = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
+ }
+ }
+ return iloc;
+ }
+
+ private void setExistingXUserX(int userSetting, int iFlags, int iloc) throws Exception {
+ int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
+ // First install.
+ installFromRawResource("install.apk", R.raw.install,
+ iFlags,
+ false,
+ false, -1,
+ PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
+ int origSetting = getDefaultInstallLoc();
+ try {
+ // Set user setting
+ setInstallLoc(userSetting);
+ // Replace now
+ installFromRawResource("install.apk", R.raw.install,
+ rFlags,
+ true,
+ false, -1,
+ iloc);
+ } finally {
+ setInstallLoc(origSetting);
+ }
+ }
+ @LargeTest
+ public void testExistingIUserI() throws Exception {
+ int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
+ int iFlags = PackageManager.INSTALL_INTERNAL;
+ setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
+ }
@LargeTest
- public void testExistingIUserE() {
+ public void testExistingIUserE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2331,15 +2498,15 @@
setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
}
- @LargeTest
- public void testExistingIUserA() {
- int userSetting = PackageHelper.APP_INSTALL_AUTO;
- int iFlags = PackageManager.INSTALL_INTERNAL;
- setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
- }
+ @LargeTest
+ public void testExistingIUserA() throws Exception {
+ int userSetting = PackageHelper.APP_INSTALL_AUTO;
+ int iFlags = PackageManager.INSTALL_INTERNAL;
+ setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
+ }
@LargeTest
- public void testExistingEUserI() {
+ public void testExistingEUserI() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2351,7 +2518,7 @@
}
@LargeTest
- public void testExistingEUserE() {
+ public void testExistingEUserE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2363,7 +2530,7 @@
}
@LargeTest
- public void testExistingEUserA() {
+ public void testExistingEUserA() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2374,52 +2541,53 @@
setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
}
- /*
- * The following set of tests verify that the user setting defines
- * the install location.
- *
- */
- private boolean getUserSettingSetInstallLocation() {
- try {
- return Settings.System.getInt(mContext.getContentResolver(), Settings.Secure.SET_INSTALL_LOCATION) != 0;
+ /*
+ * The following set of tests verify that the user setting defines
+ * the install location.
+ *
+ */
+ private boolean getUserSettingSetInstallLocation() {
+ try {
+ return Settings.System.getInt(mContext.getContentResolver(), Settings.Secure.SET_INSTALL_LOCATION) != 0;
- } catch (SettingNotFoundException e1) {
- }
- return false;
- }
+ } catch (SettingNotFoundException e1) {
+ }
+ return false;
+ }
- private void setUserSettingSetInstallLocation(boolean value) {
- Settings.System.putInt(mContext.getContentResolver(),
- Settings.Secure.SET_INSTALL_LOCATION, value ? 1 : 0);
- }
- private void setUserX(boolean enable, int userSetting, int iloc) {
- boolean origUserSetting = getUserSettingSetInstallLocation();
- int origSetting = getDefaultInstallLoc();
- try {
- setUserSettingSetInstallLocation(enable);
- // Set user setting
- setInstallLoc(userSetting);
- // Replace now
- installFromRawResource("install.apk", R.raw.install,
- 0,
- true,
- false, -1,
- iloc);
- } finally {
- // Restore original setting
- setUserSettingSetInstallLocation(origUserSetting);
- setInstallLoc(origSetting);
- }
- }
- @LargeTest
- public void testUserI() {
- int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
- int iloc = getExpectedInstallLocation(userSetting);
- setUserX(true, userSetting, iloc);
- }
+ private void setUserSettingSetInstallLocation(boolean value) {
+ Settings.System.putInt(mContext.getContentResolver(),
+ Settings.Secure.SET_INSTALL_LOCATION, value ? 1 : 0);
+ }
+
+ private void setUserX(boolean enable, int userSetting, int iloc) throws Exception {
+ boolean origUserSetting = getUserSettingSetInstallLocation();
+ int origSetting = getDefaultInstallLoc();
+ try {
+ setUserSettingSetInstallLocation(enable);
+ // Set user setting
+ setInstallLoc(userSetting);
+ // Replace now
+ installFromRawResource("install.apk", R.raw.install,
+ 0,
+ true,
+ false, -1,
+ iloc);
+ } finally {
+ // Restore original setting
+ setUserSettingSetInstallLocation(origUserSetting);
+ setInstallLoc(origSetting);
+ }
+ }
+ @LargeTest
+ public void testUserI() throws Exception {
+ int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
+ int iloc = getExpectedInstallLocation(userSetting);
+ setUserX(true, userSetting, iloc);
+ }
@LargeTest
- public void testUserE() {
+ public void testUserE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2430,25 +2598,26 @@
setUserX(true, userSetting, iloc);
}
- @LargeTest
- public void testUserA() {
- int userSetting = PackageHelper.APP_INSTALL_AUTO;
- int iloc = getExpectedInstallLocation(userSetting);
- setUserX(true, userSetting, iloc);
- }
- /*
- * The following set of tests turn on/off the basic
- * user setting for turning on install location.
- */
- @LargeTest
- public void testUserPrefOffUserI() {
- int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
- int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
- setUserX(false, userSetting, iloc);
- }
+ @LargeTest
+ public void testUserA() throws Exception {
+ int userSetting = PackageHelper.APP_INSTALL_AUTO;
+ int iloc = getExpectedInstallLocation(userSetting);
+ setUserX(true, userSetting, iloc);
+ }
+
+ /*
+ * The following set of tests turn on/off the basic
+ * user setting for turning on install location.
+ */
+ @LargeTest
+ public void testUserPrefOffUserI() throws Exception {
+ int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
+ int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
+ setUserX(false, userSetting, iloc);
+ }
@LargeTest
- public void testUserPrefOffUserE() {
+ public void testUserPrefOffUserE() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2459,12 +2628,12 @@
setUserX(false, userSetting, iloc);
}
- @LargeTest
- public void testUserPrefOffA() {
- int userSetting = PackageHelper.APP_INSTALL_AUTO;
- int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
- setUserX(false, userSetting, iloc);
- }
+ @LargeTest
+ public void testUserPrefOffA() throws Exception {
+ int userSetting = PackageHelper.APP_INSTALL_AUTO;
+ int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
+ setUserX(false, userSetting, iloc);
+ }
static final String BASE_PERMISSIONS_DEFINED[] = new String[] {
PERM_PACKAGE, "com.android.unit_tests.install_decl_perm",
@@ -2511,7 +2680,7 @@
* Ensure that permissions are properly declared.
*/
@LargeTest
- public void testInstallDeclaresPermissions() {
+ public void testInstallDeclaresPermissions() throws Exception {
InstallParams ip = null;
InstallParams ip2 = null;
try {
@@ -2637,7 +2806,7 @@
* Ensure that permissions are properly declared.
*/
@LargeTest
- public void testInstallOnSdPermissionsUnmount() {
+ public void testInstallOnSdPermissionsUnmount() throws Exception {
InstallParams ip = null;
boolean origMediaState = checkMediaState(Environment.MEDIA_MOUNTED);
try {
@@ -2669,7 +2838,7 @@
* naming convention for secure containers.
*/
@LargeTest
- public void testInstallSdcardStaleContainer() {
+ public void testInstallSdcardStaleContainer() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2718,7 +2887,7 @@
* and verified that the re-installation on internal storage takes precedence.
*/
@LargeTest
- public void testInstallSdcardStaleContainerReinstall() {
+ public void testInstallSdcardStaleContainerReinstall() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
return;
@@ -2748,7 +2917,7 @@
false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
mountMedia();
// Verify that the app installed is on internal storage.
- assertInstall(pkg, 0, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
+ assertInstall(pkg, 0, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
} catch (Exception e) {
failStr(e.getMessage());
} finally {
@@ -2765,18 +2934,29 @@
* different certificates.
*/
private int APP1_UNSIGNED = R.raw.install_app1_unsigned;
+
private int APP1_CERT1 = R.raw.install_app1_cert1;
+
private int APP1_CERT2 = R.raw.install_app1_cert2;
+
private int APP1_CERT1_CERT2 = R.raw.install_app1_cert1_cert2;
+
private int APP1_CERT3_CERT4 = R.raw.install_app1_cert3_cert4;
+
private int APP1_CERT3 = R.raw.install_app1_cert3;
+
private int APP2_UNSIGNED = R.raw.install_app2_unsigned;
+
private int APP2_CERT1 = R.raw.install_app2_cert1;
+
private int APP2_CERT2 = R.raw.install_app2_cert2;
+
private int APP2_CERT1_CERT2 = R.raw.install_app2_cert1_cert2;
+
private int APP2_CERT3 = R.raw.install_app2_cert3;
- private InstallParams replaceCerts(int apk1, int apk2, boolean cleanUp, boolean fail, int retCode) {
+ private InstallParams replaceCerts(int apk1, int apk2, boolean cleanUp, boolean fail,
+ int retCode) throws Exception {
int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
String apk1Name = "install1.apk";
String apk2Name = "install2.apk";
@@ -2796,12 +2976,13 @@
}
return null;
}
+
/*
* Test that an app signed with two certificates can be upgraded by the
* same app signed with two certificates.
*/
@LargeTest
- public void testReplaceMatchAllCerts() {
+ public void testReplaceMatchAllCerts() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT1_CERT2, true, false, -1);
}
@@ -2810,53 +2991,58 @@
* by an app signed with a different certificate.
*/
@LargeTest
- public void testReplaceMatchNoCerts1() {
+ public void testReplaceMatchNoCerts1() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT3, true, true,
PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
}
+
/*
* Test that an app signed with two certificates cannot be upgraded
* by an app signed with a different certificate.
*/
@LargeTest
- public void testReplaceMatchNoCerts2() {
+ public void testReplaceMatchNoCerts2() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT3_CERT4, true, true,
PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
}
+
/*
* Test that an app signed with two certificates cannot be upgraded by
* an app signed with a subset of initial certificates.
*/
@LargeTest
- public void testReplaceMatchSomeCerts1() {
+ public void testReplaceMatchSomeCerts1() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT1, true, true,
PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
}
+
/*
* Test that an app signed with two certificates cannot be upgraded by
* an app signed with the last certificate.
*/
@LargeTest
- public void testReplaceMatchSomeCerts2() {
+ public void testReplaceMatchSomeCerts2() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT2, true, true,
PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
}
+
/*
* Test that an app signed with a certificate can be upgraded by app
* signed with a superset of certificates.
*/
@LargeTest
- public void testReplaceMatchMoreCerts() {
+ public void testReplaceMatchMoreCerts() throws Exception {
replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, true, true,
PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
}
+
/*
* Test that an app signed with a certificate can be upgraded by app
* signed with a superset of certificates. Then verify that the an app
* signed with the original set of certs cannot upgrade the new one.
*/
@LargeTest
- public void testReplaceMatchMoreCertsReplaceSomeCerts() {
+ public void testReplaceMatchMoreCertsReplaceSomeCerts() throws Exception {
InstallParams ip = replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, false, true,
PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
try {
@@ -2872,45 +3058,51 @@
}
}
}
- /*
- * The following tests are related to testing the checkSignatures
- * api.
+
+ /**
+ * The following tests are related to testing the checkSignatures api.
*/
- private void checkSignatures(int apk1, int apk2, int expMatchResult) {
+ private void checkSignatures(int apk1, int apk2, int expMatchResult) throws Exception {
checkSharedSignatures(apk1, apk2, true, false, -1, expMatchResult);
}
+
@LargeTest
- public void testCheckSignaturesAllMatch() {
+ public void testCheckSignaturesAllMatch() throws Exception {
int apk1 = APP1_CERT1_CERT2;
int apk2 = APP2_CERT1_CERT2;
checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH);
}
+
@LargeTest
- public void testCheckSignaturesNoMatch() {
+ public void testCheckSignaturesNoMatch() throws Exception {
int apk1 = APP1_CERT1;
int apk2 = APP2_CERT2;
checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH);
}
+
@LargeTest
- public void testCheckSignaturesSomeMatch1() {
+ public void testCheckSignaturesSomeMatch1() throws Exception {
int apk1 = APP1_CERT1_CERT2;
int apk2 = APP2_CERT1;
checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH);
}
+
@LargeTest
- public void testCheckSignaturesSomeMatch2() {
+ public void testCheckSignaturesSomeMatch2() throws Exception {
int apk1 = APP1_CERT1_CERT2;
int apk2 = APP2_CERT2;
checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH);
}
+
@LargeTest
- public void testCheckSignaturesMoreMatch() {
+ public void testCheckSignaturesMoreMatch() throws Exception {
int apk1 = APP1_CERT1;
int apk2 = APP2_CERT1_CERT2;
checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH);
}
+
@LargeTest
- public void testCheckSignaturesUnknown() {
+ public void testCheckSignaturesUnknown() throws Exception {
int apk1 = APP1_CERT1_CERT2;
int apk2 = APP2_CERT1_CERT2;
String apk1Name = "install1.apk";
@@ -2938,8 +3130,9 @@
}
}
}
+
@LargeTest
- public void testInstallNoCertificates() {
+ public void testInstallNoCertificates() throws Exception {
int apk1 = APP1_UNSIGNED;
String apk1Name = "install1.apk";
InstallParams ip1 = null;
@@ -2951,18 +3144,29 @@
} finally {
}
}
- /* The following tests are related to apps using shared uids signed
- * with different certs.
+
+ /*
+ * The following tests are related to apps using shared uids signed with
+ * different certs.
*/
private int SHARED1_UNSIGNED = R.raw.install_shared1_unsigned;
+
private int SHARED1_CERT1 = R.raw.install_shared1_cert1;
+
private int SHARED1_CERT2 = R.raw.install_shared1_cert2;
+
private int SHARED1_CERT1_CERT2 = R.raw.install_shared1_cert1_cert2;
+
private int SHARED2_UNSIGNED = R.raw.install_shared2_unsigned;
+
private int SHARED2_CERT1 = R.raw.install_shared2_cert1;
+
private int SHARED2_CERT2 = R.raw.install_shared2_cert2;
+
private int SHARED2_CERT1_CERT2 = R.raw.install_shared2_cert1_cert2;
- private void checkSharedSignatures(int apk1, int apk2, boolean cleanUp, boolean fail, int retCode, int expMatchResult) {
+
+ private void checkSharedSignatures(int apk1, int apk2, boolean cleanUp, boolean fail,
+ int retCode, int expMatchResult) throws Exception {
String apk1Name = "install1.apk";
String apk2Name = "install2.apk";
PackageParser.Package pkg1 = getParsedPackage(apk1Name, apk1);
@@ -2972,16 +3176,16 @@
// Clean up before testing first.
cleanUpInstall(pkg1.packageName);
cleanUpInstall(pkg2.packageName);
- installFromRawResource(apk1Name, apk1, 0, false,
- false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
+ installFromRawResource(apk1Name, apk1, 0, false, false, -1,
+ PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
if (fail) {
- installFromRawResource(apk2Name, apk2, 0, false,
- true, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
+ installFromRawResource(apk2Name, apk2, 0, false, true, retCode,
+ PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
} else {
- installFromRawResource(apk2Name, apk2, 0, false,
- false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
- int match = mContext.getPackageManager().checkSignatures(
- pkg1.packageName, pkg2.packageName);
+ installFromRawResource(apk2Name, apk2, 0, false, false, -1,
+ PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
+ int match = mContext.getPackageManager().checkSignatures(pkg1.packageName,
+ pkg2.packageName);
assertEquals(expMatchResult, match);
}
} finally {
@@ -2991,8 +3195,9 @@
}
}
}
+
@LargeTest
- public void testCheckSignaturesSharedAllMatch() {
+ public void testCheckSignaturesSharedAllMatch() throws Exception {
int apk1 = SHARED1_CERT1_CERT2;
int apk2 = SHARED2_CERT1_CERT2;
boolean fail = false;
@@ -3000,8 +3205,9 @@
int expMatchResult = PackageManager.SIGNATURE_MATCH;
checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
}
+
@LargeTest
- public void testCheckSignaturesSharedNoMatch() {
+ public void testCheckSignaturesSharedNoMatch() throws Exception {
int apk1 = SHARED1_CERT1;
int apk2 = SHARED2_CERT2;
boolean fail = true;
@@ -3009,11 +3215,13 @@
int expMatchResult = -1;
checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
}
+
/*
- * Test that an app signed with cert1 and cert2 cannot be replaced when signed with cert1 alone.
+ * Test that an app signed with cert1 and cert2 cannot be replaced when
+ * signed with cert1 alone.
*/
@LargeTest
- public void testCheckSignaturesSharedSomeMatch1() {
+ public void testCheckSignaturesSharedSomeMatch1() throws Exception {
int apk1 = SHARED1_CERT1_CERT2;
int apk2 = SHARED2_CERT1;
boolean fail = true;
@@ -3021,11 +3229,13 @@
int expMatchResult = -1;
checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
}
+
/*
- * Test that an app signed with cert1 and cert2 cannot be replaced when signed with cert2 alone.
+ * Test that an app signed with cert1 and cert2 cannot be replaced when
+ * signed with cert2 alone.
*/
@LargeTest
- public void testCheckSignaturesSharedSomeMatch2() {
+ public void testCheckSignaturesSharedSomeMatch2() throws Exception {
int apk1 = SHARED1_CERT1_CERT2;
int apk2 = SHARED2_CERT2;
boolean fail = true;
@@ -3033,8 +3243,9 @@
int expMatchResult = -1;
checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
}
+
@LargeTest
- public void testCheckSignaturesSharedUnknown() {
+ public void testCheckSignaturesSharedUnknown() throws Exception {
int apk1 = SHARED1_CERT1_CERT2;
int apk2 = SHARED2_CERT1_CERT2;
String apk1Name = "install1.apk";
@@ -3060,23 +3271,25 @@
}
@LargeTest
- public void testReplaceFirstSharedMatchAllCerts() {
+ public void testReplaceFirstSharedMatchAllCerts() throws Exception {
int apk1 = SHARED1_CERT1;
int apk2 = SHARED2_CERT1;
int rapk1 = SHARED1_CERT1;
checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH);
replaceCerts(apk1, rapk1, true, false, -1);
}
+
@LargeTest
- public void testReplaceSecondSharedMatchAllCerts() {
+ public void testReplaceSecondSharedMatchAllCerts() throws Exception {
int apk1 = SHARED1_CERT1;
int apk2 = SHARED2_CERT1;
int rapk2 = SHARED2_CERT1;
checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH);
replaceCerts(apk2, rapk2, true, false, -1);
}
+
@LargeTest
- public void testReplaceFirstSharedMatchSomeCerts() {
+ public void testReplaceFirstSharedMatchSomeCerts() throws Exception {
int apk1 = SHARED1_CERT1_CERT2;
int apk2 = SHARED2_CERT1_CERT2;
int rapk1 = SHARED1_CERT1;
@@ -3086,8 +3299,9 @@
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
+
@LargeTest
- public void testReplaceSecondSharedMatchSomeCerts() {
+ public void testReplaceSecondSharedMatchSomeCerts() throws Exception {
int apk1 = SHARED1_CERT1_CERT2;
int apk2 = SHARED2_CERT1_CERT2;
int rapk2 = SHARED2_CERT1;
@@ -3097,8 +3311,9 @@
installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
+
@LargeTest
- public void testReplaceFirstSharedMatchNoCerts() {
+ public void testReplaceFirstSharedMatchNoCerts() throws Exception {
int apk1 = SHARED1_CERT1;
int apk2 = SHARED2_CERT1;
int rapk1 = SHARED1_CERT2;
@@ -3108,8 +3323,9 @@
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
+
@LargeTest
- public void testReplaceSecondSharedMatchNoCerts() {
+ public void testReplaceSecondSharedMatchNoCerts() throws Exception {
int apk1 = SHARED1_CERT1;
int apk2 = SHARED2_CERT1;
int rapk2 = SHARED2_CERT2;
@@ -3119,8 +3335,9 @@
installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
+
@LargeTest
- public void testReplaceFirstSharedMatchMoreCerts() {
+ public void testReplaceFirstSharedMatchMoreCerts() throws Exception {
int apk1 = SHARED1_CERT1;
int apk2 = SHARED2_CERT1;
int rapk1 = SHARED1_CERT1_CERT2;
@@ -3130,8 +3347,9 @@
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
+
@LargeTest
- public void testReplaceSecondSharedMatchMoreCerts() {
+ public void testReplaceSecondSharedMatchMoreCerts() throws Exception {
int apk1 = SHARED1_CERT1;
int apk2 = SHARED2_CERT1;
int rapk2 = SHARED2_CERT1_CERT2;
@@ -3152,34 +3370,34 @@
* features.
*/
@LargeTest
- public void testUsesFeatureUnknownFeature() {
+ public void testUsesFeatureUnknownFeature() throws Exception {
int retCode = PackageManager.INSTALL_SUCCEEDED;
installFromRawResource("install.apk", R.raw.install_uses_feature, 0, true, false, retCode,
PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
@LargeTest
- public void testInstallNonexistentFile() {
+ public void testInstallNonexistentFile() throws Exception {
int retCode = PackageManager.INSTALL_FAILED_INVALID_URI;
File invalidFile = new File("/nonexistent-file.apk");
invokeInstallPackageFail(Uri.fromFile(invalidFile), 0, retCode);
}
@SmallTest
- public void testGetVerifierDeviceIdentity() {
+ public void testGetVerifierDeviceIdentity() throws Exception {
PackageManager pm = getPm();
VerifierDeviceIdentity id = pm.getVerifierDeviceIdentity();
assertNotNull("Verifier device identity should not be null", id);
}
- public void testGetInstalledPackages() {
+ public void testGetInstalledPackages() throws Exception {
List<PackageInfo> packages = getPm().getInstalledPackages(0);
assertNotNull("installed packages cannot be null", packages);
assertTrue("installed packages cannot be empty", packages.size() > 0);
}
- public void testGetUnInstalledPackages() {
+ public void testGetUnInstalledPackages() throws Exception {
List<PackageInfo> packages = getPm().getInstalledPackages(
PackageManager.GET_UNINSTALLED_PACKAGES);
assertNotNull("installed packages cannot be null", packages);
@@ -3187,10 +3405,9 @@
}
/**
- * Test that getInstalledPackages returns all the data specified in
- * flags.
+ * Test that getInstalledPackages returns all the data specified in flags.
*/
- public void testGetInstalledPackagesAll() {
+ public void testGetInstalledPackagesAll() throws Exception {
int flags = PackageManager.GET_ACTIVITIES | PackageManager.GET_GIDS
| PackageManager.GET_CONFIGURATIONS | PackageManager.GET_INSTRUMENTATION
| PackageManager.GET_PERMISSIONS | PackageManager.GET_PROVIDERS
@@ -3226,7 +3443,7 @@
* Test that getInstalledPackages returns all the data specified in
* flags when the GET_UNINSTALLED_PACKAGES flag is set.
*/
- public void testGetUnInstalledPackagesAll() {
+ public void testGetUnInstalledPackagesAll() throws Exception {
int flags = PackageManager.GET_UNINSTALLED_PACKAGES
| PackageManager.GET_ACTIVITIES | PackageManager.GET_GIDS
| PackageManager.GET_CONFIGURATIONS | PackageManager.GET_INSTRUMENTATION
diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd
index b2c95b9..749e458 100644
--- a/docs/html/guide/topics/resources/providing-resources.jd
+++ b/docs/html/guide/topics/resources/providing-resources.jd
@@ -573,6 +573,10 @@
no display</li>
</ul>
<p><em>Added in API level 8, television added in API 13.</em></p>
+ <p>For information about how your app can respond when the device is inserted into or
+ removed from a dock, read <a
+ href="{@docRoot}training/monitoring-device-state/docking-monitoring.html">Determining
+and Monitoring the Docking State and Type</a>.</p>
<p>This can change during the life of your application if the user places the device in a
dock. You can enable or disable some of these modes using {@link
android.app.UiModeManager}. See <a href="runtime-changes.html">Handling Runtime Changes</a> for
diff --git a/include/androidfw/Input.h b/include/androidfw/Input.h
index 2c91fab..e88835e 100644
--- a/include/androidfw/Input.h
+++ b/include/androidfw/Input.h
@@ -49,6 +49,15 @@
};
enum {
+ /* Used when a motion event is not associated with any display.
+ * Typically used for non-pointer events. */
+ ADISPLAY_ID_NONE = -1,
+
+ /* The default display id. */
+ ADISPLAY_ID_DEFAULT = 0,
+};
+
+enum {
/*
* Indicates that an input device has switches.
* This input source flag is hidden from the API because switches are only used by the system
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 9f8b87c..f4c2675 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -299,10 +299,12 @@
mFunctors.add(f);
}
}
+ // protect against functors binding to other buffers
+ mCaches.unbindMeshBuffer();
+ mCaches.unbindIndicesBuffer();
+ mCaches.activeTexture(0);
}
- mCaches.activeTexture(0);
-
return result;
}
diff --git a/libs/hwui/Patch.cpp b/libs/hwui/Patch.cpp
index 6971d8a..abc88fa 100644
--- a/libs/hwui/Patch.cpp
+++ b/libs/hwui/Patch.cpp
@@ -266,6 +266,11 @@
const uint32_t oldQuadCount = quadCount;
quadCount++;
+ if (x1 < 0.0f) x1 = 0.0f;
+ if (x2 < 0.0f) x2 = 0.0f;
+ if (y1 < 0.0f) y1 = 0.0f;
+ if (y2 < 0.0f) y2 = 0.0f;
+
// Skip degenerate and transparent (empty) quads
if ((mColorKey >> oldQuadCount) & 0x1) {
#if DEBUG_PATCHES_EMPTY_VERTICES
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 38ea24d..2bd0960 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Soek vir GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Ligging deur GPS gestel"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Verwyder alle kennisgewings."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktiveer sluimerskerm"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Programinligting"</string>
<string name="close_universe" msgid="3736513750241754348">"Maak toe"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Kennisgewings af"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skerm is in portretoriëntasie gesluit."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 9c0b934..6b980ef 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"ለGPS በመፈለግ ላይ"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"በ GPS የተዘጋጀ ሥፍራ"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"ሁሉንም ማሳወቂያዎች አጽዳ"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">" ገፁማያ ማቆያ አንቃ"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"የመተግበሪያ መረጃ"</string>
<string name="close_universe" msgid="3736513750241754348">"ዝጋ"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"ማሳወቂያዎች ጠፍተዋል"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ማያ ገጽ በቁም ገፅ አቀማመጥ ተቆልፏል።"</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 59a1083..1d88360 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"جارٍ البحث عن GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"تم تعيين الموقع بواسطة GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"محو جميع الإشعارات."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"تنشيط شاشة التوقف"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"معلومات التطبيق"</string>
<string name="close_universe" msgid="3736513750241754348">"إغلاق"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"التنبيهات معطّلة"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"تم تأمين الشاشة في الاتجاه العمودي."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 394d237..1d1a161 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Пошук GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Месца задана праз GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Выдалiць усе апавяшчэннi."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Актывацыя экраннай застаўкі"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Інфармацыя пра прыкладанне"</string>
<string name="close_universe" msgid="3736513750241754348">"Закрыць"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Паведамленні адключаны"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Экран заблакiраваны ў партрэтнай арыентацыі."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index c24ac7f..2e62a84 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Търси се GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Местоположението е зададено от GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Изчистване на всички известия."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Активиране на скрийнсейвъра"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Информация за приложението"</string>
<string name="close_universe" msgid="3736513750241754348">"Затваряне"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Известията са изключени"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екранът е заключен във вертикална ориентация."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 3b3c0bc..a3e7117 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"S\'està cercant un GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"S\'ha establert la ubicació per GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Esborra totes les notificacions."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Activa el protector de pantalla"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informació de l\'aplicació"</string>
<string name="close_universe" msgid="3736513750241754348">"Tanca"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notificacions desactivades"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla està bloquejada en orientació vertical."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index a471e98..d6fdc9d 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Vyhledávání satelitů GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Poloha nastavena pomocí systému GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Vymazat všechna oznámení."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivovat spořič obrazovky"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informace o aplikaci"</string>
<string name="close_universe" msgid="3736513750241754348">"Zavřít"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Oznámení jsou vypnuta"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Obrazovka je uzamčena v orientaci na výšku."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 6da3992..d102f67 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Søger efter GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Placeringen er angivet ved hjælp af GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Ryd alle meddelelser."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivér pauseskærm"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Oplysninger om appen"</string>
<string name="close_universe" msgid="3736513750241754348">"Luk"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Underretninger slået fra"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skærmen er nu låst i stående retning."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 7ae9ca6..2b4815d 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS wird gesucht"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Standort durch GPS festgelegt"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Alle Benachrichtigungen löschen"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Bildschirmschoner aktivieren"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App-Details"</string>
<string name="close_universe" msgid="3736513750241754348">"Schließen"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Benachrichtigungen aus"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Bildschirm bleibt im Hochformat."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 7cd4fc2..9958cd9 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Αναζήτηση για GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Ρύθμιση τοποθεσίας με GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Εκκαθάριση όλων των ειδοποιήσεων."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Ενεργοποίηση προφύλαξης οθόνης"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Πληροφορίες εφαρμογής"</string>
<string name="close_universe" msgid="3736513750241754348">"Κλείσιμο"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Ειδοποιήσεις ανενεργές"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Η οθόνη έχει κλειδωθεί σε κατακόρυφο προσανατολισμό."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 1fb98f0..9d46c94 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Searching for GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Location set by GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Clear all notifications."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Activate screen saver"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App info"</string>
<string name="close_universe" msgid="3736513750241754348">"Close"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notifications off"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Screen is locked in portrait orientation."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 89c6a9c..ac3542f 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Buscando GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"La ubicación se estableció por GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Eliminar todas las notificaciones"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Activar el protector de pantalla"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Información de la aplicación"</string>
<string name="close_universe" msgid="3736513750241754348">"Cerrar"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notificaciones desactivadas"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla está bloqueada en modo vertical."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 42441d5..4fa2328 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Buscando GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Ubicación definida por GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Borrar todas las notificaciones"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Activar salvapantallas"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Información de la aplicación"</string>
<string name="close_universe" msgid="3736513750241754348">"Cerrar"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notificaciones desactivadas"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla está bloqueada en modo vertical."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 9df87db..39f50f6 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS-i otsimine"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS-i määratud asukoht"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Kustuta kõik teatised."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktiveeri ekraanisäästja"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Rakenduse teave"</string>
<string name="close_universe" msgid="3736513750241754348">"Sule"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Teatised väljas"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekraan on lukustatud vertikaalsuunas."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index bf9ac48..a1707e2 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"جستجو برای GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"مکان تنظیم شده توسط GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"پاک کردن تمام اعلانها"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"فعال کردن محافظ صفحهٔ نمایش"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"اطلاعات برنامه"</string>
<string name="close_universe" msgid="3736513750241754348">"بستن"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"اعلانها خاموش"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"صفحه اکنون در جهت عمودی قفل است."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index ba23073..3db8381 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Haetaan GPS-yhteyttä"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Sijainti määritetty GPS:n avulla"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Tyhjennä kaikki ilmoitukset."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Ota näytönsäästäjä käyttöön"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Sovelluksen tiedot"</string>
<string name="close_universe" msgid="3736513750241754348">"Sulje"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Ilmoitukset pois käytöstä"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ruutu on lukittu pystysuuntaan."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index b08b36a..f80027f 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Recherche de GPS..."</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Position définie par GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Supprimer toutes les notifications"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Activer l\'économiseur d\'écran"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informations sur l\'application"</string>
<string name="close_universe" msgid="3736513750241754348">"Fermer"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notifications désactivées"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"L\'écran est verrouillé en mode portrait."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index d87bc05..d9c1d77 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS को खोजा जा रहा है"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS द्वारा सेट किया गया स्थान"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"सभी सूचनाएं साफ़ करें."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"स्क्रीन सेवर सक्रिय करें"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"एप्लिकेशन जानकारी"</string>
<string name="close_universe" msgid="3736513750241754348">"बंद करें"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"सूचनाएं बंद"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"स्क्रीन पोर्ट्रेट अभिविन्यास में लॉक है."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 7b37372..bc21fdc 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Traženje GPS-a"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokaciju utvrdio GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Brisanje svih obavijesti."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivirajte čuvar zaslona"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informacije o aplikaciji"</string>
<string name="close_universe" msgid="3736513750241754348">"Zatvori"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Obavijesti isključene"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Zaslon je zaključan u portretnoj orijentaciji."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 9d9c73a..e87950d 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS keresése"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"A GPS beállította a helyet"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Minden értesítés törlése"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Képernyővédő aktiválása"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Alkalmazásinformáció"</string>
<string name="close_universe" msgid="3736513750241754348">"Bezárás"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Értesítések kikapcsolva"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"A képernyő zárolva van álló tájolásban."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 0f3e1b7..8468492 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Menelusuri GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokasi yang disetel oleh GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Menghapus semua pemberitahuan."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktifkan tirai layar"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info aplikasi"</string>
<string name="close_universe" msgid="3736513750241754348">"Tutup"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Pemberitahuan mati"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Layar dikunci dalam orientasi potret."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 93429ed..90948db7 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Ricerca del GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Posizione stabilita dal GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Cancella tutte le notifiche."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Attiva screensaver"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informazioni applicazione"</string>
<string name="close_universe" msgid="3736513750241754348">"Chiudi"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notifiche disattivate"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Lo schermo è bloccato in orientamento verticale."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 4495c2d..b4b4b27 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"מחפש GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"מיקום מוגדר על ידי GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"נקה את כל ההתראות."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"הפעלת שומר מסך"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"פרטי יישום"</string>
<string name="close_universe" msgid="3736513750241754348">"סגור"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"מצב התראות כבוי"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"המסך נעול כעת לאורך."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 2f0d6da..83128c2 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPSで検索中"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPSにより現在地が設定されました"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"通知をすべて消去。"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"スクリーンセーバーを有効にする"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"アプリ情報"</string>
<string name="close_universe" msgid="3736513750241754348">"閉じる"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"通知OFF"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"画面は縦向きにロックされています。"</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 709e14d..4f52b84 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS 검색 중"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS에서 위치 설정"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"모든 알림 지우기"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"스크린 세이버 활성화"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"앱 정보"</string>
<string name="close_universe" msgid="3736513750241754348">"닫기"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"알림 사용 안함"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"화면이 세로 방향으로 잠겨 있습니다."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 73de676..26ba75d 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Ieškoma GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS nustatyta vieta"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Išvalyti visus pranešimus."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktyvinti ekrano užsklandą"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Programos informacija"</string>
<string name="close_universe" msgid="3736513750241754348">"Uždaryti"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Pranešimai išjungti"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Užrakintas ekranas yra vertikalios orientacijos."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index ddc2dbb..7255011 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Notiek GPS meklēšana..."</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS iestatītā atrašanās vieta"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Notīrīt visus paziņojumus"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivizēt ekrānsaudzētāju"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informācija par lietotni"</string>
<string name="close_universe" msgid="3736513750241754348">"Aizvērt"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Paziņojumi ir izslēgti"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekrāns tagad ir bloķēts portreta orientācijā."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 191ee63..d9e36c7 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Mencari GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokasi ditetapkan oleh GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Padamkan semua pemberitahuan."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktifkan gambar skrin"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Maklumat apl"</string>
<string name="close_universe" msgid="3736513750241754348">"Tutup"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Pemberitahuan dimatikan"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skrin dikunci dalam orientasi potret."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 8aa5f26..4f44fc11 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Søker etter GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Posisjon angitt av GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Fjern alle varslinger."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktiver skjermbeskytter"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info om app"</string>
<string name="close_universe" msgid="3736513750241754348">"Lukk"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Varsler er deaktivert"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skjermen er låst i stående retning."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index b740dd4..97ad7cf 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Zoeken naar GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Locatie bepaald met GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Alle meldingen wissen."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Schermbeveiliging inschakelen"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App-info"</string>
<string name="close_universe" msgid="3736513750241754348">"Sluiten"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Meldingen uit"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Het scherm is nu vergrendeld in staande stand."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index e60c3b9..a82a5d7 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Wyszukiwanie sygnału GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokalizacja ustawiona według GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Usuń wszystkie powiadomienia."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Włącz wygaszacz ekranu."</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"O aplikacji"</string>
<string name="close_universe" msgid="3736513750241754348">"Zamknij"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Powiadomienia wyłączone"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran jest zablokowany w orientacji pionowej."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index b2e008c..4cc3adf 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"A procurar GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Localização definida por GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Ativar proteção de ecrã"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações da aplicação"</string>
<string name="close_universe" msgid="3736513750241754348">"Fechar"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notificações desativadas"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"O ecrã está bloqueado na orientação vertical."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 966495a..c13d707 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Buscando GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Local definido por GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Ativar proteção de tela"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações do aplicativo"</string>
<string name="close_universe" msgid="3736513750241754348">"Fechar"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notificações desativadas"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"A tela está bloqueada na orientação retrato."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml
index 141c13e..f7527cc 100644
--- a/packages/SystemUI/res/values-rm/strings.xml
+++ b/packages/SystemUI/res/values-rm/strings.xml
@@ -252,8 +252,6 @@
<skip />
<!-- no translation found for accessibility_clear_all (5235938559247164925) -->
<skip />
- <!-- no translation found for dreams_dock_launcher (3541196417659166245) -->
- <skip />
<!-- no translation found for status_bar_notification_inspect_item_title (1163547729015390250) -->
<skip />
<!-- no translation found for close_universe (3736513750241754348) -->
@@ -270,4 +268,50 @@
<skip />
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 42991cb..54f9368 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Se caută GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Locaţie setată prin GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Ştergeţi toate notificările."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Activaţi screensaverul"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informaţii despre aplicaţie"</string>
<string name="close_universe" msgid="3736513750241754348">"Închideţi"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notificările sunt dezactivate"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ecranul este blocat în orientarea de tip portret."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 78b9297..63b0b14 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Поиск GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Координаты по GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Удалить все уведомления"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Активация заставки экрана"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"О приложении"</string>
<string name="close_universe" msgid="3736513750241754348">"Закрыть"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Уведомления отключены"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Выбрана только книжная ориентация экрана."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 5fc943e..2c652dc 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Vyhľadávanie satelitov GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Poloha nastavená pomocou GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Vymazať všetky upozornenia."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivovať šetrič obrazovky"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informácie o aplikácii"</string>
<string name="close_universe" msgid="3736513750241754348">"Zavrieť"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Upozornenia sú vypnuté"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Obrazovka je uzamknutá v orientácii na výšku."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 9953428..018a12e 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Iskanje GPS-a"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokacija nastavljena z GPS-om"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Izbriši vsa obvestila."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Vklop ohranjevalnika zaslona"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Podatki o aplikaciji"</string>
<string name="close_universe" msgid="3736513750241754348">"Zapri"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Obvestila so izklopljena"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Zaslon je zaklenjen v pokončni usmerjenosti."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 83ada24..4583772 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Тражи се GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Локацију је подесио GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Обриши сва обавештења."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Активирање чувара екрана"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Информације о апликацији"</string>
<string name="close_universe" msgid="3736513750241754348">"Затвори"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Обавештења су искључена"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран је закључан у вертикалном положају."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index e87a2d9..ae7232b 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Sökning efter GPS pågår"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Platsen har identifierats av GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Ta bort alla meddelanden."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivera skärmsläckare"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info om appen"</string>
<string name="close_universe" msgid="3736513750241754348">"Stäng"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Meddelanden inaktiverade"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Bildskärmens riktning är nu låst i stående format."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 30fea17..ccd3bd3 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -139,7 +139,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Inatafuta GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Mahali pamewekwa na GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Futa arifa zote."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Amilisha hifadhi ya skrini"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Taarifa ya programu"</string>
<string name="close_universe" msgid="3736513750241754348">"Funga"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Arifa zimelemazwa"</string>
@@ -149,4 +148,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skrini imefungwa katika uelekeo wa picha."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 89c640d..df5fb1b 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"กำลังค้นหา GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"ตำแหน่งที่กำหนดโดย GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"ล้างการแจ้งเตือนทั้งหมด"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"เปิดโปรแกรมรักษาหน้าจอ"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ข้อมูลแอป"</string>
<string name="close_universe" msgid="3736513750241754348">"ปิด"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"การแจ้งเตือนปิดอยู่"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ขณะนี้หน้าจอถูกล็อกให้วางในแนวตั้ง"</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 88d3607..620b9a7 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Naghahanap ng GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Lokasyong itinatakda ng GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"I-clear ang lahat ng notification."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"I-activate ang screen saver"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Impormasyon ng app"</string>
<string name="close_universe" msgid="3736513750241754348">"Isara"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Naka-off ang mga notification"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Naka-lock ang screen sa patayong oryentasyon."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 15bc353..9e75cd5 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS aranıyor"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Konum GPS ile belirlendi"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Tüm bildirimleri temizle"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Ekran koruyucuyu etkinleştir"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Uygulama bilgileri"</string>
<string name="close_universe" msgid="3736513750241754348">"Kapat"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Bildirimler kapalı"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran dikey yönde kilitlendi."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index c731fad..8ddf6e3 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Виконується пошук GPS-сигналу"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Місцезнаходження встановлено за допомогою GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Очистити всі сповіщення."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Активувати заставку"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Інформація про програму"</string>
<string name="close_universe" msgid="3736513750241754348">"Закрити"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Сповіщення вимкнено"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран заблоковано в книжковій орієнтації."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 6a51cc1..daf0deb 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Đang tìm kiếm GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Vị trí đặt bởi GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Xóa tất cả thông báo."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Kích hoạt trình bảo vệ màn hình"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Thông tin về ứng dụng"</string>
<string name="close_universe" msgid="3736513750241754348">"Đóng"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Tắt thông báo"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Màn hình hiện bị khóa theo hướng dọc."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 6aa03a0..8c0bc08 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"正在搜索 GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"已通过 GPS 确定位置"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"清除所有通知。"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"激活屏幕保护程序"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"应用信息"</string>
<string name="close_universe" msgid="3736513750241754348">"关闭"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"通知功能已停用"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"屏幕锁定为纵向模式。"</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 053b538c..94ca19c 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -143,7 +143,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"正在搜尋 GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS 已定位"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"清除所有通知。"</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"啟用螢幕保護程式"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"應用程式資訊"</string>
<string name="close_universe" msgid="3736513750241754348">"關閉"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"關閉通知"</string>
@@ -153,4 +152,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"螢幕已鎖定為垂直模式。"</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index c10e968..94d54a4 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -141,7 +141,6 @@
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Isesha i-GPS"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"Indawo ihlelwe i-GPS"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Susa zonke izaziso."</string>
- <string name="dreams_dock_launcher" msgid="3541196417659166245">"Yenza ukuthi iskrini seyiva sisebenze"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ulwazi lohlelo lokusebenza"</string>
<string name="close_universe" msgid="3736513750241754348">"Vala"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Izaziso zivaliwe"</string>
@@ -151,4 +150,50 @@
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Isikrini sikhiyelwe ngomumo we-portrait."</string>
<!-- no translation found for jelly_bean_dream_name (5992026543636816792) -->
<skip />
+ <!-- no translation found for start_dreams (870400522982252717) -->
+ <skip />
+ <!-- no translation found for quick_settings_airplane_mode_label (5510520633448831350) -->
+ <skip />
+ <!-- no translation found for quick_settings_battery_label (2764511189368020794) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_label (6304190285170721401) -->
+ <skip />
+ <!-- no translation found for quick_settings_brightness_label (6968372297018755815) -->
+ <skip />
+ <!-- no translation found for quick_settings_ime_label (6877325300716130498) -->
+ <skip />
+ <!-- no translation found for quick_settings_location_label (3292451598267467545) -->
+ <skip />
+ <!-- no translation found for quick_settings_media_device_label (1302906836372603762) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_label (7725671335550695589) -->
+ <skip />
+ <!-- no translation found for quick_settings_rssi_emergency_only (2713774041672886750) -->
+ <skip />
+ <!-- no translation found for quick_settings_settings_label (5326556592578065401) -->
+ <skip />
+ <!-- no translation found for quick_settings_time_label (4635969182239736408) -->
+ <skip />
+ <!-- no translation found for quick_settings_user_label (5238995632130897840) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_label (4393429107095001520) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_no_network (2221993077220856376) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_label (6653501376641018614) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_display_no_connection_label (6255615315258869136) -->
+ <skip />
+ <!-- no translation found for wifi_display_scan (8453135922233546097) -->
+ <skip />
+ <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
+ <skip />
+ <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_available (980373281442607096) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
+ <skip />
+ <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 97034bb..923cd93 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -1041,8 +1041,12 @@
// swipe-dismissable)
updateNotificationVetoButton(oldEntry.row, notification);
+ // Is this for you?
+ boolean isForCurrentUser = notificationIsForCurrentUser(notification);
+ if (DEBUG) Slog.d(TAG, "notification is " + (isForCurrentUser ? "" : "not ") + "for you");
+
// Restart the ticker if it's still running
- if (updateTicker) {
+ if (updateTicker && isForCurrentUser) {
haltTicker();
tick(key, notification, false);
}
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 a5d4a8e..6231d0d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1426,6 +1426,9 @@
// no ticking in Setup
if (!isDeviceProvisioned()) return;
+ // not for you
+ if (!notificationIsForCurrentUser(n)) return;
+
// Show the ticker if one is requested. Also don't do this
// until status bar window is attached to the window manager,
// because... well, what's the point otherwise? And trying to
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
index e9dd70a..cad6d57 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -22,19 +22,17 @@
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.CursorLoader;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
import android.content.res.Resources;
import android.database.Cursor;
-import android.database.DataSetObserver;
import android.graphics.drawable.ClipDrawable;
import android.hardware.display.DisplayManager;
import android.hardware.display.WifiDisplay;
import android.hardware.display.WifiDisplayStatus;
-import android.hardware.input.KeyboardLayout;
import android.net.Uri;
+import android.os.UserHandle;
import android.provider.ContactsContract;
import android.provider.Settings;
import android.view.LayoutInflater;
@@ -44,12 +42,8 @@
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
-import android.widget.CheckedTextView;
import android.widget.ListView;
-import android.widget.RadioButton;
import android.widget.TextView;
-import android.widget.Toast;
-import android.widget.ListAdapter;
import java.util.ArrayList;
import java.util.Comparator;
@@ -154,7 +148,7 @@
// TODO: Sets the view to be "awaiting" if not already awaiting
// Change the system setting
- Settings.System.putInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
enabled ? 1 : 0);
// TODO: Update the UI to reflect system setting
@@ -163,7 +157,7 @@
// Post the intent
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", enabled);
- mContext.sendBroadcast(intent);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
}
// NetworkSignalChanged callback
@Override
@@ -411,7 +405,7 @@
@Override
public void onLoadComplete(Loader<Cursor> loader,
Cursor cursor) {
- if (cursor.moveToFirst()) {
+ if (cursor != null && cursor.moveToFirst()) {
String name = cursor.getString(0); // DISPLAY_NAME
mModel.setUserTileInfo(name);
/*
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java
index edad370..3c8276d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java
@@ -74,7 +74,7 @@
private boolean getAirplaneMode() {
ContentResolver cr = mContext.getContentResolver();
- return 0 != Settings.System.getInt(cr, Settings.System.AIRPLANE_MODE_ON, 0);
+ return 0 != Settings.Global.getInt(cr, Settings.Global.AIRPLANE_MODE_ON, 0);
}
// TODO: Fix this racy API by adding something better to TelephonyManager or
@@ -82,9 +82,9 @@
private void unsafe(final boolean enabled) {
AsyncTask.execute(new Runnable() {
public void run() {
- Settings.System.putInt(
+ Settings.Global.putInt(
mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON,
+ Settings.Global.AIRPLANE_MODE_ON,
enabled ? 1 : 0);
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 23f27e7..ea7235d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -509,8 +509,8 @@
}
private void updateAirplaneMode() {
- mAirplaneMode = (Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON, 0) == 1);
+ mAirplaneMode = (Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 0) == 1);
}
private final void updateTelephonySignalStrength() {
diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java
index 10f45a5..753b864 100644
--- a/policy/src/com/android/internal/policy/impl/GlobalActions.java
+++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java
@@ -115,7 +115,7 @@
context.getSystemService(Context.CONNECTIVITY_SERVICE);
mHasTelephony = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
mContext.getContentResolver().registerContentObserver(
- Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON), true,
+ Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true,
mAirplaneModeObserver);
Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
mHasVibrator = vibrator != null && vibrator.hasVibrator();
@@ -849,9 +849,9 @@
// Let the service state callbacks handle the state.
if (mHasTelephony) return;
- boolean airplaneModeOn = Settings.System.getInt(
+ boolean airplaneModeOn = Settings.Global.getInt(
mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON,
+ Settings.Global.AIRPLANE_MODE_ON,
0) == 1;
mAirplaneState = airplaneModeOn ? ToggleAction.State.On : ToggleAction.State.Off;
mAirplaneModeOn.updateState(mAirplaneState);
@@ -861,9 +861,9 @@
* Change the airplane mode system setting
*/
private void changeAirplaneModeSystemSetting(boolean on) {
- Settings.System.putInt(
+ Settings.Global.putInt(
mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON,
+ Settings.Global.AIRPLANE_MODE_ON,
on ? 1 : 0);
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
index 95772af..7554236 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
@@ -142,7 +142,9 @@
protected void launchCamera() {
if (mLockPatternUtils.isSecure()) {
// Launch the secure version of the camera
- launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE), true);
+ Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);
+ intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ launchActivity(intent, true);
} else {
// Launch the normal camera
launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false);
@@ -262,7 +264,7 @@
* See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED}
*/
private void launchActivity(final Intent intent, boolean showsWhileLocked) {
- intent.setFlags(
+ intent.addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
index 3ee82f7..1f0f5ef 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
@@ -41,6 +41,7 @@
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.EventLog;
@@ -161,6 +162,9 @@
/** High level access to the power manager for WakeLocks */
private PowerManager mPM;
+ /** UserManager for querying number of users */
+ private UserManager mUserManager;
+
/**
* Used to keep the device awake while the keyguard is showing, i.e for
* calls to {@link #pokeWakelock()}
@@ -436,6 +440,7 @@
public KeyguardViewMediator(Context context, LockPatternUtils lockPatternUtils) {
mContext = context;
mPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
mWakeLock = mPM.newWakeLock(
PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "keyguard");
mWakeLock.setReferenceCounted(false);
@@ -779,7 +784,8 @@
return;
}
- if (mLockPatternUtils.isLockScreenDisabled() && !lockedOrMissing) {
+ if (mUserManager.getUsers().size() < 2
+ && mLockPatternUtils.isLockScreenDisabled() && !lockedOrMissing) {
if (DEBUG) Log.d(TAG, "doKeyguard: not showing because lockscreen is off");
return;
}
diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp
index 8604f95..87a6c1b 100644
--- a/services/input/InputDispatcher.cpp
+++ b/services/input/InputDispatcher.cpp
@@ -166,6 +166,10 @@
return true;
}
+static bool isMainDisplay(int32_t displayId) {
+ return displayId == ADISPLAY_ID_DEFAULT || displayId == ADISPLAY_ID_NONE;
+}
+
static void dumpRegion(String8& dump, const SkRegion& region) {
if (region.isEmpty()) {
dump.append("<empty>");
@@ -423,11 +427,12 @@
&& (motionEntry->source & AINPUT_SOURCE_CLASS_POINTER)
&& mInputTargetWaitCause == INPUT_TARGET_WAIT_CAUSE_APPLICATION_NOT_READY
&& mInputTargetWaitApplicationHandle != NULL) {
+ int32_t displayId = motionEntry->displayId;
int32_t x = int32_t(motionEntry->pointerCoords[0].
getAxisValue(AMOTION_EVENT_AXIS_X));
int32_t y = int32_t(motionEntry->pointerCoords[0].
getAxisValue(AMOTION_EVENT_AXIS_Y));
- sp<InputWindowHandle> touchedWindowHandle = findTouchedWindowAtLocked(x, y);
+ sp<InputWindowHandle> touchedWindowHandle = findTouchedWindowAtLocked(displayId, x, y);
if (touchedWindowHandle != NULL
&& touchedWindowHandle->inputApplicationHandle
!= mInputTargetWaitApplicationHandle) {
@@ -444,28 +449,31 @@
return needWake;
}
-sp<InputWindowHandle> InputDispatcher::findTouchedWindowAtLocked(int32_t x, int32_t y) {
+sp<InputWindowHandle> InputDispatcher::findTouchedWindowAtLocked(int32_t displayId,
+ int32_t x, int32_t y) {
// Traverse windows from front to back to find touched window.
size_t numWindows = mWindowHandles.size();
for (size_t i = 0; i < numWindows; i++) {
sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
const InputWindowInfo* windowInfo = windowHandle->getInfo();
- int32_t flags = windowInfo->layoutParamsFlags;
+ if (windowInfo->displayId == displayId) {
+ int32_t flags = windowInfo->layoutParamsFlags;
- if (windowInfo->visible) {
- if (!(flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
- bool isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
- | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
- if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
- // Found window.
- return windowHandle;
+ if (windowInfo->visible) {
+ if (!(flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
+ bool isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
+ | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
+ if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
+ // Found window.
+ return windowHandle;
+ }
}
}
- }
- if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
- // Error window is on top but not visible, so touch is dropped.
- return NULL;
+ if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
+ // Error window is on top but not visible, so touch is dropped.
+ return NULL;
+ }
}
}
return NULL;
@@ -826,7 +834,10 @@
return true;
}
- addMonitoringTargetsLocked(inputTargets);
+ // TODO: support sending secondary display events to input monitors
+ if (isMainDisplay(entry->displayId)) {
+ addMonitoringTargetsLocked(inputTargets);
+ }
// Dispatch the motion.
if (conflictingPointerActions) {
@@ -1117,6 +1128,7 @@
//
bool screenWasOff = false; // original policy: policyFlags & POLICY_FLAG_BRIGHT_HERE;
+ int32_t displayId = entry->displayId;
int32_t action = entry->action;
int32_t maskedAction = action & AMOTION_EVENT_ACTION_MASK;
@@ -1126,9 +1138,10 @@
sp<InputWindowHandle> newHoverWindowHandle;
bool isSplit = mTouchState.split;
- bool switchedDevice = mTouchState.deviceId >= 0
+ bool switchedDevice = mTouchState.deviceId >= 0 && mTouchState.displayId >= 0
&& (mTouchState.deviceId != entry->deviceId
- || mTouchState.source != entry->source);
+ || mTouchState.source != entry->source
+ || mTouchState.displayId != displayId);
bool isHoverAction = (maskedAction == AMOTION_EVENT_ACTION_HOVER_MOVE
|| maskedAction == AMOTION_EVENT_ACTION_HOVER_ENTER
|| maskedAction == AMOTION_EVENT_ACTION_HOVER_EXIT);
@@ -1152,6 +1165,7 @@
mTempTouchState.down = down;
mTempTouchState.deviceId = entry->deviceId;
mTempTouchState.source = entry->source;
+ mTempTouchState.displayId = displayId;
isSplit = false;
} else {
mTempTouchState.copyFrom(mTouchState);
@@ -1174,8 +1188,11 @@
for (size_t i = 0; i < numWindows; i++) {
sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
const InputWindowInfo* windowInfo = windowHandle->getInfo();
- int32_t flags = windowInfo->layoutParamsFlags;
+ if (windowInfo->displayId != displayId) {
+ continue; // wrong display
+ }
+ int32_t flags = windowInfo->layoutParamsFlags;
if (flags & InputWindowInfo::FLAG_SYSTEM_ERROR) {
if (topErrorWindowHandle == NULL) {
topErrorWindowHandle = windowHandle;
@@ -1300,7 +1317,8 @@
sp<InputWindowHandle> oldTouchedWindowHandle =
mTempTouchState.getFirstForegroundWindowHandle();
- sp<InputWindowHandle> newTouchedWindowHandle = findTouchedWindowAtLocked(x, y);
+ sp<InputWindowHandle> newTouchedWindowHandle =
+ findTouchedWindowAtLocked(displayId, x, y);
if (oldTouchedWindowHandle != newTouchedWindowHandle
&& newTouchedWindowHandle != NULL) {
#if DEBUG_FOCUS
@@ -1438,8 +1456,10 @@
if (foregroundWindowHandle->getInfo()->hasWallpaper) {
for (size_t i = 0; i < mWindowHandles.size(); i++) {
sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
- if (windowHandle->getInfo()->layoutParamsType
- == InputWindowInfo::TYPE_WALLPAPER) {
+ const InputWindowInfo* info = windowHandle->getInfo();
+ if (info->displayId == displayId
+ && windowHandle->getInfo()->layoutParamsType
+ == InputWindowInfo::TYPE_WALLPAPER) {
mTempTouchState.addOrUpdateWindow(windowHandle,
InputTarget::FLAG_WINDOW_IS_OBSCURED
| InputTarget::FLAG_DISPATCH_AS_IS,
@@ -1495,6 +1515,7 @@
|| maskedAction == AMOTION_EVENT_ACTION_HOVER_MOVE) {
mTouchState.deviceId = entry->deviceId;
mTouchState.source = entry->source;
+ mTouchState.displayId = displayId;
}
} else if (maskedAction == AMOTION_EVENT_ACTION_UP
|| maskedAction == AMOTION_EVENT_ACTION_CANCEL) {
@@ -1610,6 +1631,7 @@
bool InputDispatcher::isWindowObscuredAtPointLocked(
const sp<InputWindowHandle>& windowHandle, int32_t x, int32_t y) const {
+ int32_t displayId = windowHandle->getInfo()->displayId;
size_t numWindows = mWindowHandles.size();
for (size_t i = 0; i < numWindows; i++) {
sp<InputWindowHandle> otherHandle = mWindowHandles.itemAt(i);
@@ -1618,7 +1640,8 @@
}
const InputWindowInfo* otherInfo = otherHandle->getInfo();
- if (otherInfo->visible && ! otherInfo->isTrustedOverlay()
+ if (otherInfo->displayId == displayId
+ && otherInfo->visible && !otherInfo->isTrustedOverlay()
&& otherInfo->frameContainsPoint(x, y)) {
return true;
}
@@ -1845,7 +1868,7 @@
}
if (dispatchEntry->resolvedAction == AMOTION_EVENT_ACTION_HOVER_MOVE
&& !connection->inputState.isHovering(
- motionEntry->deviceId, motionEntry->source)) {
+ motionEntry->deviceId, motionEntry->source, motionEntry->displayId)) {
#if DEBUG_DISPATCH_CYCLE
ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: filling in missing hover enter event",
connection->getInputChannelName());
@@ -2271,6 +2294,7 @@
originalMotionEntry->xPrecision,
originalMotionEntry->yPrecision,
originalMotionEntry->downTime,
+ originalMotionEntry->displayId,
splitPointerCount, splitPointerProperties, splitPointerCoords);
if (originalMotionEntry->injectionState) {
@@ -2351,7 +2375,7 @@
{ // acquire lock
mLock.lock();
- if (mInputFilterEnabled) {
+ if (shouldSendKeyToInputFilterLocked(args)) {
mLock.unlock();
policyFlags |= POLICY_FLAG_FILTERED;
@@ -2377,6 +2401,10 @@
}
}
+bool InputDispatcher::shouldSendKeyToInputFilterLocked(const NotifyKeyArgs* args) {
+ return mInputFilterEnabled;
+}
+
void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
#if DEBUG_INBOUND_EVENT_DETAILS
ALOGD("notifyMotion - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
@@ -2415,7 +2443,7 @@
{ // acquire lock
mLock.lock();
- if (mInputFilterEnabled) {
+ if (shouldSendMotionToInputFilterLocked(args)) {
mLock.unlock();
MotionEvent event;
@@ -2438,6 +2466,7 @@
args->deviceId, args->source, policyFlags,
args->action, args->flags, args->metaState, args->buttonState,
args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime,
+ args->displayId,
args->pointerCount, args->pointerProperties, args->pointerCoords);
needWake = enqueueInboundEventLocked(newEntry);
@@ -2449,6 +2478,11 @@
}
}
+bool InputDispatcher::shouldSendMotionToInputFilterLocked(const NotifyMotionArgs* args) {
+ // TODO: support sending secondary display events to input filter
+ return mInputFilterEnabled && isMainDisplay(args->displayId);
+}
+
void InputDispatcher::notifySwitch(const NotifySwitchArgs* args) {
#if DEBUG_INBOUND_EVENT_DETAILS
ALOGD("notifySwitch - eventTime=%lld, policyFlags=0x%x, switchCode=%d, switchValue=%d",
@@ -2532,6 +2566,7 @@
case AINPUT_EVENT_TYPE_MOTION: {
const MotionEvent* motionEvent = static_cast<const MotionEvent*>(event);
+ int32_t displayId = ADISPLAY_ID_DEFAULT;
int32_t action = motionEvent->getAction();
size_t pointerCount = motionEvent->getPointerCount();
const PointerProperties* pointerProperties = motionEvent->getPointerProperties();
@@ -2553,8 +2588,8 @@
motionEvent->getMetaState(), motionEvent->getButtonState(),
motionEvent->getEdgeFlags(),
motionEvent->getXPrecision(), motionEvent->getYPrecision(),
- motionEvent->getDownTime(), uint32_t(pointerCount),
- pointerProperties, samplePointerCoords);
+ motionEvent->getDownTime(), displayId,
+ uint32_t(pointerCount), pointerProperties, samplePointerCoords);
lastInjectedEntry = firstInjectedEntry;
for (size_t i = motionEvent->getHistorySize(); i > 0; i--) {
sampleEventTimes += 1;
@@ -2565,8 +2600,8 @@
motionEvent->getMetaState(), motionEvent->getButtonState(),
motionEvent->getEdgeFlags(),
motionEvent->getXPrecision(), motionEvent->getYPrecision(),
- motionEvent->getDownTime(), uint32_t(pointerCount),
- pointerProperties, samplePointerCoords);
+ motionEvent->getDownTime(), displayId,
+ uint32_t(pointerCount), pointerProperties, samplePointerCoords);
lastInjectedEntry->next = nextInjectedEntry;
lastInjectedEntry = nextInjectedEntry;
}
@@ -2939,6 +2974,12 @@
#endif
return true;
}
+ if (fromWindowHandle->getInfo()->displayId != toWindowHandle->getInfo()->displayId) {
+#if DEBUG_FOCUS
+ ALOGD("Cannot transfer focus because windows are on different displays.");
+#endif
+ return false;
+ }
bool found = false;
for (size_t i = 0; i < mTouchState.windows.size(); i++) {
@@ -3040,6 +3081,7 @@
dump.appendFormat(INDENT "TouchSplit: %s\n", toString(mTouchState.split));
dump.appendFormat(INDENT "TouchDeviceId: %d\n", mTouchState.deviceId);
dump.appendFormat(INDENT "TouchSource: 0x%08x\n", mTouchState.source);
+ dump.appendFormat(INDENT "TouchDisplayId: %d\n", mTouchState.displayId);
if (!mTouchState.windows.isEmpty()) {
dump.append(INDENT "TouchedWindows:\n");
for (size_t i = 0; i < mTouchState.windows.size(); i++) {
@@ -3059,11 +3101,12 @@
const sp<InputWindowHandle>& windowHandle = mWindowHandles.itemAt(i);
const InputWindowInfo* windowInfo = windowHandle->getInfo();
- dump.appendFormat(INDENT2 "%d: name='%s', paused=%s, hasFocus=%s, hasWallpaper=%s, "
+ dump.appendFormat(INDENT2 "%d: name='%s', displayId=%d, "
+ "paused=%s, hasFocus=%s, hasWallpaper=%s, "
"visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, "
"frame=[%d,%d][%d,%d], scale=%f, "
"touchableRegion=",
- i, windowInfo->name.string(),
+ i, windowInfo->name.string(), windowInfo->displayId,
toString(windowInfo->paused),
toString(windowInfo->hasFocus),
toString(windowInfo->hasWallpaper),
@@ -3802,14 +3845,14 @@
int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action, int32_t flags,
int32_t metaState, int32_t buttonState,
int32_t edgeFlags, float xPrecision, float yPrecision,
- nsecs_t downTime, uint32_t pointerCount,
+ nsecs_t downTime, int32_t displayId, uint32_t pointerCount,
const PointerProperties* pointerProperties, const PointerCoords* pointerCoords) :
EventEntry(TYPE_MOTION, eventTime, policyFlags),
eventTime(eventTime),
deviceId(deviceId), source(source), action(action), flags(flags),
metaState(metaState), buttonState(buttonState), edgeFlags(edgeFlags),
xPrecision(xPrecision), yPrecision(yPrecision),
- downTime(downTime), pointerCount(pointerCount) {
+ downTime(downTime), displayId(displayId), pointerCount(pointerCount) {
for (uint32_t i = 0; i < pointerCount; i++) {
this->pointerProperties[i].copyFrom(pointerProperties[i]);
this->pointerCoords[i].copyFrom(pointerCoords[i]);
@@ -3820,8 +3863,8 @@
}
void InputDispatcher::MotionEntry::appendDescription(String8& msg) const {
- msg.appendFormat("MotionEvent(action=%d, deviceId=%d, source=0x%08x)",
- action, deviceId, source);
+ msg.appendFormat("MotionEvent(action=%d, deviceId=%d, source=0x%08x, displayId=%d)",
+ action, deviceId, source, displayId);
}
@@ -3864,11 +3907,13 @@
return mKeyMementos.isEmpty() && mMotionMementos.isEmpty();
}
-bool InputDispatcher::InputState::isHovering(int32_t deviceId, uint32_t source) const {
+bool InputDispatcher::InputState::isHovering(int32_t deviceId, uint32_t source,
+ int32_t displayId) const {
for (size_t i = 0; i < mMotionMementos.size(); i++) {
const MotionMemento& memento = mMotionMementos.itemAt(i);
if (memento.deviceId == deviceId
&& memento.source == source
+ && memento.displayId == displayId
&& memento.hovering) {
return true;
}
@@ -4025,6 +4070,7 @@
const MotionMemento& memento = mMotionMementos.itemAt(i);
if (memento.deviceId == entry->deviceId
&& memento.source == entry->source
+ && memento.displayId == entry->displayId
&& memento.hovering == hovering) {
return i;
}
@@ -4055,6 +4101,7 @@
memento.xPrecision = entry->xPrecision;
memento.yPrecision = entry->yPrecision;
memento.downTime = entry->downTime;
+ memento.displayId = entry->displayId;
memento.setPointers(entry);
memento.hovering = hovering;
memento.policyFlags = entry->policyFlags;
@@ -4090,6 +4137,7 @@
: AMOTION_EVENT_ACTION_CANCEL,
memento.flags, 0, 0, 0,
memento.xPrecision, memento.yPrecision, memento.downTime,
+ memento.displayId,
memento.pointerCount, memento.pointerProperties, memento.pointerCoords));
}
}
@@ -4108,7 +4156,8 @@
for (size_t j = 0; j < other.mMotionMementos.size(); ) {
const MotionMemento& otherMemento = other.mMotionMementos.itemAt(j);
if (memento.deviceId == otherMemento.deviceId
- && memento.source == otherMemento.source) {
+ && memento.source == otherMemento.source
+ && memento.displayId == otherMemento.displayId) {
other.mMotionMementos.removeAt(j);
} else {
j += 1;
@@ -4240,7 +4289,7 @@
// --- InputDispatcher::TouchState ---
InputDispatcher::TouchState::TouchState() :
- down(false), split(false), deviceId(-1), source(0) {
+ down(false), split(false), deviceId(-1), source(0), displayId(-1) {
}
InputDispatcher::TouchState::~TouchState() {
@@ -4251,6 +4300,7 @@
split = false;
deviceId = -1;
source = 0;
+ displayId = -1;
windows.clear();
}
@@ -4259,6 +4309,7 @@
split = other.split;
deviceId = other.deviceId;
source = other.source;
+ displayId = other.displayId;
windows = other.windows;
}
diff --git a/services/input/InputDispatcher.h b/services/input/InputDispatcher.h
index d0824fc..af7ff5e 100644
--- a/services/input/InputDispatcher.h
+++ b/services/input/InputDispatcher.h
@@ -511,15 +511,17 @@
float xPrecision;
float yPrecision;
nsecs_t downTime;
+ int32_t displayId;
uint32_t pointerCount;
PointerProperties pointerProperties[MAX_POINTERS];
PointerCoords pointerCoords[MAX_POINTERS];
MotionEntry(nsecs_t eventTime,
- int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action,
- int32_t flags, int32_t metaState, int32_t buttonState, int32_t edgeFlags,
+ int32_t deviceId, uint32_t source, uint32_t policyFlags,
+ int32_t action, int32_t flags,
+ int32_t metaState, int32_t buttonState, int32_t edgeFlags,
float xPrecision, float yPrecision,
- nsecs_t downTime, uint32_t pointerCount,
+ nsecs_t downTime, int32_t displayId, uint32_t pointerCount,
const PointerProperties* pointerProperties, const PointerCoords* pointerCoords);
virtual void appendDescription(String8& msg) const;
@@ -696,7 +698,7 @@
// Returns true if the specified source is known to have received a hover enter
// motion event.
- bool isHovering(int32_t deviceId, uint32_t source) const;
+ bool isHovering(int32_t deviceId, uint32_t source, int32_t displayId) const;
// Records tracking information for a key event that has just been published.
// Returns true if the event should be delivered, false if it is inconsistent
@@ -752,6 +754,7 @@
float xPrecision;
float yPrecision;
nsecs_t downTime;
+ int32_t displayId;
uint32_t pointerCount;
PointerProperties pointerProperties[MAX_POINTERS];
PointerCoords pointerCoords[MAX_POINTERS];
@@ -867,7 +870,7 @@
// to transfer focus to a new application.
EventEntry* mNextUnblockedEvent;
- sp<InputWindowHandle> findTouchedWindowAtLocked(int32_t x, int32_t y);
+ sp<InputWindowHandle> findTouchedWindowAtLocked(int32_t displayId, int32_t x, int32_t y);
// All registered connections mapped by channel file descriptor.
KeyedVector<int, sp<Connection> > mConnectionsByFd;
@@ -899,6 +902,10 @@
bool runCommandsLockedInterruptible();
CommandEntry* postCommandLocked(Command command);
+ // Input filter processing.
+ bool shouldSendKeyToInputFilterLocked(const NotifyKeyArgs* args);
+ bool shouldSendMotionToInputFilterLocked(const NotifyMotionArgs* args);
+
// Inbound event processing.
void drainInboundQueueLocked();
void releasePendingEventLocked();
@@ -928,6 +935,7 @@
bool split;
int32_t deviceId; // id of the device that is currently down, others are rejected
uint32_t source; // source of the device that is current down, others are rejected
+ int32_t displayId; // id to the display that currently has a touch, others are rejected
Vector<TouchedWindow> windows;
TouchState();
diff --git a/services/input/InputListener.cpp b/services/input/InputListener.cpp
index 657a6b9..c2705b0 100644
--- a/services/input/InputListener.cpp
+++ b/services/input/InputListener.cpp
@@ -69,12 +69,12 @@
NotifyMotionArgs::NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source,
uint32_t policyFlags,
int32_t action, int32_t flags, int32_t metaState, int32_t buttonState,
- int32_t edgeFlags, uint32_t pointerCount,
+ int32_t edgeFlags, int32_t displayId, uint32_t pointerCount,
const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
float xPrecision, float yPrecision, nsecs_t downTime) :
eventTime(eventTime), deviceId(deviceId), source(source), policyFlags(policyFlags),
action(action), flags(flags), metaState(metaState), buttonState(buttonState),
- edgeFlags(edgeFlags), pointerCount(pointerCount),
+ edgeFlags(edgeFlags), displayId(displayId), pointerCount(pointerCount),
xPrecision(xPrecision), yPrecision(yPrecision), downTime(downTime) {
for (uint32_t i = 0; i < pointerCount; i++) {
this->pointerProperties[i].copyFrom(pointerProperties[i]);
@@ -87,7 +87,8 @@
policyFlags(other.policyFlags),
action(other.action), flags(other.flags),
metaState(other.metaState), buttonState(other.buttonState),
- edgeFlags(other.edgeFlags), pointerCount(other.pointerCount),
+ edgeFlags(other.edgeFlags), displayId(other.displayId),
+ pointerCount(other.pointerCount),
xPrecision(other.xPrecision), yPrecision(other.yPrecision), downTime(other.downTime) {
for (uint32_t i = 0; i < pointerCount; i++) {
pointerProperties[i].copyFrom(other.pointerProperties[i]);
diff --git a/services/input/InputListener.h b/services/input/InputListener.h
index b1dc0b8..486852b 100644
--- a/services/input/InputListener.h
+++ b/services/input/InputListener.h
@@ -88,6 +88,7 @@
int32_t metaState;
int32_t buttonState;
int32_t edgeFlags;
+ int32_t displayId;
uint32_t pointerCount;
PointerProperties pointerProperties[MAX_POINTERS];
PointerCoords pointerCoords[MAX_POINTERS];
@@ -99,7 +100,7 @@
NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source, uint32_t policyFlags,
int32_t action, int32_t flags, int32_t metaState, int32_t buttonState,
- int32_t edgeFlags, uint32_t pointerCount,
+ int32_t edgeFlags, int32_t displayId, uint32_t pointerCount,
const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
float xPrecision, float yPrecision, nsecs_t downTime);
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp
index 513dc13..d56b9a9 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -2431,6 +2431,7 @@
mPointerVelocityControl.move(when, &deltaX, &deltaY);
+ int32_t displayId;
if (mPointerController != NULL) {
if (moved || scrolled || buttonsChanged) {
mPointerController->setPresentation(
@@ -2451,9 +2452,11 @@
mPointerController->getPosition(&x, &y);
pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, x);
pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y);
+ displayId = ADISPLAY_ID_DEFAULT;
} else {
pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX);
pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY);
+ displayId = ADISPLAY_ID_NONE;
}
pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, down ? 1.0f : 0.0f);
@@ -2485,7 +2488,8 @@
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
motionEventAction, 0, metaState, currentButtonState, 0,
- 1, &pointerProperties, &pointerCoords, mXPrecision, mYPrecision, downTime);
+ displayId, 1, &pointerProperties, &pointerCoords,
+ mXPrecision, mYPrecision, downTime);
getListener()->notifyMotion(&args);
// Send hover move after UP to tell the application that the mouse is hovering now.
@@ -2494,7 +2498,8 @@
NotifyMotionArgs hoverArgs(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_MOVE, 0,
metaState, currentButtonState, AMOTION_EVENT_EDGE_FLAG_NONE,
- 1, &pointerProperties, &pointerCoords, mXPrecision, mYPrecision, downTime);
+ displayId, 1, &pointerProperties, &pointerCoords,
+ mXPrecision, mYPrecision, downTime);
getListener()->notifyMotion(&hoverArgs);
}
@@ -2506,7 +2511,8 @@
NotifyMotionArgs scrollArgs(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_SCROLL, 0, metaState, currentButtonState,
AMOTION_EVENT_EDGE_FLAG_NONE,
- 1, &pointerProperties, &pointerCoords, mXPrecision, mYPrecision, downTime);
+ displayId, 1, &pointerProperties, &pointerCoords,
+ mXPrecision, mYPrecision, downTime);
getListener()->notifyMotion(&scrollArgs);
}
}
@@ -2539,7 +2545,8 @@
TouchInputMapper::TouchInputMapper(InputDevice* device) :
InputMapper(device),
mSource(0), mDeviceMode(DEVICE_MODE_DISABLED),
- mSurfaceOrientation(-1), mSurfaceWidth(-1), mSurfaceHeight(-1) {
+ mSurfaceWidth(-1), mSurfaceHeight(-1), mSurfaceLeft(0), mSurfaceTop(0),
+ mSurfaceOrientation(DISPLAY_ORIENTATION_0) {
}
TouchInputMapper::~TouchInputMapper() {
@@ -2601,6 +2608,8 @@
dumpSurface(dump);
dump.appendFormat(INDENT3 "Translation and Scaling Factors:\n");
+ dump.appendFormat(INDENT4 "XTranslate: %0.3f\n", mXTranslate);
+ dump.appendFormat(INDENT4 "YTranslate: %0.3f\n", mYTranslate);
dump.appendFormat(INDENT4 "XScale: %0.3f\n", mXScale);
dump.appendFormat(INDENT4 "YScale: %0.3f\n", mYScale);
dump.appendFormat(INDENT4 "XPrecision: %0.3f\n", mXPrecision);
@@ -2810,7 +2819,7 @@
ALOG_ASSERT(false);
}
- dump.appendFormat(INDENT4 "AssociatedDisplay: present=%s, isExternal=%s\n",
+ dump.appendFormat(INDENT4 "AssociatedDisplay: hasAssociatedDisplay=%s, isExternal=%s\n",
toString(mParameters.hasAssociatedDisplay),
toString(mParameters.associatedDisplayIsExternal));
dump.appendFormat(INDENT4 "OrientationAware: %s\n",
@@ -2869,10 +2878,15 @@
return;
}
+ // Raw width and height in the natural orientation.
+ int32_t rawWidth = mRawPointerAxes.x.maxValue - mRawPointerAxes.x.minValue + 1;
+ int32_t rawHeight = mRawPointerAxes.y.maxValue - mRawPointerAxes.y.minValue + 1;
+
// Get associated display dimensions.
+ bool viewportChanged = false;
+ DisplayViewport newViewport;
if (mParameters.hasAssociatedDisplay) {
- if (!mConfig.getDisplayInfo(mParameters.associatedDisplayIsExternal,
- &mAssociatedDisplayViewport)) {
+ if (!mConfig.getDisplayInfo(mParameters.associatedDisplayIsExternal, &newViewport)) {
ALOGI(INDENT "Touch device '%s' could not query the properties of its associated "
"display. The device will be inoperable until the display size "
"becomes available.",
@@ -2880,25 +2894,77 @@
mDeviceMode = DEVICE_MODE_DISABLED;
return;
}
- }
-
- // Configure dimensions.
- int32_t width, height, orientation;
- if (mDeviceMode == DEVICE_MODE_DIRECT || mDeviceMode == DEVICE_MODE_POINTER) {
- width = mAssociatedDisplayViewport.logicalRight - mAssociatedDisplayViewport.logicalLeft;
- height = mAssociatedDisplayViewport.logicalBottom - mAssociatedDisplayViewport.logicalTop;
- if (mAssociatedDisplayViewport.orientation == DISPLAY_ORIENTATION_90
- || mAssociatedDisplayViewport.orientation == DISPLAY_ORIENTATION_270) {
- int32_t temp = height;
- height = width;
- width = temp;
- }
- orientation = mParameters.orientationAware ?
- mAssociatedDisplayViewport.orientation : DISPLAY_ORIENTATION_0;
} else {
- width = mRawPointerAxes.x.maxValue - mRawPointerAxes.x.minValue + 1;
- height = mRawPointerAxes.y.maxValue - mRawPointerAxes.y.minValue + 1;
- orientation = DISPLAY_ORIENTATION_0;
+ newViewport.setNonDisplayViewport(rawWidth, rawHeight);
+ }
+ if (mViewport != newViewport) {
+ mViewport = newViewport;
+ viewportChanged = true;
+
+ if (mDeviceMode == DEVICE_MODE_DIRECT || mDeviceMode == DEVICE_MODE_POINTER) {
+ // Convert rotated viewport to natural surface coordinates.
+ int32_t naturalLogicalWidth, naturalLogicalHeight;
+ int32_t naturalPhysicalWidth, naturalPhysicalHeight;
+ int32_t naturalPhysicalLeft, naturalPhysicalTop;
+ int32_t naturalDeviceWidth, naturalDeviceHeight;
+ switch (mViewport.orientation) {
+ case DISPLAY_ORIENTATION_90:
+ naturalLogicalWidth = mViewport.logicalBottom - mViewport.logicalTop;
+ naturalLogicalHeight = mViewport.logicalRight - mViewport.logicalLeft;
+ naturalPhysicalWidth = mViewport.physicalBottom - mViewport.physicalTop;
+ naturalPhysicalHeight = mViewport.physicalRight - mViewport.physicalLeft;
+ naturalPhysicalLeft = mViewport.deviceHeight - mViewport.physicalBottom;
+ naturalPhysicalTop = mViewport.physicalLeft;
+ naturalDeviceWidth = mViewport.deviceHeight;
+ naturalDeviceHeight = mViewport.deviceWidth;
+ break;
+ case DISPLAY_ORIENTATION_180:
+ naturalLogicalWidth = mViewport.logicalRight - mViewport.logicalLeft;
+ naturalLogicalHeight = mViewport.logicalBottom - mViewport.logicalTop;
+ naturalPhysicalWidth = mViewport.physicalRight - mViewport.physicalLeft;
+ naturalPhysicalHeight = mViewport.physicalBottom - mViewport.physicalTop;
+ naturalPhysicalLeft = mViewport.deviceWidth - mViewport.physicalRight;
+ naturalPhysicalTop = mViewport.deviceHeight - mViewport.physicalBottom;
+ naturalDeviceWidth = mViewport.deviceWidth;
+ naturalDeviceHeight = mViewport.deviceHeight;
+ break;
+ case DISPLAY_ORIENTATION_270:
+ naturalLogicalWidth = mViewport.logicalBottom - mViewport.logicalTop;
+ naturalLogicalHeight = mViewport.logicalRight - mViewport.logicalLeft;
+ naturalPhysicalWidth = mViewport.physicalBottom - mViewport.physicalTop;
+ naturalPhysicalHeight = mViewport.physicalRight - mViewport.physicalLeft;
+ naturalPhysicalLeft = mViewport.physicalTop;
+ naturalPhysicalTop = mViewport.deviceWidth - mViewport.physicalRight;
+ naturalDeviceWidth = mViewport.deviceHeight;
+ naturalDeviceHeight = mViewport.deviceWidth;
+ break;
+ case DISPLAY_ORIENTATION_0:
+ default:
+ naturalLogicalWidth = mViewport.logicalRight - mViewport.logicalLeft;
+ naturalLogicalHeight = mViewport.logicalBottom - mViewport.logicalTop;
+ naturalPhysicalWidth = mViewport.physicalRight - mViewport.physicalLeft;
+ naturalPhysicalHeight = mViewport.physicalBottom - mViewport.physicalTop;
+ naturalPhysicalLeft = mViewport.physicalLeft;
+ naturalPhysicalTop = mViewport.physicalTop;
+ naturalDeviceWidth = mViewport.deviceWidth;
+ naturalDeviceHeight = mViewport.deviceHeight;
+ break;
+ }
+
+ mSurfaceWidth = naturalLogicalWidth * naturalDeviceWidth / naturalPhysicalWidth;
+ mSurfaceHeight = naturalLogicalHeight * naturalDeviceHeight / naturalPhysicalHeight;
+ mSurfaceLeft = naturalPhysicalLeft * naturalLogicalWidth / naturalPhysicalWidth;
+ mSurfaceTop = naturalPhysicalTop * naturalLogicalHeight / naturalPhysicalHeight;
+
+ mSurfaceOrientation = mParameters.orientationAware ?
+ mViewport.orientation : DISPLAY_ORIENTATION_0;
+ } else {
+ mSurfaceWidth = rawWidth;
+ mSurfaceHeight = rawHeight;
+ mSurfaceLeft = 0;
+ mSurfaceTop = 0;
+ mSurfaceOrientation = DISPLAY_ORIENTATION_0;
+ }
}
// If moving between pointer modes, need to reset some state.
@@ -2918,22 +2984,17 @@
mPointerController.clear();
}
- bool orientationChanged = mSurfaceOrientation != orientation;
- if (orientationChanged) {
- mSurfaceOrientation = orientation;
- }
-
- bool sizeChanged = mSurfaceWidth != width || mSurfaceHeight != height;
- if (sizeChanged || deviceModeChanged) {
- ALOGI("Device reconfigured: id=%d, name='%s', surface size is now %dx%d, mode is %d",
- getDeviceId(), getDeviceName().string(), width, height, mDeviceMode);
-
- mSurfaceWidth = width;
- mSurfaceHeight = height;
+ if (viewportChanged || deviceModeChanged) {
+ ALOGI("Device reconfigured: id=%d, name='%s', size %dx%d, orientation %d, mode %d, "
+ "display id %d",
+ getDeviceId(), getDeviceName().string(), mSurfaceWidth, mSurfaceHeight,
+ mSurfaceOrientation, mDeviceMode, mViewport.displayId);
// Configure X and Y factors.
- mXScale = float(width) / (mRawPointerAxes.x.maxValue - mRawPointerAxes.x.minValue + 1);
- mYScale = float(height) / (mRawPointerAxes.y.maxValue - mRawPointerAxes.y.minValue + 1);
+ mXScale = float(mSurfaceWidth) / rawWidth;
+ mYScale = float(mSurfaceHeight) / rawHeight;
+ mXTranslate = -mSurfaceLeft;
+ mYTranslate = -mSurfaceTop;
mXPrecision = 1.0f / mXScale;
mYPrecision = 1.0f / mYScale;
@@ -2950,7 +3011,7 @@
mGeometricScale = avg(mXScale, mYScale);
// Size of diagonal axis.
- float diagonalSize = hypotf(width, height);
+ float diagonalSize = hypotf(mSurfaceWidth, mSurfaceHeight);
// Size factors.
if (mCalibration.sizeCalibration != Calibration::SIZE_CALIBRATION_NONE) {
@@ -3102,50 +3163,38 @@
mOrientedRanges.distance.fuzz =
mRawPointerAxes.distance.fuzz * mDistanceScale;
}
- }
- if (orientationChanged || sizeChanged || deviceModeChanged) {
- // Compute oriented surface dimensions, precision, scales and ranges.
+ // Compute oriented precision, scales and ranges.
// Note that the maximum value reported is an inclusive maximum value so it is one
// unit less than the total width or height of surface.
switch (mSurfaceOrientation) {
case DISPLAY_ORIENTATION_90:
case DISPLAY_ORIENTATION_270:
- mOrientedSurfaceWidth = mSurfaceHeight;
- mOrientedSurfaceHeight = mSurfaceWidth;
-
mOrientedXPrecision = mYPrecision;
mOrientedYPrecision = mXPrecision;
- mOrientedRanges.x.min = 0;
- mOrientedRanges.x.max = (mRawPointerAxes.y.maxValue - mRawPointerAxes.y.minValue)
- * mYScale;
+ mOrientedRanges.x.min = mYTranslate;
+ mOrientedRanges.x.max = mSurfaceHeight + mYTranslate - 1;
mOrientedRanges.x.flat = 0;
mOrientedRanges.x.fuzz = mYScale;
- mOrientedRanges.y.min = 0;
- mOrientedRanges.y.max = (mRawPointerAxes.x.maxValue - mRawPointerAxes.x.minValue)
- * mXScale;
+ mOrientedRanges.y.min = mXTranslate;
+ mOrientedRanges.y.max = mSurfaceWidth + mXTranslate - 1;
mOrientedRanges.y.flat = 0;
mOrientedRanges.y.fuzz = mXScale;
break;
default:
- mOrientedSurfaceWidth = mSurfaceWidth;
- mOrientedSurfaceHeight = mSurfaceHeight;
-
mOrientedXPrecision = mXPrecision;
mOrientedYPrecision = mYPrecision;
- mOrientedRanges.x.min = 0;
- mOrientedRanges.x.max = (mRawPointerAxes.x.maxValue - mRawPointerAxes.x.minValue)
- * mXScale;
+ mOrientedRanges.x.min = mXTranslate;
+ mOrientedRanges.x.max = mSurfaceWidth + mXTranslate - 1;
mOrientedRanges.x.flat = 0;
mOrientedRanges.x.fuzz = mXScale;
- mOrientedRanges.y.min = 0;
- mOrientedRanges.y.max = (mRawPointerAxes.y.maxValue - mRawPointerAxes.y.minValue)
- * mYScale;
+ mOrientedRanges.y.min = mYTranslate;
+ mOrientedRanges.y.max = mSurfaceHeight + mYTranslate - 1;
mOrientedRanges.y.flat = 0;
mOrientedRanges.y.fuzz = mYScale;
break;
@@ -3153,10 +3202,8 @@
// Compute pointer gesture detection parameters.
if (mDeviceMode == DEVICE_MODE_POINTER) {
- int32_t rawWidth = mRawPointerAxes.x.maxValue - mRawPointerAxes.x.minValue + 1;
- int32_t rawHeight = mRawPointerAxes.y.maxValue - mRawPointerAxes.y.minValue + 1;
float rawDiagonal = hypotf(rawWidth, rawHeight);
- float displayDiagonal = hypotf(width, height);
+ float displayDiagonal = hypotf(mSurfaceWidth, mSurfaceHeight);
// Scale movements such that one whole swipe of the touch pad covers a
// given area relative to the diagonal size of the display when no acceleration
@@ -3191,8 +3238,21 @@
}
void TouchInputMapper::dumpSurface(String8& dump) {
+ dump.appendFormat(INDENT3 "Viewport: displayId=%d, orientation=%d, "
+ "logicalFrame=[%d, %d, %d, %d], "
+ "physicalFrame=[%d, %d, %d, %d], "
+ "deviceSize=[%d, %d]\n",
+ mViewport.displayId, mViewport.orientation,
+ mViewport.logicalLeft, mViewport.logicalTop,
+ mViewport.logicalRight, mViewport.logicalBottom,
+ mViewport.physicalLeft, mViewport.physicalTop,
+ mViewport.physicalRight, mViewport.physicalBottom,
+ mViewport.deviceWidth, mViewport.deviceHeight);
+
dump.appendFormat(INDENT3 "SurfaceWidth: %dpx\n", mSurfaceWidth);
dump.appendFormat(INDENT3 "SurfaceHeight: %dpx\n", mSurfaceHeight);
+ dump.appendFormat(INDENT3 "SurfaceLeft: %d\n", mSurfaceLeft);
+ dump.appendFormat(INDENT3 "SurfaceTop: %d\n", mSurfaceTop);
dump.appendFormat(INDENT3 "SurfaceOrientation: %d\n", mSurfaceOrientation);
}
@@ -4087,28 +4147,28 @@
float x, y;
switch (mSurfaceOrientation) {
case DISPLAY_ORIENTATION_90:
- x = float(in.y - mRawPointerAxes.y.minValue) * mYScale;
- y = float(mRawPointerAxes.x.maxValue - in.x) * mXScale;
+ x = float(in.y - mRawPointerAxes.y.minValue) * mYScale + mYTranslate;
+ y = float(mRawPointerAxes.x.maxValue - in.x) * mXScale + mXTranslate;
orientation -= M_PI_2;
if (orientation < - M_PI_2) {
orientation += M_PI;
}
break;
case DISPLAY_ORIENTATION_180:
- x = float(mRawPointerAxes.x.maxValue - in.x) * mXScale;
- y = float(mRawPointerAxes.y.maxValue - in.y) * mYScale;
+ x = float(mRawPointerAxes.x.maxValue - in.x) * mXScale + mXTranslate;
+ y = float(mRawPointerAxes.y.maxValue - in.y) * mYScale + mYTranslate;
break;
case DISPLAY_ORIENTATION_270:
- x = float(mRawPointerAxes.y.maxValue - in.y) * mYScale;
- y = float(in.x - mRawPointerAxes.x.minValue) * mXScale;
+ x = float(mRawPointerAxes.y.maxValue - in.y) * mYScale + mYTranslate;
+ y = float(in.x - mRawPointerAxes.x.minValue) * mXScale + mXTranslate;
orientation += M_PI_2;
if (orientation > M_PI_2) {
orientation -= M_PI;
}
break;
default:
- x = float(in.x - mRawPointerAxes.x.minValue) * mXScale;
- y = float(in.y - mRawPointerAxes.y.minValue) * mYScale;
+ x = float(in.x - mRawPointerAxes.x.minValue) * mXScale + mXTranslate;
+ y = float(in.y - mRawPointerAxes.y.minValue) * mYScale + mYTranslate;
break;
}
@@ -4364,7 +4424,8 @@
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_MOVE, 0,
metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
- 1, &pointerProperties, &pointerCoords, 0, 0, mPointerGesture.downTime);
+ mViewport.displayId, 1, &pointerProperties, &pointerCoords,
+ 0, 0, mPointerGesture.downTime);
getListener()->notifyMotion(&args);
}
@@ -5272,6 +5333,7 @@
// Send up.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_UP, 0, metaState, mLastButtonState, 0,
+ mViewport.displayId,
1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords,
mOrientedXPrecision, mOrientedYPrecision,
mPointerSimple.downTime);
@@ -5284,6 +5346,7 @@
// Send hover exit.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_EXIT, 0, metaState, mLastButtonState, 0,
+ mViewport.displayId,
1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords,
mOrientedXPrecision, mOrientedYPrecision,
mPointerSimple.downTime);
@@ -5298,6 +5361,7 @@
// Send down.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_DOWN, 0, metaState, mCurrentButtonState, 0,
+ mViewport.displayId,
1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords,
mOrientedXPrecision, mOrientedYPrecision,
mPointerSimple.downTime);
@@ -5307,6 +5371,7 @@
// Send move.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_MOVE, 0, metaState, mCurrentButtonState, 0,
+ mViewport.displayId,
1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords,
mOrientedXPrecision, mOrientedYPrecision,
mPointerSimple.downTime);
@@ -5320,6 +5385,7 @@
// Send hover enter.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_ENTER, 0, metaState, mCurrentButtonState, 0,
+ mViewport.displayId,
1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords,
mOrientedXPrecision, mOrientedYPrecision,
mPointerSimple.downTime);
@@ -5329,6 +5395,7 @@
// Send hover move.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_MOVE, 0, metaState, mCurrentButtonState, 0,
+ mViewport.displayId,
1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords,
mOrientedXPrecision, mOrientedYPrecision,
mPointerSimple.downTime);
@@ -5349,6 +5416,7 @@
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_SCROLL, 0, metaState, mCurrentButtonState, 0,
+ mViewport.displayId,
1, &mPointerSimple.currentProperties, &pointerCoords,
mOrientedXPrecision, mOrientedYPrecision,
mPointerSimple.downTime);
@@ -5410,7 +5478,8 @@
NotifyMotionArgs args(when, getDeviceId(), source, policyFlags,
action, flags, metaState, buttonState, edgeFlags,
- pointerCount, pointerProperties, pointerCoords, xPrecision, yPrecision, downTime);
+ mViewport.displayId, pointerCount, pointerProperties, pointerCoords,
+ xPrecision, yPrecision, downTime);
getListener()->notifyMotion(&args);
}
@@ -6213,7 +6282,7 @@
}
}
- // Moving a joystick axis should not wake the devide because joysticks can
+ // Moving a joystick axis should not wake the device because joysticks can
// be fairly noisy even when not in use. On the other hand, pushing a gamepad
// button will likely wake the device.
// TODO: Use the input device configuration to control this behavior more finely.
@@ -6221,7 +6290,7 @@
NotifyMotionArgs args(when, getDeviceId(), AINPUT_SOURCE_JOYSTICK, policyFlags,
AMOTION_EVENT_ACTION_MOVE, 0, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
- 1, &pointerProperties, &pointerCoords, 0, 0, 0);
+ ADISPLAY_ID_NONE, 1, &pointerProperties, &pointerCoords, 0, 0, 0);
getListener()->notifyMotion(&args);
}
diff --git a/services/input/InputReader.h b/services/input/InputReader.h
index e345a5fb..e1a8dd8 100644
--- a/services/input/InputReader.h
+++ b/services/input/InputReader.h
@@ -62,11 +62,14 @@
int32_t physicalTop;
int32_t physicalRight;
int32_t physicalBottom;
+ int32_t deviceWidth;
+ int32_t deviceHeight;
DisplayViewport() :
- displayId(-1), orientation(DISPLAY_ORIENTATION_0),
+ displayId(ADISPLAY_ID_NONE), orientation(DISPLAY_ORIENTATION_0),
logicalLeft(0), logicalTop(0), logicalRight(0), logicalBottom(0),
- physicalLeft(0), physicalTop(0), physicalRight(0), physicalBottom(0) {
+ physicalLeft(0), physicalTop(0), physicalRight(0), physicalBottom(0),
+ deviceWidth(0), deviceHeight(0) {
}
bool operator==(const DisplayViewport& other) const {
@@ -79,12 +82,33 @@
&& physicalLeft == other.physicalLeft
&& physicalTop == other.physicalTop
&& physicalRight == other.physicalRight
- && physicalBottom == other.physicalBottom;
+ && physicalBottom == other.physicalBottom
+ && deviceWidth == other.deviceWidth
+ && deviceHeight == other.deviceHeight;
}
bool operator!=(const DisplayViewport& other) const {
return !(*this == other);
}
+
+ inline bool isValid() const {
+ return displayId >= 0;
+ }
+
+ void setNonDisplayViewport(int32_t width, int32_t height) {
+ displayId = ADISPLAY_ID_NONE;
+ orientation = DISPLAY_ORIENTATION_0;
+ logicalLeft = 0;
+ logicalTop = 0;
+ logicalRight = width;
+ logicalBottom = height;
+ physicalLeft = 0;
+ physicalTop = 0;
+ physicalRight = width;
+ physicalBottom = height;
+ deviceWidth = width;
+ deviceHeight = height;
+ }
};
/*
@@ -1297,18 +1321,30 @@
virtual void syncTouch(nsecs_t when, bool* outHavePointerIds) = 0;
private:
- // The surface orientation and width and height set by configureSurface().
- int32_t mSurfaceOrientation;
+ // The current viewport.
+ // The components of the viewport are specified in the display's rotated orientation.
+ DisplayViewport mViewport;
+
+ // The surface orientation, width and height set by configureSurface().
+ // The width and height are derived from the viewport but are specified
+ // in the natural orientation.
+ // The surface origin specifies how the surface coordinates should be translated
+ // to align with the logical display coordinate space.
+ // The orientation may be different from the viewport orientation as it specifies
+ // the rotation of the surface coordinates required to produce the viewport's
+ // requested orientation, so it will depend on whether the device is orientation aware.
int32_t mSurfaceWidth;
int32_t mSurfaceHeight;
-
- // The associated display viewport set by configureSurface().
- DisplayViewport mAssociatedDisplayViewport;
+ int32_t mSurfaceLeft;
+ int32_t mSurfaceTop;
+ int32_t mSurfaceOrientation;
// Translation and scaling factors, orientation-independent.
+ float mXTranslate;
float mXScale;
float mXPrecision;
+ float mYTranslate;
float mYScale;
float mYPrecision;
@@ -1369,8 +1405,6 @@
} mOrientedRanges;
// Oriented dimensions and precision.
- float mOrientedSurfaceWidth;
- float mOrientedSurfaceHeight;
float mOrientedXPrecision;
float mOrientedYPrecision;
diff --git a/services/input/InputWindow.h b/services/input/InputWindow.h
index 824a64b..3118099 100644
--- a/services/input/InputWindow.h
+++ b/services/input/InputWindow.h
@@ -132,6 +132,7 @@
int32_t ownerPid;
int32_t ownerUid;
int32_t inputFeatures;
+ int32_t displayId;
bool touchableRegionContainsPoint(int32_t x, int32_t y) const;
bool frameContainsPoint(int32_t x, int32_t y) const;
diff --git a/services/input/tests/InputReader_test.cpp b/services/input/tests/InputReader_test.cpp
index 03516af..c6dbbf3 100644
--- a/services/input/tests/InputReader_test.cpp
+++ b/services/input/tests/InputReader_test.cpp
@@ -151,6 +151,8 @@
v.physicalTop = 0;
v.physicalRight = isRotated ? height : width;
v.physicalBottom = isRotated ? width : height;
+ v.deviceWidth = isRotated ? height : width;
+ v.deviceHeight = isRotated ? width : height;
mConfig.setDisplayInfo(false /*external*/, v);
mConfig.setDisplayInfo(true /*external*/, v);
}
@@ -487,6 +489,7 @@
return OK;
}
}
+ outAxisInfo->clear();
return -1;
}
diff --git a/services/java/com/android/server/BluetoothManagerService.java b/services/java/com/android/server/BluetoothManagerService.java
index 9404dce..e68686d 100755
--- a/services/java/com/android/server/BluetoothManagerService.java
+++ b/services/java/com/android/server/BluetoothManagerService.java
@@ -75,12 +75,12 @@
private void registerForAirplaneMode(IntentFilter filter) {
final ContentResolver resolver = mContext.getContentResolver();
- final String airplaneModeRadios = Settings.System.getString(resolver,
- Settings.System.AIRPLANE_MODE_RADIOS);
- final String toggleableRadios = Settings.System.getString(resolver,
- Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+ final String airplaneModeRadios = Settings.Global.getString(resolver,
+ Settings.Global.AIRPLANE_MODE_RADIOS);
+ final String toggleableRadios = Settings.Global.getString(resolver,
+ Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
boolean mIsAirplaneSensitive = airplaneModeRadios == null ? true :
- airplaneModeRadios.contains(Settings.System.RADIO_BLUETOOTH);
+ airplaneModeRadios.contains(Settings.Global.RADIO_BLUETOOTH);
if (mIsAirplaneSensitive) {
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
}
@@ -151,8 +151,8 @@
* Returns true if airplane mode is currently on
*/
private final boolean isAirplaneModeOn() {
- return Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON, 0) == 1;
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 0) == 1;
}
/**
diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java
index fd6060a..28a4310 100644
--- a/services/java/com/android/server/DevicePolicyManagerService.java
+++ b/services/java/com/android/server/DevicePolicyManagerService.java
@@ -721,7 +721,13 @@
private void sendChangedNotification() {
Intent intent = new Intent(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ long ident = Binder.clearCallingIdentity();
+ try {
+ // TODO: This shouldn't be sent to all users, if DPM is per user.
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
private void loadSettingsLocked() {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index c28afb2..73e82ab 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -37,14 +37,12 @@
import android.os.StrictMode;
import android.os.SystemClock;
import android.os.SystemProperties;
-import android.provider.Settings;
import android.server.search.SearchManagerService;
import android.service.dreams.DreamManagerService;
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
-import android.view.Display;
import android.view.WindowManager;
import com.android.internal.os.BinderInternal;
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 6bc5e10..7ed4f8a 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -1179,17 +1179,17 @@
}
private boolean isAirplaneSensitive() {
- String airplaneModeRadios = Settings.System.getString(mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_RADIOS);
+ String airplaneModeRadios = Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_RADIOS);
return airplaneModeRadios == null
- || airplaneModeRadios.contains(Settings.System.RADIO_WIFI);
+ || airplaneModeRadios.contains(Settings.Global.RADIO_WIFI);
}
private boolean isAirplaneToggleable() {
- String toggleableRadios = Settings.System.getString(mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+ String toggleableRadios = Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
return toggleableRadios != null
- && toggleableRadios.contains(Settings.System.RADIO_WIFI);
+ && toggleableRadios.contains(Settings.Global.RADIO_WIFI);
}
/**
@@ -1198,8 +1198,8 @@
* @return {@code true} if airplane mode is on.
*/
private boolean isAirplaneModeOn() {
- return isAirplaneSensitive() && Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON, 0) == 1;
+ return isAirplaneSensitive() && Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 0) == 1;
}
@Override
@@ -1213,8 +1213,8 @@
}
pw.println("Wi-Fi is " + mWifiStateMachine.syncGetWifiStateByName());
pw.println("Stay-awake conditions: " +
- Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0));
+ Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0));
pw.println();
pw.println("Internal state:");
diff --git a/services/java/com/android/server/accessibility/ScreenMagnifier.java b/services/java/com/android/server/accessibility/ScreenMagnifier.java
index f33517b..aa3c82b 100644
--- a/services/java/com/android/server/accessibility/ScreenMagnifier.java
+++ b/services/java/com/android/server/accessibility/ScreenMagnifier.java
@@ -46,10 +46,9 @@
import android.view.IDisplayContentChangeListener;
import android.view.IWindowManager;
import android.view.MotionEvent;
-import android.view.ScaleGestureDetector;
import android.view.MotionEvent.PointerCoords;
import android.view.MotionEvent.PointerProperties;
-import android.view.ScaleGestureDetector.OnScaleGestureListener;
+import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
import android.view.Surface;
import android.view.View;
import android.view.ViewConfiguration;
@@ -122,15 +121,15 @@
private static final int STATE_DELEGATING = 1;
private static final int STATE_DETECTING = 2;
- private static final int STATE_SCALING = 3;
- private static final int STATE_VIEWPORT_DRAGGING = 4;
- private static final int STATE_PANNING = 5;
- private static final int STATE_DECIDE_PAN_OR_SCALE = 6;
+ private static final int STATE_VIEWPORT_DRAGGING = 3;
+ private static final int STATE_MAGNIFIED_INTERACTION = 4;
private static final float DEFAULT_MAGNIFICATION_SCALE = 2.0f;
private static final int DEFAULT_SCREEN_MAGNIFICATION_AUTO_UPDATE = 1;
private static final float DEFAULT_WINDOW_ANIMATION_SCALE = 1.0f;
+ private static final int MULTI_TAP_TIME_SLOP_ADJUSTMENT = 50;
+
private final IWindowManager mWindowManagerService = IWindowManager.Stub.asInterface(
ServiceManager.getService("window"));
private final WindowManager mWindowManager;
@@ -148,7 +147,8 @@
private final Viewport mViewport;
private final int mTapTimeSlop = ViewConfiguration.getTapTimeout();
- private final int mMultiTapTimeSlop = ViewConfiguration.getDoubleTapTimeout();
+ private final int mMultiTapTimeSlop =
+ ViewConfiguration.getDoubleTapTimeout() - MULTI_TAP_TIME_SLOP_ADJUSTMENT;
private final int mTapDistanceSlop;
private final int mMultiTapDistanceSlop;
@@ -161,6 +161,7 @@
private EventStreamTransformation mNext;
private int mCurrentState;
+ private int mPreviousState;
private boolean mTranslationEnabledBeforePan;
private PointerCoords[] mTempPointerCoords;
@@ -194,6 +195,7 @@
@Override
public void onMotionEvent(MotionEvent event, int policyFlags) {
+ mGestureDetector.onMotionEvent(event);
switch (mCurrentState) {
case STATE_DELEGATING: {
handleMotionEventStateDelegating(event, policyFlags);
@@ -204,18 +206,15 @@
case STATE_VIEWPORT_DRAGGING: {
mStateViewportDraggingHandler.onMotionEvent(event, policyFlags);
} break;
- case STATE_SCALING:
- case STATE_PANNING:
- case STATE_DECIDE_PAN_OR_SCALE: {
+ case STATE_MAGNIFIED_INTERACTION: {
// Handled by the gesture detector. Since the detector
// needs all touch events to work properly we cannot
- // call it only for these states.
+ // call it only for this state.
} break;
default: {
throw new IllegalStateException("Unknown state: " + mCurrentState);
}
}
- mGestureDetector.onMotionEvent(event);
}
@Override
@@ -327,20 +326,15 @@
case STATE_VIEWPORT_DRAGGING: {
Slog.i(LOG_TAG, "mCurrentState: STATE_VIEWPORT_DRAGGING");
} break;
- case STATE_SCALING: {
- Slog.i(LOG_TAG, "mCurrentState: STATE_SCALING");
- } break;
- case STATE_PANNING: {
- Slog.i(LOG_TAG, "mCurrentState: STATE_PANNING");
- } break;
- case STATE_DECIDE_PAN_OR_SCALE: {
- Slog.i(LOG_TAG, "mCurrentState: STATE_DECIDE_PAN_OR_SCALE");
+ case STATE_MAGNIFIED_INTERACTION: {
+ Slog.i(LOG_TAG, "mCurrentState: STATE_MAGNIFIED_INTERACTION");
} break;
default: {
throw new IllegalArgumentException("Unknown state: " + state);
}
}
}
+ mPreviousState = mCurrentState;
mCurrentState = state;
}
@@ -348,7 +342,7 @@
private static final float MIN_SCALE = 1.3f;
private static final float MAX_SCALE = 5.0f;
- private static final float DETECT_SCALING_THRESHOLD = 0.25f;
+ private static final float DETECT_SCALING_THRESHOLD = 0.30f;
private static final int DETECT_PANNING_THRESHOLD_DIP = 30;
private final float mScaledDetectPanningThreshold;
@@ -367,10 +361,13 @@
private float mScaleFocusX = Float.NaN;
private float mScaleFocusY = Float.NaN;
+ private boolean mScaling;
+ private boolean mPanning;
+
public GestureDetector(Context context) {
final float density = context.getResources().getDisplayMetrics().density;
mScaledDetectPanningThreshold = DETECT_PANNING_THRESHOLD_DIP * density;
- mScaleGestureDetector = new ScaleGestureDetector(context, this);
+ mScaleGestureDetector = new ScaleGestureDetector(this);
}
public void onMotionEvent(MotionEvent event) {
@@ -384,10 +381,15 @@
}
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
clear();
- if (mCurrentState == STATE_SCALING) {
- persistScale(mMagnificationController.getScale());
+ final float scale = mMagnificationController.getScale();
+ if (scale != getPersistedScale()) {
+ persistScale(scale);
}
- transitionToState(STATE_DETECTING);
+ if (mPreviousState == STATE_VIEWPORT_DRAGGING) {
+ transitionToState(STATE_VIEWPORT_DRAGGING);
+ } else {
+ transitionToState(STATE_DETECTING);
+ }
}
}
@@ -399,17 +401,19 @@
case STATE_VIEWPORT_DRAGGING: {
return true;
}
- case STATE_DECIDE_PAN_OR_SCALE: {
+ case STATE_MAGNIFIED_INTERACTION: {
mCurrScaleFactor = mScaleGestureDetector.getScaleFactor();
final float scaleDelta = Math.abs(1.0f - mCurrScaleFactor * mPrevScaleFactor);
if (DEBUG_GESTURE_DETECTOR) {
Slog.i(LOG_TAG, "scaleDelta: " + scaleDelta);
}
- if (scaleDelta > DETECT_SCALING_THRESHOLD) {
- performScale(detector, true);
- clear();
- transitionToState(STATE_SCALING);
- return false;
+ if (!mScaling && scaleDelta > DETECT_SCALING_THRESHOLD) {
+ mScaling = true;
+ clearContextualState();
+ return true;
+ }
+ if (mScaling) {
+ performScale(detector);
}
mCurrPan = (float) MathUtils.dist(
mScaleGestureDetector.getFocusX(),
@@ -419,18 +423,14 @@
if (DEBUG_GESTURE_DETECTOR) {
Slog.i(LOG_TAG, "panDelta: " + panDelta);
}
- if (panDelta > mScaledDetectPanningThreshold) {
- performPan(detector, true);
- clear();
- transitionToState(STATE_PANNING);
- return false;
+ if (!mPanning && panDelta > mScaledDetectPanningThreshold) {
+ mPanning = true;
+ clearContextualState();
+ return true;
}
- } break;
- case STATE_SCALING: {
- performScale(detector, false);
- } break;
- case STATE_PANNING: {
- performPan(detector, false);
+ if (mPanning) {
+ performPan(detector);
+ }
} break;
}
return false;
@@ -438,32 +438,26 @@
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
- switch (mCurrentState) {
- case STATE_DECIDE_PAN_OR_SCALE: {
- mPrevScaleFactor *= mCurrScaleFactor;
- mPrevPan += mCurrPan;
- mPrevFocus.x = mInitialFocus.x = detector.getFocusX();
- mPrevFocus.y = mInitialFocus.y = detector.getFocusY();
- } break;
- case STATE_SCALING: {
- mPrevScaleFactor = 1.0f;
- mCurrScale = Float.NaN;
- } break;
- case STATE_PANNING: {
- mPrevPan += mCurrPan;
- mPrevFocus.x = mInitialFocus.x = detector.getFocusX();
- mPrevFocus.y = mInitialFocus.y = detector.getFocusY();
- } break;
- }
+ mPrevScaleFactor *= mCurrScaleFactor;
+ mCurrScale = Float.NaN;
+ mPrevPan += mCurrPan;
+ mPrevFocus.x = mInitialFocus.x = detector.getFocusX();
+ mPrevFocus.y = mInitialFocus.y = detector.getFocusY();
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
- /* do nothing */
+ clearContextualState();
}
public void clear() {
+ clearContextualState();
+ mScaling = false;
+ mPanning = false;
+ }
+
+ private void clearContextualState() {
mCurrScaleFactor = 1.0f;
mPrevScaleFactor = 1.0f;
mPrevPan = 0;
@@ -475,7 +469,7 @@
mScaleFocusY = Float.NaN;
}
- private void performPan(ScaleGestureDetector detector, boolean animate) {
+ private void performPan(ScaleGestureDetector detector) {
if (Float.compare(mPrevFocus.x, Float.NaN) == 0
&& Float.compare(mPrevFocus.y, Float.NaN) == 0) {
mPrevFocus.set(detector.getFocusX(), detector.getFocusY());
@@ -492,11 +486,11 @@
Slog.i(LOG_TAG, "Panned content by scrollX: " + scrollX
+ " scrollY: " + scrollY);
}
- mMagnificationController.setMagnifiedRegionCenter(centerX, centerY, animate);
+ mMagnificationController.setMagnifiedRegionCenter(centerX, centerY, false);
mPrevFocus.set(detector.getFocusX(), detector.getFocusY());
}
- private void performScale(ScaleGestureDetector detector, boolean animate) {
+ private void performScale(ScaleGestureDetector detector) {
if (Float.compare(mCurrScale, Float.NaN) == 0) {
mCurrScale = mMagnificationController.getScale();
return;
@@ -514,7 +508,7 @@
mScaleFocusY = detector.getFocusY();
}
mMagnificationController.setScale(normalizedNewScale, mScaleFocusX,
- mScaleFocusY, animate);
+ mScaleFocusY, false);
}
}
@@ -529,7 +523,7 @@
}
case MotionEvent.ACTION_POINTER_DOWN: {
clear();
- transitionToState(STATE_SCALING);
+ transitionToState(STATE_MAGNIFIED_INTERACTION);
} break;
case MotionEvent.ACTION_MOVE: {
if (event.getPointerCount() != 1) {
@@ -626,14 +620,14 @@
} else if (mTapCount < ACTION_TAP_COUNT) {
Message message = mHandler.obtainMessage(
MESSAGE_TRANSITION_TO_DELEGATING_STATE);
- mHandler.sendMessageDelayed(message, mTapTimeSlop + mMultiTapDistanceSlop);
+ mHandler.sendMessageDelayed(message, mMultiTapTimeSlop);
}
clearLastDownEvent();
mLastDownEvent = MotionEvent.obtain(event);
} break;
case MotionEvent.ACTION_POINTER_DOWN: {
if (mMagnificationController.isMagnifying()) {
- transitionToState(STATE_DECIDE_PAN_OR_SCALE);
+ transitionToState(STATE_MAGNIFIED_INTERACTION);
clear();
} else {
transitionToDelegatingStateAndClear();
@@ -1763,4 +1757,482 @@
updateDisplayInfo();
}
}
+
+ /**
+ * The listener for receiving notifications when gestures occur.
+ * If you want to listen for all the different gestures then implement
+ * this interface. If you only want to listen for a subset it might
+ * be easier to extend {@link SimpleOnScaleGestureListener}.
+ *
+ * An application will receive events in the following order:
+ * <ul>
+ * <li>One {@link OnScaleGestureListener#onScaleBegin(ScaleGestureDetector)}
+ * <li>Zero or more {@link OnScaleGestureListener#onScale(ScaleGestureDetector)}
+ * <li>One {@link OnScaleGestureListener#onScaleEnd(ScaleGestureDetector)}
+ * </ul>
+ */
+ interface OnScaleGestureListener {
+ /**
+ * Responds to scaling events for a gesture in progress.
+ * Reported by pointer motion.
+ *
+ * @param detector The detector reporting the event - use this to
+ * retrieve extended info about event state.
+ * @return Whether or not the detector should consider this event
+ * as handled. If an event was not handled, the detector
+ * will continue to accumulate movement until an event is
+ * handled. This can be useful if an application, for example,
+ * only wants to update scaling factors if the change is
+ * greater than 0.01.
+ */
+ public boolean onScale(ScaleGestureDetector detector);
+
+ /**
+ * Responds to the beginning of a scaling gesture. Reported by
+ * new pointers going down.
+ *
+ * @param detector The detector reporting the event - use this to
+ * retrieve extended info about event state.
+ * @return Whether or not the detector should continue recognizing
+ * this gesture. For example, if a gesture is beginning
+ * with a focal point outside of a region where it makes
+ * sense, onScaleBegin() may return false to ignore the
+ * rest of the gesture.
+ */
+ public boolean onScaleBegin(ScaleGestureDetector detector);
+
+ /**
+ * Responds to the end of a scale gesture. Reported by existing
+ * pointers going up.
+ *
+ * Once a scale has ended, {@link ScaleGestureDetector#getFocusX()}
+ * and {@link ScaleGestureDetector#getFocusY()} will return the location
+ * of the pointer remaining on the screen.
+ *
+ * @param detector The detector reporting the event - use this to
+ * retrieve extended info about event state.
+ */
+ public void onScaleEnd(ScaleGestureDetector detector);
+ }
+
+ class ScaleGestureDetector {
+
+ private final MinCircleFinder mMinCircleFinder = new MinCircleFinder();
+
+ private final OnScaleGestureListener mListener;
+
+ private float mFocusX;
+ private float mFocusY;
+
+ private float mCurrSpan;
+ private float mPrevSpan;
+ private float mCurrSpanX;
+ private float mCurrSpanY;
+ private float mPrevSpanX;
+ private float mPrevSpanY;
+ private long mCurrTime;
+ private long mPrevTime;
+ private boolean mInProgress;
+
+ public ScaleGestureDetector(OnScaleGestureListener listener) {
+ mListener = listener;
+ }
+
+ /**
+ * Accepts MotionEvents and dispatches events to a {@link OnScaleGestureListener}
+ * when appropriate.
+ *
+ * <p>Applications should pass a complete and consistent event stream to this method.
+ * A complete and consistent event stream involves all MotionEvents from the initial
+ * ACTION_DOWN to the final ACTION_UP or ACTION_CANCEL.</p>
+ *
+ * @param event The event to process
+ * @return true if the event was processed and the detector wants to receive the
+ * rest of the MotionEvents in this event stream.
+ */
+ public boolean onTouchEvent(MotionEvent event) {
+ boolean streamEnded = false;
+ boolean contextChanged = false;
+ int excludedPtrIdx = -1;
+ final int action = event.getActionMasked();
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_POINTER_DOWN: {
+ contextChanged = true;
+ } break;
+ case MotionEvent.ACTION_POINTER_UP: {
+ contextChanged = true;
+ excludedPtrIdx = event.getActionIndex();
+ } break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL: {
+ streamEnded = true;
+ } break;
+ }
+
+ if (mInProgress && (contextChanged || streamEnded)) {
+ mListener.onScaleEnd(this);
+ mInProgress = false;
+ mPrevSpan = 0;
+ mPrevSpanX = 0;
+ mPrevSpanY = 0;
+ return true;
+ }
+
+ final long currTime = mCurrTime;
+
+ mFocusX = 0;
+ mFocusY = 0;
+ mCurrSpan = 0;
+ mCurrSpanX = 0;
+ mCurrSpanY = 0;
+ mCurrTime = 0;
+ mPrevTime = 0;
+
+ if (!streamEnded) {
+ MinCircleFinder.Circle circle =
+ mMinCircleFinder.computeMinCircleAroundPointers(event);
+ mFocusX = circle.centerX;
+ mFocusY = circle.centerY;
+
+ double sumSlope = 0;
+ final int pointerCount = event.getPointerCount();
+ for (int i = 0; i < pointerCount; i++) {
+ if (i == excludedPtrIdx) {
+ continue;
+ }
+ float x = event.getX(i) - mFocusX;
+ float y = event.getY(i) - mFocusY;
+ if (x == 0) {
+ x += 0.1f;
+ }
+ sumSlope += y / x;
+ }
+ final double avgSlope = sumSlope
+ / ((excludedPtrIdx < 0) ? pointerCount : pointerCount - 1);
+
+ double angle = Math.atan(avgSlope);
+ mCurrSpan = 2 * circle.radius;
+ mCurrSpanX = (float) Math.abs((Math.cos(angle) * mCurrSpan));
+ mCurrSpanY = (float) Math.abs((Math.sin(angle) * mCurrSpan));
+ }
+
+ if (contextChanged || mPrevSpan == 0 || mPrevSpanX == 0 || mPrevSpanY == 0) {
+ mPrevSpan = mCurrSpan;
+ mPrevSpanX = mCurrSpanX;
+ mPrevSpanY = mCurrSpanY;
+ }
+
+ if (!mInProgress && mCurrSpan != 0 && !streamEnded) {
+ mInProgress = mListener.onScaleBegin(this);
+ }
+
+ if (mInProgress) {
+ mPrevTime = (currTime != 0) ? currTime : event.getEventTime();
+ mCurrTime = event.getEventTime();
+ if (mCurrSpan == 0) {
+ mListener.onScaleEnd(this);
+ mInProgress = false;
+ } else {
+ if (mListener.onScale(this)) {
+ mPrevSpanX = mCurrSpanX;
+ mPrevSpanY = mCurrSpanY;
+ mPrevSpan = mCurrSpan;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns {@code true} if a scale gesture is in progress.
+ */
+ public boolean isInProgress() {
+ return mInProgress;
+ }
+
+ /**
+ * Get the X coordinate of the current gesture's focal point.
+ * If a gesture is in progress, the focal point is between
+ * each of the pointers forming the gesture.
+ *
+ * If {@link #isInProgress()} would return false, the result of this
+ * function is undefined.
+ *
+ * @return X coordinate of the focal point in pixels.
+ */
+ public float getFocusX() {
+ return mFocusX;
+ }
+
+ /**
+ * Get the Y coordinate of the current gesture's focal point.
+ * If a gesture is in progress, the focal point is between
+ * each of the pointers forming the gesture.
+ *
+ * If {@link #isInProgress()} would return false, the result of this
+ * function is undefined.
+ *
+ * @return Y coordinate of the focal point in pixels.
+ */
+ public float getFocusY() {
+ return mFocusY;
+ }
+
+ /**
+ * Return the average distance between each of the pointers forming the
+ * gesture in progress through the focal point.
+ *
+ * @return Distance between pointers in pixels.
+ */
+ public float getCurrentSpan() {
+ return mCurrSpan;
+ }
+
+ /**
+ * Return the average X distance between each of the pointers forming the
+ * gesture in progress through the focal point.
+ *
+ * @return Distance between pointers in pixels.
+ */
+ public float getCurrentSpanX() {
+ return mCurrSpanX;
+ }
+
+ /**
+ * Return the average Y distance between each of the pointers forming the
+ * gesture in progress through the focal point.
+ *
+ * @return Distance between pointers in pixels.
+ */
+ public float getCurrentSpanY() {
+ return mCurrSpanY;
+ }
+
+ /**
+ * Return the previous average distance between each of the pointers forming the
+ * gesture in progress through the focal point.
+ *
+ * @return Previous distance between pointers in pixels.
+ */
+ public float getPreviousSpan() {
+ return mPrevSpan;
+ }
+
+ /**
+ * Return the previous average X distance between each of the pointers forming the
+ * gesture in progress through the focal point.
+ *
+ * @return Previous distance between pointers in pixels.
+ */
+ public float getPreviousSpanX() {
+ return mPrevSpanX;
+ }
+
+ /**
+ * Return the previous average Y distance between each of the pointers forming the
+ * gesture in progress through the focal point.
+ *
+ * @return Previous distance between pointers in pixels.
+ */
+ public float getPreviousSpanY() {
+ return mPrevSpanY;
+ }
+
+ /**
+ * Return the scaling factor from the previous scale event to the current
+ * event. This value is defined as
+ * ({@link #getCurrentSpan()} / {@link #getPreviousSpan()}).
+ *
+ * @return The current scaling factor.
+ */
+ public float getScaleFactor() {
+ return mPrevSpan > 0 ? mCurrSpan / mPrevSpan : 1;
+ }
+
+ /**
+ * Return the time difference in milliseconds between the previous
+ * accepted scaling event and the current scaling event.
+ *
+ * @return Time difference since the last scaling event in milliseconds.
+ */
+ public long getTimeDelta() {
+ return mCurrTime - mPrevTime;
+ }
+
+ /**
+ * Return the event time of the current event being processed.
+ *
+ * @return Current event time in milliseconds.
+ */
+ public long getEventTime() {
+ return mCurrTime;
+ }
+ }
+
+ private static final class MinCircleFinder {
+ private final ArrayList<PointHolder> mPoints = new ArrayList<PointHolder>();
+ private final ArrayList<PointHolder> sBoundary = new ArrayList<PointHolder>();
+ private final Circle mMinCircle = new Circle();
+
+ /**
+ * Finds the minimal circle that contains all pointers of a motion event.
+ *
+ * @param event A motion event.
+ * @return The minimal circle.
+ */
+ public Circle computeMinCircleAroundPointers(MotionEvent event) {
+ ArrayList<PointHolder> points = mPoints;
+ points.clear();
+ final int pointerCount = event.getPointerCount();
+ for (int i = 0; i < pointerCount; i++) {
+ PointHolder point = PointHolder.obtain(event.getX(i), event.getY(i));
+ points.add(point);
+ }
+ ArrayList<PointHolder> boundary = sBoundary;
+ boundary.clear();
+ computeMinCircleAroundPointsRecursive(points, boundary, mMinCircle);
+ for (int i = points.size() - 1; i >= 0; i--) {
+ points.remove(i).recycle();
+ }
+ boundary.clear();
+ return mMinCircle;
+ }
+
+ private static void computeMinCircleAroundPointsRecursive(ArrayList<PointHolder> points,
+ ArrayList<PointHolder> boundary, Circle outCircle) {
+ if (points.isEmpty()) {
+ if (boundary.size() == 0) {
+ outCircle.initialize();
+ } else if (boundary.size() == 1) {
+ outCircle.initialize(boundary.get(0).mData, boundary.get(0).mData);
+ } else if (boundary.size() == 2) {
+ outCircle.initialize(boundary.get(0).mData, boundary.get(1).mData);
+ } else if (boundary.size() == 3) {
+ outCircle.initialize(boundary.get(0).mData, boundary.get(1).mData,
+ boundary.get(2).mData);
+ }
+ return;
+ }
+ PointHolder point = points.remove(points.size() - 1);
+ computeMinCircleAroundPointsRecursive(points, boundary, outCircle);
+ if (!outCircle.contains(point.mData)) {
+ boundary.add(point);
+ computeMinCircleAroundPointsRecursive(points, boundary, outCircle);
+ boundary.remove(point);
+ }
+ points.add(point);
+ }
+
+ private static final class PointHolder {
+ private static final int MAX_POOL_SIZE = 20;
+ private static PointHolder sPool;
+ private static int sPoolSize;
+
+ private PointHolder mNext;
+ private boolean mIsInPool;
+
+ private final PointF mData = new PointF();
+
+ public static PointHolder obtain(float x, float y) {
+ PointHolder holder;
+ if (sPoolSize > 0) {
+ sPoolSize--;
+ holder = sPool;
+ sPool = sPool.mNext;
+ holder.mNext = null;
+ holder.mIsInPool = false;
+ } else {
+ holder = new PointHolder();
+ }
+ holder.mData.set(x, y);
+ return holder;
+ }
+
+ public void recycle() {
+ if (mIsInPool) {
+ throw new IllegalStateException("Already recycled.");
+ }
+ clear();
+ if (sPoolSize < MAX_POOL_SIZE) {
+ sPoolSize++;
+ mNext = sPool;
+ sPool = this;
+ mIsInPool = true;
+ }
+ }
+
+ private void clear() {
+ mData.set(0, 0);
+ }
+ }
+
+ public static final class Circle {
+ public float centerX;
+ public float centerY;
+ public float radius;
+
+ private void initialize() {
+ centerX = 0;
+ centerY = 0;
+ radius = 0;
+ }
+
+ private void initialize(PointF first, PointF second, PointF third) {
+ if (!hasLineWithInfiniteSlope(first, second, third)) {
+ initializeInternal(first, second, third);
+ } else if (!hasLineWithInfiniteSlope(first, third, second)) {
+ initializeInternal(first, third, second);
+ } else if (!hasLineWithInfiniteSlope(second, first, third)) {
+ initializeInternal(second, first, third);
+ } else if (!hasLineWithInfiniteSlope(second, third, first)) {
+ initializeInternal(second, third, first);
+ } else if (!hasLineWithInfiniteSlope(third, first, second)) {
+ initializeInternal(third, first, second);
+ } else if (!hasLineWithInfiniteSlope(third, second, first)) {
+ initializeInternal(third, second, first);
+ } else {
+ initialize();
+ }
+ }
+
+ private void initialize(PointF first, PointF second) {
+ radius = (float) (Math.hypot(second.x - first.x, second.y - first.y) / 2);
+ centerX = (float) (second.x + first.x) / 2;
+ centerY = (float) (second.y + first.y) / 2;
+ }
+
+ public boolean contains(PointF point) {
+ return (int) (Math.hypot(point.x - centerX, point.y - centerY)) <= radius;
+ }
+
+ private void initializeInternal(PointF first, PointF second, PointF third) {
+ final float x1 = first.x;
+ final float y1 = first.y;
+ final float x2 = second.x;
+ final float y2 = second.y;
+ final float x3 = third.x;
+ final float y3 = third.y;
+
+ final float sl1 = (y2 - y1) / (x2 - x1);
+ final float sl2 = (y3 - y2) / (x3 - x2);
+
+ centerX = (int) ((sl1 * sl2 * (y1 - y3) + sl2 * (x1 + x2) - sl1 * (x2 + x3))
+ / (2 * (sl2 - sl1)));
+ centerY = (int) (-1 / sl1 * (centerX - (x1 + x2) / 2) + (y1 + y2) / 2);
+ radius = (int) Math.hypot(x1 - centerX, y1 - centerY);
+ }
+
+ private boolean hasLineWithInfiniteSlope(PointF first, PointF second, PointF third) {
+ return (second.x - first.x == 0 || third.x - second.x == 0
+ || second.y - first.y == 0 || third.y - second.y == 0);
+ }
+
+ @Override
+ public String toString() {
+ return "cetner: [" + centerX + ", " + centerY + "] radius: " + radius;
+ }
+ }
+ }
}
diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java
index 7144808..3bb95a8 100644
--- a/services/java/com/android/server/am/ActiveServices.java
+++ b/services/java/com/android/server/am/ActiveServices.java
@@ -1551,8 +1551,12 @@
}
}
} else {
- didSomething = collectForceStopServicesLocked(name, userId, evenPersistent,
- doit, mServiceMap.mServicesByNamePerUser.get(userId), services);
+ HashMap<ComponentName, ServiceRecord> items
+ = mServiceMap.mServicesByNamePerUser.get(userId);
+ if (items != null) {
+ didSomething = collectForceStopServicesLocked(name, userId, evenPersistent,
+ doit, items, services);
+ }
}
int N = services.size();
@@ -1759,12 +1763,11 @@
if (ActivityManager.checkUidPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
uid) == PackageManager.PERMISSION_GRANTED) {
- List<UserInfo> users = mAm.getUserManager().getUsers();
- for (int ui=0; ui<users.size() && res.size() < maxNum; ui++) {
- final UserInfo user = users.get(ui);
- if (mServiceMap.getAllServices(user.id).size() > 0) {
+ int[] users = mAm.getUsersLocked();
+ for (int ui=0; ui<users.length && res.size() < maxNum; ui++) {
+ if (mServiceMap.getAllServices(users[ui]).size() > 0) {
Iterator<ServiceRecord> it = mServiceMap.getAllServices(
- user.id).iterator();
+ users[ui]).iterator();
while (it.hasNext() && res.size() < maxNum) {
res.add(makeRunningServiceInfoLocked(it.next()));
}
@@ -1869,14 +1872,13 @@
pw.println("ACTIVITY MANAGER SERVICES (dumpsys activity services)");
try {
- List<UserInfo> users = mAm.getUserManager().getUsers();
- for (int ui=0; ui<users.size(); ui++) {
- final UserInfo user = users.get(ui);
- if (mServiceMap.getAllServices(user.id).size() > 0) {
+ int[] users = mAm.getUsersLocked();
+ for (int user : users) {
+ if (mServiceMap.getAllServices(user).size() > 0) {
boolean printed = false;
long nowReal = SystemClock.elapsedRealtime();
Iterator<ServiceRecord> it = mServiceMap.getAllServices(
- user.id).iterator();
+ user).iterator();
needSep = false;
while (it.hasNext()) {
ServiceRecord r = it.next();
@@ -1887,10 +1889,10 @@
continue;
}
if (!printed) {
- if (ui > 0) {
+ if (user != 0) {
pw.println();
}
- pw.println(" User " + user.id + " active services:");
+ pw.println(" User " + user + " active services:");
printed = true;
}
if (needSep) {
@@ -2066,32 +2068,30 @@
int opti, boolean dumpAll) {
ArrayList<ServiceRecord> services = new ArrayList<ServiceRecord>();
- List<UserInfo> users = mAm.getUserManager().getUsers();
- if ("all".equals(name)) {
- synchronized (this) {
- for (UserInfo user : users) {
- for (ServiceRecord r1 : mServiceMap.getAllServices(user.id)) {
+ synchronized (this) {
+ int[] users = mAm.getUsersLocked();
+ if ("all".equals(name)) {
+ for (int user : users) {
+ for (ServiceRecord r1 : mServiceMap.getAllServices(user)) {
services.add(r1);
}
}
- }
- } else {
- ComponentName componentName = name != null
- ? ComponentName.unflattenFromString(name) : null;
- int objectId = 0;
- if (componentName == null) {
- // Not a '/' separated full component name; maybe an object ID?
- try {
- objectId = Integer.parseInt(name, 16);
- name = null;
- componentName = null;
- } catch (RuntimeException e) {
+ } else {
+ ComponentName componentName = name != null
+ ? ComponentName.unflattenFromString(name) : null;
+ int objectId = 0;
+ if (componentName == null) {
+ // Not a '/' separated full component name; maybe an object ID?
+ try {
+ objectId = Integer.parseInt(name, 16);
+ name = null;
+ componentName = null;
+ } catch (RuntimeException e) {
+ }
}
- }
- synchronized (this) {
- for (UserInfo user : users) {
- for (ServiceRecord r1 : mServiceMap.getAllServices(user.id)) {
+ for (int user : users) {
+ for (ServiceRecord r1 : mServiceMap.getAllServices(user)) {
if (componentName != null) {
if (r1.name.equals(componentName)) {
services.add(r1);
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index ca45946..ca90368 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -27,6 +27,7 @@
import com.android.server.SystemServer;
import com.android.server.Watchdog;
import com.android.server.am.ActivityStack.ActivityState;
+import com.android.server.pm.UserManagerService;
import com.android.server.wm.WindowManagerService;
import dalvik.system.Zygote;
@@ -99,6 +100,7 @@
import android.os.Handler;
import android.os.IBinder;
import android.os.IPermissionController;
+import android.os.IUserManager;
import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
@@ -112,7 +114,6 @@
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
-import android.os.UserManager;
import android.provider.Settings;
import android.text.format.Time;
import android.util.EventLog;
@@ -546,7 +547,7 @@
*/
final ArrayList mCancelledThumbnails = new ArrayList();
- final ProviderMap mProviderMap = new ProviderMap();
+ final ProviderMap mProviderMap;
/**
* List of content providers who have clients waiting for them. The
@@ -811,7 +812,7 @@
static ActivityThread mSystemThread;
private int mCurrentUserId;
- private UserManager mUserManager;
+ private UserManagerService mUserManager;
private final class AppDeathRecipient implements IBinder.DeathRecipient {
final ProcessRecord mApp;
@@ -1511,6 +1512,7 @@
mBroadcastQueues[1] = mBgBroadcastQueue;
mServices = new ActiveServices(this);
+ mProviderMap = new ProviderMap(this);
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
@@ -1792,7 +1794,7 @@
// Also don't let it kick out the first few "real" hidden processes.
skipTop = ProcessList.MIN_HIDDEN_APPS;
}
-
+
while (i >= 0) {
ProcessRecord p = mLruProcesses.get(i);
// If this app shouldn't be in front of the first N background
@@ -2680,7 +2682,7 @@
}
final long origId = Binder.clearCallingIdentity();
boolean res = mMainStack.requestFinishActivityLocked(token, resultCode,
- resultData, "app-request");
+ resultData, "app-request", true);
Binder.restoreCallingIdentity(origId);
return res;
}
@@ -2710,7 +2712,7 @@
int index = mMainStack.indexOfTokenLocked(r.appToken);
if (index >= 0) {
mMainStack.finishActivityLocked(r, index, Activity.RESULT_CANCELED,
- null, "finish-heavy");
+ null, "finish-heavy", true);
}
}
}
@@ -3400,10 +3402,12 @@
}
public boolean clearApplicationUserData(final String packageName,
- final IPackageDataObserver observer, final int userId) {
+ final IPackageDataObserver observer, int userId) {
enforceNotIsolatedCaller("clearApplicationUserData");
int uid = Binder.getCallingUid();
int pid = Binder.getCallingPid();
+ userId = handleIncomingUserLocked(pid, uid,
+ userId, false, true, "clearApplicationUserData", null);
long callingId = Binder.clearCallingIdentity();
try {
IPackageManager pm = AppGlobals.getPackageManager();
@@ -3445,7 +3449,7 @@
return true;
}
- public void killBackgroundProcesses(final String packageName) {
+ public void killBackgroundProcesses(final String packageName, int userId) {
if (checkCallingPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES)
!= PackageManager.PERMISSION_GRANTED &&
checkCallingPermission(android.Manifest.permission.RESTART_PACKAGES)
@@ -3457,22 +3461,23 @@
Slog.w(TAG, msg);
throw new SecurityException(msg);
}
-
- int userId = UserHandle.getCallingUserId();
+
+ userId = handleIncomingUserLocked(Binder.getCallingPid(), Binder.getCallingUid(),
+ userId, true, true, "killBackgroundProcesses", null);
long callingId = Binder.clearCallingIdentity();
try {
IPackageManager pm = AppGlobals.getPackageManager();
- int pkgUid = -1;
synchronized(this) {
+ int appId = -1;
try {
- pkgUid = pm.getPackageUid(packageName, userId);
+ appId = UserHandle.getAppId(pm.getPackageUid(packageName, 0));
} catch (RemoteException e) {
}
- if (pkgUid == -1) {
+ if (appId == -1) {
Slog.w(TAG, "Invalid packageName: " + packageName);
return;
}
- killPackageProcessesLocked(packageName, pkgUid, -1,
+ killPackageProcessesLocked(packageName, appId, userId,
ProcessList.SERVICE_ADJ, false, true, true, false, "kill background");
}
} finally {
@@ -3522,7 +3527,7 @@
}
}
- public void forceStopPackage(final String packageName) {
+ public void forceStopPackage(final String packageName, int userId) {
if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
!= PackageManager.PERMISSION_GRANTED) {
String msg = "Permission Denial: forceStopPackage() from pid="
@@ -3532,27 +3537,34 @@
Slog.w(TAG, msg);
throw new SecurityException(msg);
}
- final int userId = UserHandle.getCallingUserId();
+ userId = handleIncomingUserLocked(Binder.getCallingPid(), Binder.getCallingUid(),
+ userId, true, true, "forceStopPackage", null);
long callingId = Binder.clearCallingIdentity();
try {
IPackageManager pm = AppGlobals.getPackageManager();
- int pkgUid = -1;
synchronized(this) {
- try {
- pkgUid = pm.getPackageUid(packageName, userId);
- } catch (RemoteException e) {
- }
- if (pkgUid == -1) {
- Slog.w(TAG, "Invalid packageName: " + packageName);
- return;
- }
- forceStopPackageLocked(packageName, pkgUid);
- try {
- pm.setPackageStoppedState(packageName, true, userId);
- } catch (RemoteException e) {
- } catch (IllegalArgumentException e) {
- Slog.w(TAG, "Failed trying to unstop package "
- + packageName + ": " + e);
+ int[] users = userId == UserHandle.USER_ALL
+ ? getUsersLocked() : new int[] { userId };
+ for (int user : users) {
+ int pkgUid = -1;
+ try {
+ pkgUid = pm.getPackageUid(packageName, user);
+ } catch (RemoteException e) {
+ }
+ if (pkgUid == -1) {
+ Slog.w(TAG, "Invalid packageName: " + packageName);
+ continue;
+ }
+ try {
+ pm.setPackageStoppedState(packageName, true, user);
+ } catch (RemoteException e) {
+ } catch (IllegalArgumentException e) {
+ Slog.w(TAG, "Failed trying to unstop package "
+ + packageName + ": " + e);
+ }
+ if (isUserRunningLocked(user)) {
+ forceStopPackageLocked(packageName, pkgUid);
+ }
}
}
} finally {
@@ -3627,7 +3639,7 @@
ActivityRecord r = (ActivityRecord)mMainStack.mHistory.get(i);
if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) {
r.stack.finishActivityLocked(r, i,
- Activity.RESULT_CANCELED, null, "close-sys");
+ Activity.RESULT_CANCELED, null, "close-sys", true);
}
}
@@ -3684,8 +3696,8 @@
}
private void forceStopPackageLocked(final String packageName, int uid) {
- forceStopPackageLocked(packageName, uid, false, false, true, false,
- UserHandle.getUserId(uid));
+ forceStopPackageLocked(packageName, UserHandle.getAppId(uid), false,
+ false, true, false, UserHandle.getUserId(uid));
Intent intent = new Intent(Intent.ACTION_PACKAGE_RESTARTED,
Uri.fromParts("package", packageName, null));
if (!mProcessesReady) {
@@ -6972,7 +6984,7 @@
if (count > 1) {
final long origId = Binder.clearCallingIdentity();
mMainStack.finishActivityLocked((ActivityRecord)mMainStack.mHistory.get(count-1),
- count-1, Activity.RESULT_CANCELED, null, "unhandled-back");
+ count-1, Activity.RESULT_CANCELED, null, "unhandled-back", true);
Binder.restoreCallingIdentity(origId);
}
}
@@ -7891,7 +7903,8 @@
if (r.app == app) {
Slog.w(TAG, " Force finishing activity "
+ r.intent.getComponent().flattenToShortString());
- r.stack.finishActivityLocked(r, i, Activity.RESULT_CANCELED, null, "crashed");
+ r.stack.finishActivityLocked(r, i, Activity.RESULT_CANCELED,
+ null, "crashed", false);
}
}
if (!app.persistent) {
@@ -7926,7 +7939,7 @@
+ r.intent.getComponent().flattenToShortString());
int index = mMainStack.indexOfActivityLocked(r);
r.stack.finishActivityLocked(r, index,
- Activity.RESULT_CANCELED, null, "crashed");
+ Activity.RESULT_CANCELED, null, "crashed", false);
// Also terminate any activities below it that aren't yet
// stopped, to avoid a situation where one will get
// re-start our crashing activity once it gets resumed again.
@@ -7940,7 +7953,7 @@
Slog.w(TAG, " Force finishing activity "
+ r.intent.getComponent().flattenToShortString());
r.stack.finishActivityLocked(r, index,
- Activity.RESULT_CANCELED, null, "crashed");
+ Activity.RESULT_CANCELED, null, "crashed", false);
}
}
}
@@ -12305,7 +12318,7 @@
for (int i = start; i > finishTo; i--) {
ActivityRecord r = history.get(i);
mMainStack.requestFinishActivityLocked(r.appToken, resultCode, resultData,
- "navigate-up");
+ "navigate-up", true);
// Only return the supplied result for the first activity finished
resultCode = Activity.RESULT_CANCELED;
resultData = null;
@@ -12331,7 +12344,7 @@
foundParentInTask = false;
}
mMainStack.requestFinishActivityLocked(parent.appToken, resultCode,
- resultData, "navigate-up");
+ resultData, "navigate-up", true);
}
}
Binder.restoreCallingIdentity(origId);
@@ -13686,7 +13699,7 @@
mAutoStopProfiler = false;
}
- public boolean profileControl(String process, boolean start,
+ public boolean profileControl(String process, int userId, boolean start,
String path, ParcelFileDescriptor fd, int profileType) throws RemoteException {
try {
@@ -13705,22 +13718,7 @@
ProcessRecord proc = null;
if (process != null) {
- try {
- int pid = Integer.parseInt(process);
- synchronized (mPidsSelfLocked) {
- proc = mPidsSelfLocked.get(pid);
- }
- } catch (NumberFormatException e) {
- }
-
- if (proc == null) {
- HashMap<String, SparseArray<ProcessRecord>> all
- = mProcessNames.getMap();
- SparseArray<ProcessRecord> procs = all.get(process);
- if (procs != null && procs.size() > 0) {
- proc = procs.valueAt(0);
- }
- }
+ proc = findProcessLocked(process, userId, "profileControl");
}
if (start && (proc == null || proc.thread == null)) {
@@ -13764,7 +13762,40 @@
}
}
- public boolean dumpHeap(String process, boolean managed,
+ private ProcessRecord findProcessLocked(String process, int userId, String callName) {
+ userId = handleIncomingUserLocked(Binder.getCallingPid(), Binder.getCallingUid(),
+ userId, true, true, callName, null);
+ ProcessRecord proc = null;
+ try {
+ int pid = Integer.parseInt(process);
+ synchronized (mPidsSelfLocked) {
+ proc = mPidsSelfLocked.get(pid);
+ }
+ } catch (NumberFormatException e) {
+ }
+
+ if (proc == null) {
+ HashMap<String, SparseArray<ProcessRecord>> all
+ = mProcessNames.getMap();
+ SparseArray<ProcessRecord> procs = all.get(process);
+ if (procs != null && procs.size() > 0) {
+ proc = procs.valueAt(0);
+ if (userId != UserHandle.USER_ALL && proc.userId != userId) {
+ for (int i=1; i<procs.size(); i++) {
+ ProcessRecord thisProc = procs.valueAt(i);
+ if (thisProc.userId == userId) {
+ proc = thisProc;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return proc;
+ }
+
+ public boolean dumpHeap(String process, int userId, boolean managed,
String path, ParcelFileDescriptor fd) throws RemoteException {
try {
@@ -13781,24 +13812,7 @@
throw new IllegalArgumentException("null fd");
}
- ProcessRecord proc = null;
- try {
- int pid = Integer.parseInt(process);
- synchronized (mPidsSelfLocked) {
- proc = mPidsSelfLocked.get(pid);
- }
- } catch (NumberFormatException e) {
- }
-
- if (proc == null) {
- HashMap<String, SparseArray<ProcessRecord>> all
- = mProcessNames.getMap();
- SparseArray<ProcessRecord> procs = all.get(process);
- if (procs != null && procs.size() > 0) {
- proc = procs.valueAt(0);
- }
- }
-
+ ProcessRecord proc = findProcessLocked(process, userId, "dumpHeap");
if (proc == null || proc.thread == null) {
throw new IllegalArgumentException("Unknown process: " + process);
}
@@ -14016,7 +14030,7 @@
throw new SecurityException(msg);
}
synchronized (this) {
- return getUserManager().getUserInfo(mCurrentUserId);
+ return getUserManagerLocked().getUserInfo(mCurrentUserId);
}
}
@@ -14032,19 +14046,32 @@
throw new SecurityException(msg);
}
synchronized (this) {
- UserStartedState state = mStartedUsers.get(userId);
- return state != null && state.mState != UserStartedState.STATE_STOPPING;
+ return isUserRunningLocked(userId);
}
}
- private boolean userExists(int userId) {
- UserInfo user = getUserManager().getUserInfo(userId);
- return user != null;
+ boolean isUserRunningLocked(int userId) {
+ UserStartedState state = mStartedUsers.get(userId);
+ return state != null && state.mState != UserStartedState.STATE_STOPPING;
}
- UserManager getUserManager() {
+ private boolean userExists(int userId) {
+ if (userId == 0) {
+ return true;
+ }
+ UserManagerService ums = getUserManagerLocked();
+ return ums != null ? (ums.getUserInfo(userId) != null) : false;
+ }
+
+ int[] getUsersLocked() {
+ UserManagerService ums = getUserManagerLocked();
+ return ums != null ? ums.getUserIds() : new int[] { 0 };
+ }
+
+ UserManagerService getUserManagerLocked() {
if (mUserManager == null) {
- mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ IBinder b = ServiceManager.getService(Context.USER_SERVICE);
+ mUserManager = (UserManagerService)IUserManager.Stub.asInterface(b);
}
return mUserManager;
}
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index c70650d..009fb5d 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -333,7 +333,6 @@
state = ActivityState.INITIALIZING;
frontOfTask = false;
launchFailed = false;
- haveState = false;
stopped = false;
delayedResume = false;
finishing = false;
@@ -347,6 +346,11 @@
idle = false;
hasBeenLaunched = false;
+ // This starts out true, since the initial state of an activity
+ // is that we have everything, and we shouldn't never consider it
+ // lacking in state to be removed if it dies.
+ haveState = true;
+
if (aInfo != null) {
if (aInfo.targetActivity == null
|| aInfo.launchMode == ActivityInfo.LAUNCH_MULTIPLE
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 895b52a..bc835b6 100755
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -725,7 +725,7 @@
+ ", giving up", e);
mService.appDiedLocked(app, app.pid, app.thread);
requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
- "2nd-crash");
+ "2nd-crash", false);
return false;
}
@@ -1092,7 +1092,7 @@
if (prev != null) {
if (prev.finishing) {
if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev);
- prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE);
+ prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE, false);
} else if (prev.app != null) {
if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev);
if (prev.waitingVisible) {
@@ -1504,7 +1504,7 @@
Slog.d(TAG, "no-history finish of " + last + " on new resume");
}
requestFinishActivityLocked(last.appToken, Activity.RESULT_CANCELED, null,
- "no-history");
+ "no-history", false);
}
}
@@ -1726,7 +1726,7 @@
// activity and try the next one.
Slog.w(TAG, "Exception thrown during resume of " + next, e);
requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
- "resume-exception");
+ "resume-exception", true);
return true;
}
@@ -2080,7 +2080,7 @@
continue;
}
if (finishActivityLocked(p, srcPos,
- Activity.RESULT_CANCELED, null, "reset")) {
+ Activity.RESULT_CANCELED, null, "reset", false)) {
replyChainEnd--;
srcPos--;
}
@@ -2143,7 +2143,7 @@
continue;
}
if (finishActivityLocked(p, srcPos,
- Activity.RESULT_CANCELED, null, "reset")) {
+ Activity.RESULT_CANCELED, null, "reset", false)) {
taskTopI--;
lastReparentPos--;
replyChainEnd--;
@@ -2200,7 +2200,7 @@
}
if (p.intent.getComponent().equals(target.intent.getComponent())) {
if (finishActivityLocked(p, j,
- Activity.RESULT_CANCELED, null, "replace")) {
+ Activity.RESULT_CANCELED, null, "replace", false)) {
taskTopI--;
lastReparentPos--;
}
@@ -2270,7 +2270,7 @@
continue;
}
if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
- null, "clear")) {
+ null, "clear", false)) {
i--;
}
}
@@ -2284,7 +2284,7 @@
int index = indexOfTokenLocked(ret.appToken);
if (index >= 0) {
finishActivityLocked(ret, index, Activity.RESULT_CANCELED,
- null, "clear");
+ null, "clear", false);
}
return null;
}
@@ -2313,7 +2313,7 @@
continue;
}
if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED,
- null, "clear")) {
+ null, "clear", false)) {
i++;
}
}
@@ -2579,6 +2579,7 @@
mDismissKeyguardOnNextActivity = false;
mService.mWindowManager.dismissKeyguard();
}
+ Slog.i(TAG, "DONE STARTING!");
return err;
}
@@ -3319,7 +3320,7 @@
Slog.d(TAG, "no-history finish of " + r);
}
requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
- "no-history");
+ "no-history", false);
} else {
if (DEBUG_STATES) Slog.d(TAG, "Not finishing noHistory " + r
+ " on stop because we're just sleeping");
@@ -3531,7 +3532,7 @@
ActivityRecord r = (ActivityRecord)stops.get(i);
synchronized (mService) {
if (r.finishing) {
- finishCurrentActivityLocked(r, FINISH_IMMEDIATELY);
+ finishCurrentActivityLocked(r, FINISH_IMMEDIATELY, false);
} else {
stopActivityLocked(r);
}
@@ -3585,7 +3586,7 @@
* some reason it is being left as-is.
*/
final boolean requestFinishActivityLocked(IBinder token, int resultCode,
- Intent resultData, String reason) {
+ Intent resultData, String reason, boolean oomAdj) {
int index = indexOfTokenLocked(token);
if (DEBUG_RESULTS || DEBUG_STATES) Slog.v(
TAG, "Finishing activity @" + index + ": token=" + token
@@ -3596,7 +3597,7 @@
}
ActivityRecord r = mHistory.get(index);
- finishActivityLocked(r, index, resultCode, resultData, reason);
+ finishActivityLocked(r, index, resultCode, resultData, reason, oomAdj);
return true;
}
@@ -3613,10 +3614,11 @@
if ((r.resultWho == null && resultWho == null) ||
(r.resultWho != null && r.resultWho.equals(resultWho))) {
finishActivityLocked(r, i,
- Activity.RESULT_CANCELED, null, "request-sub");
+ Activity.RESULT_CANCELED, null, "request-sub", false);
}
}
}
+ mService.updateOomAdjLocked();
}
final boolean finishActivityAffinityLocked(IBinder token) {
@@ -3639,7 +3641,8 @@
if (cur.taskAffinity != null && !cur.taskAffinity.equals(r.taskAffinity)) {
break;
}
- finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null, "request-affinity");
+ finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null,
+ "request-affinity", true);
index--;
}
return true;
@@ -3677,16 +3680,16 @@
* list, or false if it is still in the list and will be removed later.
*/
final boolean finishActivityLocked(ActivityRecord r, int index,
- int resultCode, Intent resultData, String reason) {
- return finishActivityLocked(r, index, resultCode, resultData, reason, false);
+ int resultCode, Intent resultData, String reason, boolean oomAdj) {
+ return finishActivityLocked(r, index, resultCode, resultData, reason, false, oomAdj);
}
/**
* @return Returns true if this activity has been removed from the history
* list, or false if it is still in the list and will be removed later.
*/
- final boolean finishActivityLocked(ActivityRecord r, int index,
- int resultCode, Intent resultData, String reason, boolean immediate) {
+ final boolean finishActivityLocked(ActivityRecord r, int index, int resultCode,
+ Intent resultData, String reason, boolean immediate, boolean oomAdj) {
if (r.finishing) {
Slog.w(TAG, "Duplicate finish request for " + r);
return false;
@@ -3730,7 +3733,7 @@
if (immediate) {
return finishCurrentActivityLocked(r, index,
- FINISH_IMMEDIATELY) == null;
+ FINISH_IMMEDIATELY, oomAdj) == null;
} else if (mResumedActivity == r) {
boolean endTask = index <= 0
|| (mHistory.get(index-1)).task != r.task;
@@ -3754,7 +3757,7 @@
// it is done pausing; else we can just directly finish it here.
if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
return finishCurrentActivityLocked(r, index,
- FINISH_AFTER_PAUSE) == null;
+ FINISH_AFTER_PAUSE, oomAdj) == null;
} else {
if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
}
@@ -3767,17 +3770,17 @@
private static final int FINISH_AFTER_VISIBLE = 2;
private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
- int mode) {
+ int mode, boolean oomAdj) {
final int index = indexOfActivityLocked(r);
if (index < 0) {
return null;
}
- return finishCurrentActivityLocked(r, index, mode);
+ return finishCurrentActivityLocked(r, index, mode, oomAdj);
}
private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,
- int index, int mode) {
+ int index, int mode, boolean oomAdj) {
// First things first: if this activity is currently visible,
// and the resumed activity is not yet visible, then hold off on
// finishing until the resumed one becomes visible.
@@ -3796,7 +3799,9 @@
if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r
+ " (finish requested)");
r.state = ActivityState.STOPPING;
- mService.updateOomAdjLocked();
+ if (oomAdj) {
+ mService.updateOomAdjLocked();
+ }
return r;
}
@@ -3816,7 +3821,8 @@
|| prevState == ActivityState.INITIALIZING) {
// If this activity is already stopped, we can just finish
// it right now.
- boolean activityRemoved = destroyActivityLocked(r, true, true, "finish-imm");
+ boolean activityRemoved = destroyActivityLocked(r, true,
+ oomAdj, "finish-imm");
if (activityRemoved) {
resumeTopActivityLocked(null);
}
@@ -4008,9 +4014,8 @@
ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
}
if (r.app.activities.size() == 0) {
- // No longer have activities, so update location in
- // LRU list.
- mService.updateLruProcessLocked(r.app, oomAdj, false);
+ // No longer have activities, so update oom adj.
+ mService.updateOomAdjLocked();
}
}
diff --git a/services/java/com/android/server/am/ProviderMap.java b/services/java/com/android/server/am/ProviderMap.java
index 2d7167b..9dbf5f5 100644
--- a/services/java/com/android/server/am/ProviderMap.java
+++ b/services/java/com/android/server/am/ProviderMap.java
@@ -18,7 +18,6 @@
import android.content.ComponentName;
import android.os.Binder;
-import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Slog;
@@ -31,8 +30,6 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
/**
* Keeps track of content providers by authority (name) and class. It separates the mapping by
@@ -44,6 +41,8 @@
private static final boolean DBG = false;
+ private final ActivityManagerService mAm;
+
private final HashMap<String, ContentProviderRecord> mSingletonByName
= new HashMap<String, ContentProviderRecord>();
private final HashMap<ComponentName, ContentProviderRecord> mSingletonByClass
@@ -54,6 +53,10 @@
private final SparseArray<HashMap<ComponentName, ContentProviderRecord>> mProvidersByClassPerUser
= new SparseArray<HashMap<ComponentName, ContentProviderRecord>>();
+ ProviderMap(ActivityManagerService am) {
+ mAm = am;
+ }
+
ContentProviderRecord getProviderByName(String name) {
return getProviderByName(name, -1);
}
@@ -217,8 +220,12 @@
}
}
} else {
- didSomething |= collectForceStopProvidersLocked(name, appId, doit, evenPersistent,
- userId, getProvidersByClass(userId), result);
+ HashMap<ComponentName, ContentProviderRecord> items
+ = getProvidersByClass(userId);
+ if (items != null) {
+ didSomething |= collectForceStopProvidersLocked(name, appId, doit,
+ evenPersistent, userId, items, result);
+ }
}
return didSomething;
}
@@ -279,30 +286,33 @@
protected boolean dumpProvider(FileDescriptor fd, PrintWriter pw, String name, String[] args,
int opti, boolean dumpAll) {
+ ArrayList<ContentProviderRecord> allProviders = new ArrayList<ContentProviderRecord>();
ArrayList<ContentProviderRecord> providers = new ArrayList<ContentProviderRecord>();
- if ("all".equals(name)) {
- synchronized (this) {
- for (ContentProviderRecord r1 : getProvidersByClass(-1).values()) {
- providers.add(r1);
- }
- }
- } else {
- ComponentName componentName = name != null
- ? ComponentName.unflattenFromString(name) : null;
- int objectId = 0;
- if (componentName == null) {
- // Not a '/' separated full component name; maybe an object ID?
- try {
- objectId = Integer.parseInt(name, 16);
- name = null;
- componentName = null;
- } catch (RuntimeException e) {
- }
+ synchronized (mAm) {
+ allProviders.addAll(mSingletonByClass.values());
+ for (int i=0; i<mProvidersByClassPerUser.size(); i++) {
+ allProviders.addAll(mProvidersByClassPerUser.valueAt(i).values());
}
- synchronized (this) {
- for (ContentProviderRecord r1 : getProvidersByClass(-1).values()) {
+ if ("all".equals(name)) {
+ providers.addAll(allProviders);
+ } else {
+ ComponentName componentName = name != null
+ ? ComponentName.unflattenFromString(name) : null;
+ int objectId = 0;
+ if (componentName == null) {
+ // Not a '/' separated full component name; maybe an object ID?
+ try {
+ objectId = Integer.parseInt(name, 16);
+ name = null;
+ componentName = null;
+ } catch (RuntimeException e) {
+ }
+ }
+
+ for (int i=0; i<allProviders.size(); i++) {
+ ContentProviderRecord r1 = allProviders.get(i);
if (componentName != null) {
if (r1.name.equals(componentName)) {
providers.add(r1);
@@ -340,7 +350,7 @@
private void dumpProvider(String prefix, FileDescriptor fd, PrintWriter pw,
final ContentProviderRecord r, String[] args, boolean dumpAll) {
String innerPrefix = prefix + " ";
- synchronized (this) {
+ synchronized (mAm) {
pw.print(prefix); pw.print("PROVIDER ");
pw.print(r);
pw.print(" pid=");
diff --git a/services/java/com/android/server/display/DisplayDevice.java b/services/java/com/android/server/display/DisplayDevice.java
index 8eeefb4..f5aa3d4 100644
--- a/services/java/com/android/server/display/DisplayDevice.java
+++ b/services/java/com/android/server/display/DisplayDevice.java
@@ -176,6 +176,12 @@
} else {
viewport.physicalFrame.setEmpty();
}
+
+ boolean isRotated = (mCurrentOrientation == Surface.ROTATION_90
+ || mCurrentOrientation == Surface.ROTATION_270);
+ DisplayDeviceInfo info = getDisplayDeviceInfoLocked();
+ viewport.deviceWidth = isRotated ? info.height : info.width;
+ viewport.deviceHeight = isRotated ? info.width : info.height;
}
/**
diff --git a/services/java/com/android/server/display/DisplayManagerService.java b/services/java/com/android/server/display/DisplayManagerService.java
index e11d454..39f2418 100644
--- a/services/java/com/android/server/display/DisplayManagerService.java
+++ b/services/java/com/android/server/display/DisplayManagerService.java
@@ -352,7 +352,9 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- mWifiDisplayAdapter.requestScanLocked();
+ if (mWifiDisplayAdapter != null) {
+ mWifiDisplayAdapter.requestScanLocked();
+ }
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -372,7 +374,9 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- mWifiDisplayAdapter.requestConnectLocked(address);
+ if (mWifiDisplayAdapter != null) {
+ mWifiDisplayAdapter.requestConnectLocked(address);
+ }
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -389,7 +393,9 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- mWifiDisplayAdapter.requestDisconnectLocked();
+ if (mWifiDisplayAdapter != null) {
+ mWifiDisplayAdapter.requestDisconnectLocked();
+ }
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -406,7 +412,11 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- return mWifiDisplayAdapter.getWifiDisplayStatusLocked();
+ if (mWifiDisplayAdapter != null) {
+ return mWifiDisplayAdapter.getWifiDisplayStatusLocked();
+ } else {
+ return new WifiDisplayStatus();
+ }
}
} finally {
Binder.restoreCallingIdentity(token);
diff --git a/services/java/com/android/server/display/DisplayViewport.java b/services/java/com/android/server/display/DisplayViewport.java
index ed4016d..5080556 100644
--- a/services/java/com/android/server/display/DisplayViewport.java
+++ b/services/java/com/android/server/display/DisplayViewport.java
@@ -44,12 +44,20 @@
// should be scaled or translated after rotation.
public final Rect physicalFrame = new Rect();
+ // The full width and height of the display device, rotated in the same
+ // manner as physicalFrame. This expresses the full native size of the display device.
+ // The physical frame should usually fit within this area.
+ public int deviceWidth;
+ public int deviceHeight;
+
public void copyFrom(DisplayViewport viewport) {
valid = viewport.valid;
displayId = viewport.displayId;
orientation = viewport.orientation;
logicalFrame.set(viewport.logicalFrame);
physicalFrame.set(viewport.physicalFrame);
+ deviceWidth = viewport.deviceWidth;
+ deviceHeight = viewport.deviceHeight;
}
// For debugging purposes.
@@ -60,6 +68,8 @@
+ ", orientation=" + orientation
+ ", logicalFrame=" + logicalFrame
+ ", physicalFrame=" + physicalFrame
+ + ", deviceWidth=" + deviceWidth
+ + ", deviceHeight=" + deviceHeight
+ "}";
}
}
diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java
index b617d00..67691df 100644
--- a/services/java/com/android/server/display/WifiDisplayController.java
+++ b/services/java/com/android/server/display/WifiDisplayController.java
@@ -493,8 +493,13 @@
return; // done
}
- WifiP2pWfdInfo wfdInfo = mConnectedDevice.wfdInfo;
- int port = (wfdInfo != null ? wfdInfo.getControlPort() : DEFAULT_CONTROL_PORT);
+ int port = DEFAULT_CONTROL_PORT;
+ if (mConnectedDevice.deviceName.startsWith("DIRECT-")
+ && mConnectedDevice.deviceName.endsWith("Broadcom")) {
+ // These dongles ignore the port we broadcast in our WFD IE.
+ port = 8554;
+ }
+
final WifiDisplay display = createWifiDisplay(mConnectedDevice);
final String iface = addr.getHostAddress() + ":" + port;
diff --git a/services/java/com/android/server/input/InputManagerService.java b/services/java/com/android/server/input/InputManagerService.java
index 95655a5..805818a 100644
--- a/services/java/com/android/server/input/InputManagerService.java
+++ b/services/java/com/android/server/input/InputManagerService.java
@@ -149,7 +149,8 @@
private static native void nativeSetDisplayViewport(int ptr, boolean external,
int displayId, int rotation,
int logicalLeft, int logicalTop, int logicalRight, int logicalBottom,
- int physicalLeft, int physicalTop, int physicalRight, int physicalBottom);
+ int physicalLeft, int physicalTop, int physicalRight, int physicalBottom,
+ int deviceWidth, int deviceHeight);
private static native int nativeGetScanCodeState(int ptr,
int deviceId, int sourceMask, int scanCode);
@@ -305,7 +306,8 @@
viewport.logicalFrame.left, viewport.logicalFrame.top,
viewport.logicalFrame.right, viewport.logicalFrame.bottom,
viewport.physicalFrame.left, viewport.physicalFrame.top,
- viewport.physicalFrame.right, viewport.physicalFrame.bottom);
+ viewport.physicalFrame.right, viewport.physicalFrame.bottom,
+ viewport.deviceWidth, viewport.deviceHeight);
}
/**
diff --git a/services/java/com/android/server/location/ComprehensiveCountryDetector.java b/services/java/com/android/server/location/ComprehensiveCountryDetector.java
index 1026a0d..354858b 100755
--- a/services/java/com/android/server/location/ComprehensiveCountryDetector.java
+++ b/services/java/com/android/server/location/ComprehensiveCountryDetector.java
@@ -384,8 +384,8 @@
}
protected boolean isAirplaneModeOff() {
- return Settings.System.getInt(
- mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 0;
+ return Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 0;
}
/**
diff --git a/services/java/com/android/server/pm/Installer.java b/services/java/com/android/server/pm/Installer.java
index d4fe3fb..4268ae0 100644
--- a/services/java/com/android/server/pm/Installer.java
+++ b/services/java/com/android/server/pm/Installer.java
@@ -324,20 +324,6 @@
return execute(builder.toString());
}
- /*
- * @param packagePathSuffix The name of the path relative to install
- * directory. Say if the path name is /data/app/com.test-1.apk, the package
- * suffix path will be com.test-1
- */
- public int setForwardLockPerm(String packagePathSuffix, int gid) {
- StringBuilder builder = new StringBuilder("protect");
- builder.append(' ');
- builder.append(packagePathSuffix);
- builder.append(' ');
- builder.append(gid);
- return execute(builder.toString());
- }
-
public int getSizeInfo(String pkgName, int persona, String apkPath, String fwdLockApkPath,
String asecPath, PackageStats pStats) {
StringBuilder builder = new StringBuilder("getsize");
@@ -373,6 +359,14 @@
return execute("movefiles");
}
+ /**
+ * Links the native library directory in an application's directory to its
+ * real location.
+ *
+ * @param dataPath data directory where the application is
+ * @param nativeLibPath target native library path
+ * @return -1 on error
+ */
public int linkNativeLibraryDirectory(String dataPath, String nativeLibPath) {
if (dataPath == null) {
Slog.e(TAG, "unlinkNativeLibraryDirectory dataPath is null");
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index d0f2ed1..b5ae214 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -25,6 +25,11 @@
import static com.android.internal.util.ArrayUtils.appendInt;
import static com.android.internal.util.ArrayUtils.removeInt;
import static libcore.io.OsConstants.S_ISLNK;
+import static libcore.io.OsConstants.S_IRWXU;
+import static libcore.io.OsConstants.S_IRGRP;
+import static libcore.io.OsConstants.S_IXGRP;
+import static libcore.io.OsConstants.S_IROTH;
+import static libcore.io.OsConstants.S_IXOTH;
import com.android.internal.app.IMediaContainerService;
import com.android.internal.app.ResolverActivity;
@@ -147,6 +152,7 @@
import libcore.io.ErrnoException;
import libcore.io.IoUtils;
import libcore.io.Libcore;
+import libcore.io.OsConstants;
import libcore.io.StructStat;
/**
@@ -276,7 +282,7 @@
// This is the object monitoring mDrmAppPrivateInstallDir.
final FileObserver mDrmAppInstallObserver;
- // Used for priviledge escalation. MUST NOT BE CALLED WITH mPackages
+ // Used for privilege escalation. MUST NOT BE CALLED WITH mPackages
// LOCK HELD. Can be called with mInstallLock held.
final Installer mInstaller;
@@ -286,6 +292,12 @@
final File mAppInstallDir;
final File mDalvikCacheDir;
+ /**
+ * Directory to which applications installed internally have native
+ * libraries copied.
+ */
+ private File mAppLibInstallDir;
+
// Directory containing the private parts (e.g. code and non-resource assets) of forward-locked
// apps.
final File mDrmAppPrivateInstallDir;
@@ -1215,6 +1227,7 @@
}
mAppInstallDir = new File(dataDir, "app");
+ mAppLibInstallDir = new File(dataDir, "app-lib");
//look for any incomplete package installations
ArrayList<PackageSetting> deletePkgsList = mSettings.getListOfIncompleteInstallPackagesLPr();
//clean up list
@@ -3607,6 +3620,13 @@
res = resInner;
}
}
+
+ final File nativeLibraryFile = new File(mAppLibInstallDir, packageName);
+ NativeLibraryHelper.removeNativeBinariesFromDirLI(nativeLibraryFile);
+ if (!nativeLibraryFile.delete()) {
+ Slog.w(TAG, "Couldn't delete native library directory " + nativeLibraryFile.getPath());
+ }
+
return res;
}
@@ -4048,9 +4068,7 @@
*/
if (pkg.applicationInfo.nativeLibraryDir == null && pkg.applicationInfo.dataDir != null) {
if (pkgSetting.nativeLibraryPathString == null) {
- final String nativeLibraryPath = new File(dataPath, LIB_DIR_NAME).getPath();
- pkg.applicationInfo.nativeLibraryDir = nativeLibraryPath;
- pkgSetting.nativeLibraryPathString = nativeLibraryPath;
+ setInternalAppNativeLibraryPath(pkg, pkgSetting);
} else {
pkg.applicationInfo.nativeLibraryDir = pkgSetting.nativeLibraryPathString;
}
@@ -4072,7 +4090,7 @@
*/
if (pkg.applicationInfo.nativeLibraryDir != null) {
try {
- final File nativeLibraryDir = new File(pkg.applicationInfo.nativeLibraryDir);
+ File nativeLibraryDir = new File(pkg.applicationInfo.nativeLibraryDir);
final String dataPathString = dataPath.getCanonicalPath();
if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg)) {
@@ -4087,30 +4105,31 @@
Log.i(TAG, "removed obsolete native libraries for system package "
+ path);
}
- } else if (nativeLibraryDir.getParentFile().getCanonicalPath()
- .equals(dataPathString)) {
- /*
- * Make sure the native library dir isn't a symlink to
- * something. If it is, ask installd to remove it and create
- * a directory so we can copy to it afterwards.
- */
- boolean isSymLink;
- try {
- isSymLink = S_ISLNK(Libcore.os.lstat(nativeLibraryDir.getPath()).st_mode);
- } catch (ErrnoException e) {
- // This shouldn't happen, but we'll fail-safe.
- isSymLink = true;
- }
- if (isSymLink) {
- mInstaller.unlinkNativeLibraryDirectory(dataPathString);
+ } else if (!isForwardLocked(pkg) && !isExternal(pkg)) {
+ // Update native library dir if it starts with /data/data
+ if (nativeLibraryDir.getParent().startsWith(dataPathString)) {
+ setInternalAppNativeLibraryPath(pkg, pkgSetting);
+ nativeLibraryDir = new File(pkg.applicationInfo.nativeLibraryDir);
}
- /*
- * If this is an internal application or our
- * nativeLibraryPath points to our data directory, unpack
- * the libraries if necessary.
- */
- NativeLibraryHelper.copyNativeBinariesIfNeededLI(scanFile, nativeLibraryDir);
+ try {
+ if (copyNativeLibrariesForInternalApp(scanFile, nativeLibraryDir) != PackageManager.INSTALL_SUCCEEDED) {
+ Slog.e(TAG, "Unable to copy native libraries");
+ mLastScanError = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ return null;
+ }
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to copy native libraries", e);
+ mLastScanError = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ return null;
+ }
+
+ if (mInstaller.linkNativeLibraryDirectory(dataPathString,
+ pkg.applicationInfo.nativeLibraryDir) == -1) {
+ Slog.e(TAG, "Unable to link native library directory");
+ mLastScanError = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ return null;
+ }
} else {
Slog.i(TAG, "Linking native library dir for " + path);
int ret = mInstaller.linkNativeLibraryDirectory(dataPathString,
@@ -4122,7 +4141,7 @@
}
}
} catch (IOException ioe) {
- Log.e(TAG, "Unable to get canonical file " + ioe.toString());
+ Slog.e(TAG, "Unable to get canonical file " + ioe.toString());
}
}
pkg.mScanPath = path;
@@ -4437,6 +4456,37 @@
return pkg;
}
+ private void setInternalAppNativeLibraryPath(PackageParser.Package pkg,
+ PackageSetting pkgSetting) {
+ final String apkLibPath = getApkName(pkgSetting.codePathString);
+ final String nativeLibraryPath = new File(mAppLibInstallDir, apkLibPath).getPath();
+ pkg.applicationInfo.nativeLibraryDir = nativeLibraryPath;
+ pkgSetting.nativeLibraryPathString = nativeLibraryPath;
+ }
+
+ private static int copyNativeLibrariesForInternalApp(File scanFile, final File nativeLibraryDir)
+ throws IOException {
+ if (!nativeLibraryDir.isDirectory()) {
+ nativeLibraryDir.delete();
+ if (!nativeLibraryDir.mkdir()) {
+ throw new IOException("Cannot create " + nativeLibraryDir.getPath());
+ }
+ try {
+ Libcore.os.chmod(nativeLibraryDir.getPath(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH
+ | S_IXOTH);
+ } catch (ErrnoException e) {
+ throw new IOException("Cannot chmod native library directory "
+ + nativeLibraryDir.getPath(), e);
+ }
+ }
+
+ /*
+ * If this is an internal application or our nativeLibraryPath points to
+ * the app-lib directory, unpack the libraries if necessary.
+ */
+ return NativeLibraryHelper.copyNativeBinariesIfNeededLI(scanFile, nativeLibraryDir);
+ }
+
private void killApplication(String pkgName, int appId) {
// Request the ActivityManager to kill the process(only for existing packages)
// so that we do not end up in a confused state while the user is still using the older
@@ -6737,7 +6787,7 @@
String apkName = getNextCodePath(null, pkgName, ".apk");
codeFileName = new File(installDir, apkName + ".apk").getPath();
resourceFileName = getResourcePathFromCodePath();
- libraryPath = new File(dataDir, LIB_DIR_NAME).getPath();
+ libraryPath = new File(mAppLibInstallDir, pkgName).getPath();
}
boolean checkFreeStorage(IMediaContainerService imcs) throws RemoteException {
@@ -6774,6 +6824,7 @@
installDir = isFwdLocked() ? mDrmAppPrivateInstallDir : mAppInstallDir;
codeFileName = createTempPackageFile(installDir).getPath();
resourceFileName = getResourcePathFromCodePath();
+ libraryPath = getLibraryPathFromCodePath();
created = true;
}
@@ -6828,6 +6879,23 @@
return PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
}
}
+
+ final File nativeLibraryFile = new File(getNativeLibraryPath());
+ Slog.i(TAG, "Copying native libraries to " + nativeLibraryFile.getPath());
+ if (nativeLibraryFile.exists()) {
+ NativeLibraryHelper.removeNativeBinariesFromDirLI(nativeLibraryFile);
+ nativeLibraryFile.delete();
+ }
+ try {
+ int copyRet = copyNativeLibrariesForInternalApp(codeFile, nativeLibraryFile);
+ if (copyRet != PackageManager.INSTALL_SUCCEEDED) {
+ return copyRet;
+ }
+ } catch (IOException e) {
+ Slog.e(TAG, "Copying native libraries failed", e);
+ ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ }
+
return ret;
}
@@ -6845,6 +6913,7 @@
} else {
final File oldCodeFile = new File(getCodePath());
final File oldResourceFile = new File(getResourcePath());
+ final File oldLibraryFile = new File(getNativeLibraryPath());
// Rename APK file based on packageName
final String apkName = getNextCodePath(oldCodePath, pkgName, ".apk");
@@ -6859,7 +6928,20 @@
if (isFwdLocked() && !oldResourceFile.renameTo(newResFile)) {
return false;
}
- resourceFileName = getResourcePathFromCodePath();
+ resourceFileName = newResFile.getPath();
+
+ // Rename library path
+ final File newLibraryFile = new File(getLibraryPathFromCodePath());
+ if (newLibraryFile.exists()) {
+ NativeLibraryHelper.removeNativeBinariesFromDirLI(newLibraryFile);
+ newLibraryFile.delete();
+ }
+ if (!oldLibraryFile.renameTo(newLibraryFile)) {
+ Slog.e(TAG, "Cannot rename native library directory "
+ + oldLibraryFile.getPath() + " to " + newLibraryFile.getPath());
+ return false;
+ }
+ libraryPath = newLibraryFile.getPath();
// Attempt to set permissions
if (!setPermissions()) {
@@ -6910,8 +6992,15 @@
}
}
+ private String getLibraryPathFromCodePath() {
+ return new File(mAppLibInstallDir, getApkName(getCodePath())).getPath();
+ }
+
@Override
String getNativeLibraryPath() {
+ if (libraryPath == null) {
+ libraryPath = getLibraryPathFromCodePath();
+ }
return libraryPath;
}
@@ -6937,6 +7026,15 @@
publicSourceFile.delete();
}
}
+
+ if (libraryPath != null) {
+ File nativeLibraryFile = new File(libraryPath);
+ NativeLibraryHelper.removeNativeBinariesFromDirLI(nativeLibraryFile);
+ if (!nativeLibraryFile.delete()) {
+ Slog.w(TAG, "Couldn't delete native library directory " + libraryPath);
+ }
+ }
+
return ret;
}
@@ -8118,10 +8216,7 @@
// Delete application code and resources
if (deleteCodeAndResources) {
- // TODO can pick up from PackageSettings as well
- int installFlags = isExternal(ps) ? PackageManager.INSTALL_EXTERNAL : 0;
- installFlags |= isForwardLocked(ps) ? PackageManager.INSTALL_FORWARD_LOCK : 0;
- outInfo.args = createInstallArgs(installFlags, ps.codePathString,
+ outInfo.args = createInstallArgs(packageFlagsToInstallFlags(ps), ps.codePathString,
ps.resourcePathString, ps.nativeLibraryPathString);
}
return true;
@@ -9782,31 +9877,26 @@
final String newNativePath = mp.targetArgs
.getNativeLibraryPath();
- try {
- final File newNativeDir = new File(newNativePath);
+ final File newNativeDir = new File(newNativePath);
- final String libParentDir = newNativeDir.getParentFile()
- .getCanonicalPath();
- if (newNativeDir.getParentFile().getCanonicalPath()
- .equals(pkg.applicationInfo.dataDir)) {
- if (mInstaller
- .unlinkNativeLibraryDirectory(pkg.applicationInfo.dataDir) < 0) {
- returnCode = PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE;
- } else {
- NativeLibraryHelper.copyNativeBinariesIfNeededLI(
- new File(newCodePath), newNativeDir);
- }
- } else {
+ if (!isForwardLocked(pkg) && !isExternal(pkg)) {
+ synchronized (mInstallLock) {
if (mInstaller.linkNativeLibraryDirectory(
pkg.applicationInfo.dataDir, newNativePath) < 0) {
returnCode = PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE;
}
}
- } catch (IOException e) {
- returnCode = PackageManager.MOVE_FAILED_INVALID_LOCATION;
+ NativeLibraryHelper.copyNativeBinariesIfNeededLI(new File(
+ newCodePath), newNativeDir);
+ } else {
+ synchronized (mInstallLock) {
+ if (mInstaller.linkNativeLibraryDirectory(
+ pkg.applicationInfo.dataDir, newNativePath) < 0) {
+ returnCode = PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE;
+ }
+ }
}
-
if (returnCode == PackageManager.MOVE_SUCCEEDED) {
pkg.mPath = newCodePath;
// Move dex files around
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index b85353c..b075da3 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -566,6 +566,10 @@
if (p.signatures.mSignatures == null) {
p.signatures.assignSignatures(pkg.mSignatures);
}
+ // Update flags if needed.
+ if (pkg.applicationInfo.flags != p.pkgFlags) {
+ p.pkgFlags = pkg.applicationInfo.flags;
+ }
// If this app defines a shared user id initialize
// the shared user signatures as well.
if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) {
@@ -2616,10 +2620,10 @@
pw.print(" installerPackageName="); pw.println(ps.installerPackageName);
}
pw.print(" signatures="); pw.println(ps.signatures);
- pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed);
- pw.print(" haveGids="); pw.println(ps.haveGids);
- pw.print(" pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags));
- pw.print(" installStatus="); pw.println(ps.installStatus);
+ pw.print(" permissionsFixed="); pw.println(ps.permissionsFixed);
+ pw.print(" haveGids="); pw.println(ps.haveGids);
+ pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
+ pw.print(" installStatus="); pw.println(ps.installStatus);
for (UserInfo user : users) {
pw.print(" User "); pw.print(user.id); pw.print(": ");
pw.print(" installed=");
diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java
index a13c16e..3391668 100644
--- a/services/java/com/android/server/pm/UserManagerService.java
+++ b/services/java/com/android/server/pm/UserManagerService.java
@@ -281,7 +281,7 @@
* cache it elsewhere.
* @return the array of user ids.
*/
- int[] getUserIds() {
+ public int[] getUserIds() {
synchronized (mPackagesLock) {
return mUserIds;
}
diff --git a/services/java/com/android/server/wm/InputMonitor.java b/services/java/com/android/server/wm/InputMonitor.java
index 5ff8a9b..aa18ee4 100644
--- a/services/java/com/android/server/wm/InputMonitor.java
+++ b/services/java/com/android/server/wm/InputMonitor.java
@@ -19,11 +19,13 @@
import com.android.server.input.InputManagerService;
import com.android.server.input.InputApplicationHandle;
import com.android.server.input.InputWindowHandle;
+import com.android.server.wm.WindowManagerService.AllWindowsIterator;
import android.graphics.Rect;
import android.os.RemoteException;
import android.util.Log;
import android.util.Slog;
+import android.view.Display;
import android.view.InputChannel;
import android.view.KeyEvent;
import android.view.WindowManager;
@@ -225,10 +227,11 @@
addInputWindowHandleLw(mService.mFakeWindows.get(i).mWindowHandle);
}
- // TODO(multidisplay): Input only occurs on the default display.
- final WindowList windows = mService.getDefaultWindowList();
- for (int i = windows.size() - 1; i >= 0; i--) {
- final WindowState child = windows.get(i);
+ // Add all windows on the default display.
+ final AllWindowsIterator iterator = mService.new AllWindowsIterator(
+ WindowManagerService.REVERSE_ITERATOR);
+ while (iterator.hasNext()) {
+ final WindowState child = iterator.next();
final InputChannel inputChannel = child.mInputChannel;
final InputWindowHandle inputWindowHandle = child.mInputWindowHandle;
if (inputChannel == null || inputWindowHandle == null || child.mRemoved) {
@@ -243,15 +246,16 @@
final boolean isVisible = child.isVisibleLw();
final boolean hasWallpaper = (child == mService.mWallpaperTarget)
&& (type != WindowManager.LayoutParams.TYPE_KEYGUARD);
+ final boolean onDefaultDisplay = (child.getDisplayId() == Display.DEFAULT_DISPLAY);
// If there's a drag in progress and 'child' is a potential drop target,
// make sure it's been told about the drag
- if (inDrag && isVisible) {
+ if (inDrag && isVisible && onDefaultDisplay) {
mService.mDragState.sendDragStartedIfNeededLw(child);
}
if (universeBackground != null && !addedUniverse
- && child.mBaseLayer < aboveUniverseLayer) {
+ && child.mBaseLayer < aboveUniverseLayer && onDefaultDisplay) {
final WindowState u = universeBackground.mWin;
if (u.mInputChannel != null && u.mInputWindowHandle != null) {
addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags,
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index cdca8bc..17f4a96 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -434,6 +434,7 @@
final float[] mTmpFloats = new float[9];
+ boolean mDisplayReady;
boolean mSafeMode;
boolean mDisplayEnabled = false;
boolean mSystemBooted = false;
@@ -503,8 +504,6 @@
final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>();
final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>();
- Display mDefaultDisplay;
-
boolean mIsTouchDevice;
final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
@@ -2085,7 +2084,7 @@
long origId;
synchronized(mWindowMap) {
- if (mDefaultDisplay == null) {
+ if (!mDisplayReady) {
throw new IllegalStateException("Display has not been initialialized");
}
@@ -5604,8 +5603,10 @@
">>> OPEN TRANSACTION showStrictModeViolation");
Surface.openTransaction();
try {
+ // TODO(multi-display): support multiple displays
if (mStrictModeFlash == null) {
- mStrictModeFlash = new StrictModeFlash(mDefaultDisplay, mFxSession);
+ mStrictModeFlash = new StrictModeFlash(
+ getDefaultDisplayContent().getDisplay(), mFxSession);
}
mStrictModeFlash.setVisibility(on);
} finally {
@@ -5718,7 +5719,7 @@
}
// The screenshot API does not apply the current screen rotation.
- rot = mDefaultDisplay.getRotation();
+ rot = getDefaultDisplayContent().getDisplay().getRotation();
int fw = frame.width();
int fh = frame.height();
@@ -6751,7 +6752,7 @@
}
boolean computeScreenConfigurationLocked(Configuration config) {
- if (mDefaultDisplay == null) {
+ if (!mDisplayReady) {
return false;
}
@@ -6785,13 +6786,8 @@
}
if (config != null) {
- int orientation = Configuration.ORIENTATION_SQUARE;
- if (dw < dh) {
- orientation = Configuration.ORIENTATION_PORTRAIT;
- } else if (dw > dh) {
- orientation = Configuration.ORIENTATION_LANDSCAPE;
- }
- config.orientation = orientation;
+ config.orientation = (dw <= dh) ? Configuration.ORIENTATION_PORTRAIT :
+ Configuration.ORIENTATION_LANDSCAPE;
}
// Update application display metrics.
@@ -6958,9 +6954,12 @@
synchronized (mWindowMap) {
try {
if (mDragState == null) {
+ // TODO(multi-display): support other displays
+ final DisplayContent displayContent = getDefaultDisplayContent();
+ final Display display = displayContent.getDisplay();
Surface surface = new Surface(session, "drag surface",
width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN);
- surface.setLayerStack(mDefaultDisplay.getLayerStack());
+ surface.setLayerStack(display.getLayerStack());
if (SHOW_TRANSACTIONS) Slog.i(TAG, " DRAG "
+ surface + ": CREATE");
outSurface.copyFrom(surface);
@@ -7102,26 +7101,28 @@
}
public void displayReady() {
- WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
- final Display display = wm.getDefaultDisplay();
- displayReady(display.getDisplayId());
+ displayReady(Display.DEFAULT_DISPLAY);
synchronized(mWindowMap) {
- readForcedDisplaySizeAndDensityLocked(getDefaultDisplayContent());
+ final DisplayContent displayContent = getDefaultDisplayContent();
+ final Display display = displayContent.getDisplay();
+ readForcedDisplaySizeAndDensityLocked(displayContent);
- mDefaultDisplay = display;
+ mDisplayReady = true;
mIsTouchDevice = mContext.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_TOUCHSCREEN);
+ PackageManager.FEATURE_TOUCHSCREEN);
mAnimator.initializeLocked(display.getLayerStack());
final DisplayInfo displayInfo = getDefaultDisplayInfo();
- mAnimator.setDisplayDimensions(displayInfo.logicalWidth, displayInfo.logicalHeight,
- displayInfo.appWidth, displayInfo.appHeight);
+ mAnimator.setDisplayDimensions(
+ displayInfo.logicalWidth, displayInfo.logicalHeight,
+ displayInfo.appWidth, displayInfo.appHeight);
- final DisplayContent displayContent = getDefaultDisplayContent();
- mPolicy.setInitialDisplaySize(mDefaultDisplay, displayContent.mInitialDisplayWidth,
- displayContent.mInitialDisplayHeight, displayContent.mInitialDisplayDensity);
+ mPolicy.setInitialDisplaySize(displayContent.getDisplay(),
+ displayContent.mInitialDisplayWidth,
+ displayContent.mInitialDisplayHeight,
+ displayContent.mInitialDisplayDensity);
}
try {
@@ -7802,6 +7803,7 @@
}
// TODO(multidisplay): For now rotations are only main screen.
final DisplayContent displayContent = getDefaultDisplayContent();
+ final Display display = displayContent.getDisplay();
if (displayContent.mBaseDisplayWidth < displayContent.mInitialDisplayWidth
|| displayContent.mBaseDisplayHeight < displayContent.mInitialDisplayHeight) {
int initW, initH, baseW, baseH;
@@ -7829,7 +7831,7 @@
Rect inner = new Rect(0, 0, baseW, baseH);
try {
mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER,
- mDefaultDisplay.getLayerStack());
+ display.getLayerStack());
} catch (Surface.OutOfResourcesException e) {
}
}
@@ -7929,8 +7931,10 @@
private void reconfigureDisplayLocked(DisplayContent displayContent) {
// TODO: Multidisplay: for now only use with default display.
- mPolicy.setInitialDisplaySize(mDefaultDisplay, displayContent.mBaseDisplayWidth,
- displayContent.mBaseDisplayHeight, displayContent.mBaseDisplayDensity);
+ mPolicy.setInitialDisplaySize(displayContent.getDisplay(),
+ displayContent.mBaseDisplayWidth,
+ displayContent.mBaseDisplayHeight,
+ displayContent.mBaseDisplayDensity);
displayContent.layoutNeeded = true;
@@ -8154,7 +8158,7 @@
return;
}
- if (mDefaultDisplay == null) {
+ if (!mDisplayReady) {
// Not yet initialized, nothing to do.
return;
}
@@ -8600,11 +8604,14 @@
Rect dirty = new Rect(0, 0, mNextAppTransitionThumbnail.getWidth(),
mNextAppTransitionThumbnail.getHeight());
try {
+ // TODO(multi-display): support other displays
+ final DisplayContent displayContent = getDefaultDisplayContent();
+ final Display display = displayContent.getDisplay();
Surface surface = new Surface(mFxSession,
"thumbnail anim",
dirty.width(), dirty.height(),
PixelFormat.TRANSLUCENT, Surface.HIDDEN);
- surface.setLayerStack(mDefaultDisplay.getLayerStack());
+ surface.setLayerStack(display.getLayerStack());
topOpeningApp.mAppAnimator.thumbnail = surface;
if (SHOW_TRANSACTIONS) Slog.i(TAG, " THUMBNAIL "
+ surface + ": CREATE");
@@ -9857,7 +9864,7 @@
return;
}
- if (mDefaultDisplay == null || !mPolicy.isScreenOnFully()) {
+ if (!mDisplayReady || !mPolicy.isScreenOnFully()) {
// No need to freeze the screen before the system is ready or if
// the screen is off.
return;
@@ -9889,10 +9896,12 @@
}
// TODO(multidisplay): rotation on main screen only.
- DisplayInfo displayInfo = getDefaultDisplayContent().getDisplayInfo();
+ final DisplayContent displayContent = getDefaultDisplayContent();
+ final Display display = displayContent.getDisplay();
+ final DisplayInfo displayInfo = displayContent.getDisplayInfo();
mAnimator.mScreenRotationAnimation = new ScreenRotationAnimation(mContext,
- mDefaultDisplay, mFxSession, inTransaction, displayInfo.logicalWidth,
- displayInfo.logicalHeight, mDefaultDisplay.getRotation());
+ display, mFxSession, inTransaction, displayInfo.logicalWidth,
+ displayInfo.logicalHeight, display.getRotation());
}
}
@@ -10003,8 +10012,8 @@
if (line != null) {
String[] toks = line.split("%");
if (toks != null && toks.length > 0) {
- mWatermark =
- new Watermark(mDefaultDisplay, mRealDisplayMetrics, mFxSession, toks);
+ mWatermark = new Watermark(getDefaultDisplayContent().getDisplay(),
+ mRealDisplayMetrics, mFxSession, toks);
}
}
} catch (FileNotFoundException e) {
@@ -10372,7 +10381,7 @@
}
}
pw.println();
- if (mDefaultDisplay != null) {
+ if (mDisplayReady) {
DisplayContentsIterator dCIterator = new DisplayContentsIterator();
while (dCIterator.hasNext()) {
dCIterator.next().dump(pw);
@@ -10744,7 +10753,7 @@
}
}
- boolean REVERSE_ITERATOR = true;
+ final static boolean REVERSE_ITERATOR = true;
class AllWindowsIterator implements Iterator<WindowState> {
private DisplayContent mDisplayContent;
private DisplayContentsIterator mDisplayContentsIterator;
@@ -10804,9 +10813,7 @@
}
public DisplayContent getDefaultDisplayContent() {
- final int displayId = mDefaultDisplay == null
- ? Display.DEFAULT_DISPLAY : mDefaultDisplay.getDisplayId();
- return getDisplayContent(displayId);
+ return getDisplayContent(Display.DEFAULT_DISPLAY);
}
public WindowList getDefaultWindowList() {
diff --git a/services/jni/com_android_server_input_InputManagerService.cpp b/services/jni/com_android_server_input_InputManagerService.cpp
index 5e36bf8..319cacd 100644
--- a/services/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/jni/com_android_server_input_InputManagerService.cpp
@@ -993,7 +993,8 @@
static void nativeSetDisplayViewport(JNIEnv* env, jclass clazz, jint ptr, jboolean external,
jint displayId, jint orientation,
jint logicalLeft, jint logicalTop, jint logicalRight, jint logicalBottom,
- jint physicalLeft, jint physicalTop, jint physicalRight, jint physicalBottom) {
+ jint physicalLeft, jint physicalTop, jint physicalRight, jint physicalBottom,
+ jint deviceWidth, jint deviceHeight) {
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
DisplayViewport v;
@@ -1007,6 +1008,8 @@
v.physicalTop = physicalTop;
v.physicalRight = physicalRight;
v.physicalBottom = physicalBottom;
+ v.deviceWidth = deviceWidth;
+ v.deviceHeight = deviceHeight;
im->setDisplayViewport(external, v);
}
@@ -1288,7 +1291,7 @@
(void*) nativeInit },
{ "nativeStart", "(I)V",
(void*) nativeStart },
- { "nativeSetDisplayViewport", "(IZIIIIIIIIII)V",
+ { "nativeSetDisplayViewport", "(IZIIIIIIIIIIII)V",
(void*) nativeSetDisplayViewport },
{ "nativeGetScanCodeState", "(IIII)I",
(void*) nativeGetScanCodeState },
diff --git a/services/jni/com_android_server_input_InputWindowHandle.cpp b/services/jni/com_android_server_input_InputWindowHandle.cpp
index 01fb781..6692994 100644
--- a/services/jni/com_android_server_input_InputWindowHandle.cpp
+++ b/services/jni/com_android_server_input_InputWindowHandle.cpp
@@ -52,6 +52,7 @@
jfieldID ownerPid;
jfieldID ownerUid;
jfieldID inputFeatures;
+ jfieldID displayId;
} gInputWindowHandleClassInfo;
static Mutex gHandleMutex;
@@ -151,6 +152,8 @@
gInputWindowHandleClassInfo.ownerUid);
mInfo->inputFeatures = env->GetIntField(obj,
gInputWindowHandleClassInfo.inputFeatures);
+ mInfo->displayId = env->GetIntField(obj,
+ gInputWindowHandleClassInfo.displayId);
env->DeleteLocalRef(obj);
return true;
@@ -291,6 +294,9 @@
GET_FIELD_ID(gInputWindowHandleClassInfo.inputFeatures, clazz,
"inputFeatures", "I");
+
+ GET_FIELD_ID(gInputWindowHandleClassInfo.displayId, clazz,
+ "displayId", "I");
return 0;
}
diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk
index 482f43e..d9b0681 100644
--- a/tools/aapt/Android.mk
+++ b/tools/aapt/Android.mk
@@ -34,7 +34,6 @@
endif
-LOCAL_C_INCLUDES += external/expat/lib
LOCAL_C_INCLUDES += external/libpng
LOCAL_C_INCLUDES += external/zlib
LOCAL_C_INCLUDES += build/libs/host/include
diff --git a/tools/aapt/StringPool.h b/tools/aapt/StringPool.h
index d501008..16050b2 100644
--- a/tools/aapt/StringPool.h
+++ b/tools/aapt/StringPool.h
@@ -21,7 +21,7 @@
#include <ctype.h>
#include <errno.h>
-#include <expat.h>
+#include <libexpat/expat.h>
using namespace android;
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
index 117af82..863a055 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
@@ -124,7 +124,8 @@
"name='(.*)' " +
"config_methods=(0x[0-9a-fA-F]+) " +
"dev_capab=(0x[0-9a-fA-F]+) " +
- "group_capab=(0x[0-9a-fA-F]+)"
+ "group_capab=(0x[0-9a-fA-F]+)" +
+ "( wfd_dev_info=0x000006([0-9a-fA-F]{12}))?"
);
/** 2 token device address pattern
@@ -153,7 +154,7 @@
* @param string formats supported include
* P2P-DEVICE-FOUND fa:7b:7a:42:02:13 p2p_dev_addr=fa:7b:7a:42:02:13
* pri_dev_type=1-0050F204-1 name='p2p-TEST1' config_methods=0x188 dev_capab=0x27
- * group_capab=0x0
+ * group_capab=0x0 wfd_dev_info=000006015d022a0032
*
* P2P-DEVICE-LOST p2p_dev_addr=fa:7b:7a:42:02:13
*
@@ -205,6 +206,12 @@
wpsConfigMethodsSupported = parseHex(match.group(6));
deviceCapability = parseHex(match.group(7));
groupCapability = parseHex(match.group(8));
+ if (match.group(9) != null) {
+ String str = match.group(10);
+ wfdInfo = new WifiP2pWfdInfo(parseHex(str.substring(0,4)),
+ parseHex(str.substring(4,8)),
+ parseHex(str.substring(8,12)));
+ }
break;
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
index 48cdbc2..2093bda 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
@@ -35,10 +35,9 @@
*/
public class WifiP2pDeviceList implements Parcelable {
- private HashMap<String, WifiP2pDevice> mDevices;
+ private final HashMap<String, WifiP2pDevice> mDevices = new HashMap<String, WifiP2pDevice>();
public WifiP2pDeviceList() {
- mDevices = new HashMap<String, WifiP2pDevice>();
}
/** copy constructor */
@@ -52,7 +51,6 @@
/** @hide */
public WifiP2pDeviceList(ArrayList<WifiP2pDevice> devices) {
- mDevices = new HashMap<String, WifiP2pDevice>();
for (WifiP2pDevice device : devices) {
if (device.deviceAddress != null) {
mDevices.put(device.deviceAddress, device);
@@ -78,6 +76,7 @@
d.wpsConfigMethodsSupported = device.wpsConfigMethodsSupported;
d.deviceCapability = device.deviceCapability;
d.groupCapability = device.groupCapability;
+ d.wfdInfo = device.wfdInfo;
return;
}
//Not found, add a new one
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.java b/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.java
index 3459a5a..98f0972 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.java
@@ -16,6 +16,7 @@
package android.net.wifi.p2p;
import java.util.Collection;
+import java.util.Map;
import android.os.Parcel;
import android.os.Parcelable;
@@ -32,8 +33,9 @@
private static final int CREDENTIAL_MAX_NUM = 32;
- private LruCache<Integer, WifiP2pGroup> mGroups;
- private GroupDeleteListener mListener;
+ private final LruCache<Integer, WifiP2pGroup> mGroups;
+ private final GroupDeleteListener mListener;
+
private boolean isClearCalled = false;
public interface GroupDeleteListener {
@@ -41,10 +43,10 @@
}
WifiP2pGroupList() {
- this(null);
+ this(null, null);
}
- WifiP2pGroupList(GroupDeleteListener listener) {
+ WifiP2pGroupList(WifiP2pGroupList source, GroupDeleteListener listener) {
mListener = listener;
mGroups = new LruCache<Integer, WifiP2pGroup>(CREDENTIAL_MAX_NUM) {
@Override
@@ -55,6 +57,12 @@
}
}
};
+
+ if (source != null) {
+ for (Map.Entry<Integer, WifiP2pGroup> item : source.mGroups.snapshot().entrySet()) {
+ mGroups.put(item.getKey(), item.getValue());
+ }
+ }
}
/**
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
index a6770bd..3575d97 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
@@ -359,8 +359,8 @@
private WifiNative mWifiNative = new WifiNative(mInterface);
private WifiMonitor mWifiMonitor = new WifiMonitor(this, mWifiNative);
- private WifiP2pDeviceList mPeers = new WifiP2pDeviceList();
- private WifiP2pGroupList mGroups = new WifiP2pGroupList(
+ private final WifiP2pDeviceList mPeers = new WifiP2pDeviceList();
+ private final WifiP2pGroupList mGroups = new WifiP2pGroupList(null,
new GroupDeleteListener() {
@Override
public void onDeleteGroup(int netId) {
@@ -370,7 +370,7 @@
sendP2pPersistentGroupsChangedBroadcast();
}
});
- private WifiP2pInfo mWifiP2pInfo = new WifiP2pInfo();
+ private final WifiP2pInfo mWifiP2pInfo = new WifiP2pInfo();
private WifiP2pGroup mGroup;
// Saved WifiP2pConfig for a peer connection
@@ -501,17 +501,20 @@
WifiP2pManager.BUSY);
break;
case WifiP2pManager.REQUEST_PEERS:
- replyToMessage(message, WifiP2pManager.RESPONSE_PEERS, mPeers);
+ replyToMessage(message, WifiP2pManager.RESPONSE_PEERS,
+ new WifiP2pDeviceList(mPeers));
break;
case WifiP2pManager.REQUEST_CONNECTION_INFO:
- replyToMessage(message, WifiP2pManager.RESPONSE_CONNECTION_INFO, mWifiP2pInfo);
+ replyToMessage(message, WifiP2pManager.RESPONSE_CONNECTION_INFO,
+ new WifiP2pInfo(mWifiP2pInfo));
break;
case WifiP2pManager.REQUEST_GROUP_INFO:
- replyToMessage(message, WifiP2pManager.RESPONSE_GROUP_INFO, mGroup);
+ replyToMessage(message, WifiP2pManager.RESPONSE_GROUP_INFO,
+ mGroup != null ? new WifiP2pGroup(mGroup) : null);
break;
case WifiP2pManager.REQUEST_PERSISTENT_GROUP_INFO:
replyToMessage(message, WifiP2pManager.RESPONSE_PERSISTENT_GROUP_INFO,
- mGroups);
+ new WifiP2pGroupList(mGroups, null));
break;
case WifiP2pManager.SET_DIALOG_LISTENER:
String appPkgName = (String)message.getData().getString(
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java b/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
index 9dd3e4a..b6bbfc4 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
@@ -54,6 +54,13 @@
public WifiP2pWfdInfo() {
}
+ public WifiP2pWfdInfo(int devInfo, int ctrlPort, int maxTput) {
+ mWfdEnabled = true;
+ mDeviceInfo = devInfo;
+ mCtrlPort = ctrlPort;
+ mMaxThroughput = maxTput;
+ }
+
public boolean isWfdEnabled() {
return mWfdEnabled;
}