Merge "MtpDatabase: Fix typo affecting parent and format queries" into jb-mr1-dev
diff --git a/api/current.txt b/api/current.txt
index c1d8c9e..1e3e2bb 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -10217,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);
}
@@ -10229,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();
@@ -26697,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/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/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/Settings.java b/core/java/android/provider/Settings.java
index 841a076..1739205 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -739,6 +739,7 @@
try {
Bundle arg = new Bundle();
arg.putString(Settings.NameValueTable.VALUE, value);
+ arg.putInt(CALL_METHOD_USER_KEY, userHandle);
IContentProvider cp = lazyGetProvider(cr);
cp.call(mCallSetCommand, name, arg);
} catch (RemoteException e) {
diff --git a/core/java/android/service/dreams/DreamManagerService.java b/core/java/android/service/dreams/DreamManagerService.java
index 2cec6c3..4aa1cbb 100644
--- a/core/java/android/service/dreams/DreamManagerService.java
+++ b/core/java/android/service/dreams/DreamManagerService.java
@@ -5,15 +5,18 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import android.app.ActivityManagerNative;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
-import android.os.ServiceManager;
+import android.os.UserHandle;
import android.provider.Settings;
import android.util.Slog;
import android.view.IWindowManager;
@@ -41,6 +44,7 @@
private ComponentName mCurrentDreamComponent;
private IDreamService mCurrentDream;
private Binder mCurrentDreamToken;
+ private int mCurrentUserId;
public DreamManagerService(Context context) {
if (DEBUG) Slog.v(TAG, "DreamManagerService startup");
@@ -58,7 +62,7 @@
// IDreamManager method
@Override
public void dream() {
- ComponentName[] dreams = getDreamComponents();
+ ComponentName[] dreams = getDreamComponentsForUser(mCurrentUserId);
ComponentName name = dreams != null && dreams.length > 0 ? dreams[0] : null;
if (name != null) {
synchronized (mLock) {
@@ -75,9 +79,10 @@
// IDreamManager method
@Override
public void setDreamComponents(ComponentName[] componentNames) {
- Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.putStringForUser(mContext.getContentResolver(),
SCREENSAVER_COMPONENTS,
- componentsToString(componentNames));
+ componentsToString(componentNames),
+ UserHandle.getCallingUserId());
}
private static String componentsToString(ComponentName[] componentNames) {
@@ -103,15 +108,22 @@
// IDreamManager method
@Override
public ComponentName[] getDreamComponents() {
- // TODO(dsandler) don't load this every time, watch the value
- String names = Settings.Secure.getString(mContext.getContentResolver(), SCREENSAVER_COMPONENTS);
+ return getDreamComponentsForUser(UserHandle.getCallingUserId());
+ }
+
+ private ComponentName[] getDreamComponentsForUser(int userId) {
+ String names = Settings.Secure.getStringForUser(mContext.getContentResolver(),
+ SCREENSAVER_COMPONENTS,
+ userId);
return names == null ? null : componentsFromString(names);
}
// IDreamManager method
@Override
public ComponentName getDefaultDreamComponent() {
- String name = Settings.Secure.getString(mContext.getContentResolver(), SCREENSAVER_DEFAULT_COMPONENT);
+ String name = Settings.Secure.getStringForUser(mContext.getContentResolver(),
+ SCREENSAVER_DEFAULT_COMPONENT,
+ UserHandle.getCallingUserId());
return name == null ? null : ComponentName.unflattenFromString(name);
}
@@ -210,6 +222,25 @@
}
public void systemReady() {
+
+ // dream settings are kept per user, so keep track of current user
+ try {
+ mCurrentUserId = ActivityManagerNative.getDefault().getCurrentUser().id;
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Couldn't get current user ID; guessing it's 0", e);
+ }
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ mContext.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_USER_SWITCHED.equals(action)) {
+ mCurrentUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
+ if (DEBUG) Slog.v(TAG, "userId " + mCurrentUserId + " is in the house");
+ }
+ }}, filter);
+
if (DEBUG) Slog.v(TAG, "ready to dream!");
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index b9f3942..dae5c0a 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -107,6 +107,9 @@
IBinder freezeThisOneIfNeeded);
void setNewConfiguration(in Configuration config);
+ void startFreezingScreen(int exitAnim, int enterAnim);
+ void stopFreezingScreen();
+
// these require DISABLE_KEYGUARD permission
void disableKeyguard(IBinder token, String tag);
void reenableKeyguard(IBinder token);
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/animation/RotateAnimation.java b/core/java/android/view/animation/RotateAnimation.java
index 67e0374..3c325d9 100644
--- a/core/java/android/view/animation/RotateAnimation.java
+++ b/core/java/android/view/animation/RotateAnimation.java
@@ -22,7 +22,7 @@
/**
* An animation that controls the rotation of an object. This rotation takes
- * place int the X-Y plane. You can specify the point to use for the center of
+ * place in the X-Y plane. You can specify the point to use for the center of
* the rotation, where (0,0) is the top left point. If not specified, (0,0) is
* the default rotation point.
*
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/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 6074a0c..9e4ec3c 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -89,8 +89,19 @@
// Is this frame the main frame?
private boolean mIsMainFrame;
+ // Javascript interface object
+ private class JSObject {
+ Object object;
+ boolean requireAnnotation;
+
+ public JSObject(Object object, boolean requireAnnotation) {
+ this.object = object;
+ this.requireAnnotation = requireAnnotation;
+ }
+ }
+
// Attached Javascript interfaces
- private Map<String, Object> mJavaScriptObjects;
+ private Map<String, JSObject> mJavaScriptObjects;
private Set<Object> mRemovedJavaScriptObjects;
// Key store handler when Chromium HTTP stack is used.
@@ -234,10 +245,8 @@
}
sConfigCallback.addHandler(this);
- mJavaScriptObjects = javascriptInterfaces;
- if (mJavaScriptObjects == null) {
- mJavaScriptObjects = new HashMap<String, Object>();
- }
+ mJavaScriptObjects = new HashMap<String, JSObject>();
+ addJavaScriptObjects(javascriptInterfaces);
mRemovedJavaScriptObjects = new HashSet<Object>();
mSettings = settings;
@@ -590,15 +599,36 @@
Iterator<String> iter = mJavaScriptObjects.keySet().iterator();
while (iter.hasNext()) {
String interfaceName = iter.next();
- Object object = mJavaScriptObjects.get(interfaceName);
- if (object != null) {
+ JSObject jsobject = mJavaScriptObjects.get(interfaceName);
+ if (jsobject != null && jsobject.object != null) {
nativeAddJavascriptInterface(nativeFramePointer,
- mJavaScriptObjects.get(interfaceName), interfaceName);
+ jsobject.object, interfaceName, jsobject.requireAnnotation);
}
}
mRemovedJavaScriptObjects.clear();
}
+ /*
+ * Add javascript objects to the internal list of objects. The default behavior
+ * is to allow access to inherited methods (no annotation needed). This is only
+ * used when js objects are passed through a constructor (via a hidden constructor).
+ *
+ * @TODO change the default behavior to be compatible with the public addjavascriptinterface
+ */
+ private void addJavaScriptObjects(Map<String, Object> javascriptInterfaces) {
+
+ // TODO in a separate CL provide logic to enable annotations for API level JB_MR1 and above.
+ if (javascriptInterfaces == null) return;
+ Iterator<String> iter = javascriptInterfaces.keySet().iterator();
+ while (iter.hasNext()) {
+ String interfaceName = iter.next();
+ Object object = javascriptInterfaces.get(interfaceName);
+ if (object != null) {
+ mJavaScriptObjects.put(interfaceName, new JSObject(object, false));
+ }
+ }
+ }
+
/**
* This method is called by WebCore to check whether application
* wants to hijack url loading
@@ -616,11 +646,11 @@
}
}
- public void addJavascriptInterface(Object obj, String interfaceName) {
+ public void addJavascriptInterface(Object obj, String interfaceName,
+ boolean requireAnnotation) {
assert obj != null;
removeJavascriptInterface(interfaceName);
-
- mJavaScriptObjects.put(interfaceName, obj);
+ mJavaScriptObjects.put(interfaceName, new JSObject(obj, requireAnnotation));
}
public void removeJavascriptInterface(String interfaceName) {
@@ -1245,7 +1275,7 @@
* Add a javascript interface to the main frame.
*/
private native void nativeAddJavascriptInterface(int nativeFramePointer,
- Object obj, String interfaceName);
+ Object obj, String interfaceName, boolean requireAnnotation);
public native void clearCache();
diff --git a/core/java/android/webkit/JavascriptInterface.java b/core/java/android/webkit/JavascriptInterface.java
new file mode 100644
index 0000000..3f1ed12
--- /dev/null
+++ b/core/java/android/webkit/JavascriptInterface.java
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+package android.webkit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation that allows exposing methods to JavaScript. Starting from API level
+ * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} and above, only methods explicitly
+ * marked with this annotation are available to the Javascript code. See
+ * {@link android.webkit.Webview#addJavaScriptInterface} for more information about it.
+ *
+ * @hide
+ */
+@SuppressWarnings("javadoc")
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface JavascriptInterface {
+}
\ No newline at end of file
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 82635d7..9d6d929 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -26,6 +26,7 @@
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.http.SslCertificate;
+import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.os.Message;
@@ -1507,6 +1508,9 @@
public void addJavascriptInterface(Object object, String name) {
checkThread();
mProvider.addJavascriptInterface(object, name);
+ // TODO in a separate CL provide logic to enable annotations for API level JB_MR1 and above. Don't forget to
+ // update the doc, set a link to annotation and unhide the annotation.
+ // also describe that fields of java objects are not accessible from JS.
}
/**
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index 9334036..351c4f3 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();
}
}
@@ -4125,12 +4114,15 @@
*/
@Override
public void addJavascriptInterface(Object object, String name) {
+
if (object == null) {
return;
}
WebViewCore.JSInterfaceData arg = new WebViewCore.JSInterfaceData();
+ // TODO in a separate CL provide logic to enable annotations for API level JB_MR1 and above.
arg.mObject = object;
arg.mInterfaceName = name;
+ arg.mRequireAnnotation = false;
mWebViewCore.sendMessage(EventHub.ADD_JS_INTERFACE, arg);
}
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 59036e7..2d834ff 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -824,6 +824,7 @@
static class JSInterfaceData {
Object mObject;
String mInterfaceName;
+ boolean mRequireAnnotation;
}
static class JSKeyData {
@@ -1489,7 +1490,7 @@
case ADD_JS_INTERFACE:
JSInterfaceData jsData = (JSInterfaceData) msg.obj;
mBrowserFrame.addJavascriptInterface(jsData.mObject,
- jsData.mInterfaceName);
+ jsData.mInterfaceName, jsData.mRequireAnnotation);
break;
case REMOVE_JS_INTERFACE:
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/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 560021d..012be3e 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1265,6 +1265,13 @@
android:description="@string/permdesc_manageAppTokens"
android:protectionLevel="signature" />
+ <!-- @hide Allows the application to temporarily freeze the screen for a
+ full-screen transition. -->
+ <permission android:name="android.permission.FREEZE_SCREEN"
+ android:label="@string/permlab_freezeScreen"
+ android:description="@string/permdesc_freezeScreen"
+ android:protectionLevel="signature" />
+
<!-- Allows an application to inject user events (keys, touch, trackball)
into the event stream and deliver them to ANY window. Without this
permission, you can only deliver events to windows in your own process.
diff --git a/core/res/res/anim/screen_user_enter.xml b/core/res/res/anim/screen_user_enter.xml
new file mode 100644
index 0000000..a73dea3
--- /dev/null
+++ b/core/res/res/anim/screen_user_enter.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* Copyright 20012, 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <translate android:fromXDelta="100%p" android:toXDelta="0"
+ android:duration="500"
+ android:interpolator="@interpolator/decelerate_quad" />
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:duration="500"
+ android:interpolator="@interpolator/decelerate_quad" />
+</set>
diff --git a/core/res/res/anim/screen_user_exit.xml b/core/res/res/anim/screen_user_exit.xml
new file mode 100644
index 0000000..ec94b76
--- /dev/null
+++ b/core/res/res/anim/screen_user_exit.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* Copyright 20012, 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <translate android:fromXDelta="0" android:toXDelta="-100%p"
+ android:duration="500"
+ android:interpolator="@interpolator/decelerate_quad" />
+ <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
+ android:duration="500"
+ android:interpolator="@interpolator/decelerate_quad" />
+</set>
diff --git a/core/res/res/anim-port/task_close_enter.xml b/core/res/res/anim/task_close_enter.xml
similarity index 100%
rename from core/res/res/anim-port/task_close_enter.xml
rename to core/res/res/anim/task_close_enter.xml
diff --git a/core/res/res/anim-port/task_close_exit.xml b/core/res/res/anim/task_close_exit.xml
similarity index 100%
rename from core/res/res/anim-port/task_close_exit.xml
rename to core/res/res/anim/task_close_exit.xml
diff --git a/core/res/res/anim-port/task_open_enter.xml b/core/res/res/anim/task_open_enter.xml
similarity index 100%
rename from core/res/res/anim-port/task_open_enter.xml
rename to core/res/res/anim/task_open_enter.xml
diff --git a/core/res/res/anim-port/task_open_exit.xml b/core/res/res/anim/task_open_exit.xml
similarity index 100%
rename from core/res/res/anim-port/task_open_exit.xml
rename to core/res/res/anim/task_open_exit.xml
diff --git a/core/res/res/layout-land/keyguard_host_view.xml b/core/res/res/layout-land/keyguard_host_view.xml
index 0028a54..8e7c232 100644
--- a/core/res/res/layout-land/keyguard_host_view.xml
+++ b/core/res/res/layout-land/keyguard_host_view.xml
@@ -38,7 +38,7 @@
</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
- <ViewFlipper
+ <com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper
android:id="@+id/view_flipper"
android:layout_width="0dip"
android:layout_height="match_parent"
@@ -48,6 +48,6 @@
<!-- SelectorView is always used, so add it here. The rest are loaded dynamically -->
<include layout="@layout/keyguard_selector_view"/>
- </ViewFlipper>
+ </com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper>
</com.android.internal.policy.impl.keyguard.KeyguardHostView>
diff --git a/core/res/res/layout-port/keyguard_host_view.xml b/core/res/res/layout-port/keyguard_host_view.xml
index 5e467d1..55c4c0d 100644
--- a/core/res/res/layout-port/keyguard_host_view.xml
+++ b/core/res/res/layout-port/keyguard_host_view.xml
@@ -28,7 +28,7 @@
android:gravity="center_horizontal"
android:clipChildren="false">
- <ViewFlipper
+ <com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper
android:id="@+id/view_flipper"
android:layout_height="match_parent"
android:gravity="center">
@@ -36,7 +36,7 @@
<!-- SelectorView is always used, so add it here. The rest are loaded dynamically -->
<include layout="@layout/keyguard_selector_view"/>
- </ViewFlipper>
+ </com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper>
</com.android.internal.policy.impl.keyguard.KeyguardHostView>
diff --git a/core/res/res/layout-sw600dp-land/keyguard_host_view.xml b/core/res/res/layout-sw600dp-land/keyguard_host_view.xml
index 5b6bb2f..652bdde 100644
--- a/core/res/res/layout-sw600dp-land/keyguard_host_view.xml
+++ b/core/res/res/layout-sw600dp-land/keyguard_host_view.xml
@@ -44,7 +44,7 @@
android:layout_weight="1"
android:gravity="center">
- <ViewFlipper
+ <com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper
android:id="@+id/view_flipper"
android:layout_width="@dimen/kg_security_view_width"
android:layout_height="match_parent"
@@ -55,7 +55,7 @@
<!-- SelectorView is always used, so add it here. The rest are loaded dynamically -->
<include layout="@layout/keyguard_selector_view"/>
- </ViewFlipper>
+ </com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper>
</FrameLayout>
diff --git a/core/res/res/layout-sw600dp-port/keyguard_host_view.xml b/core/res/res/layout-sw600dp-port/keyguard_host_view.xml
index 397b881..0c1dd0c 100644
--- a/core/res/res/layout-sw600dp-port/keyguard_host_view.xml
+++ b/core/res/res/layout-sw600dp-port/keyguard_host_view.xml
@@ -40,7 +40,7 @@
</com.android.internal.policy.impl.keyguard.KeyguardWidgetPager>
- <ViewFlipper
+ <com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper
android:id="@+id/view_flipper"
android:layout_width="@dimen/kg_security_view_width"
android:layout_height="0dip"
@@ -50,7 +50,7 @@
<!-- SelectorView is always used, so add it here. The rest are loaded dynamically -->
<include layout="@layout/keyguard_selector_view"/>
- </ViewFlipper>
+ </com.android.internal.policy.impl.keyguard.KeyguardSecurityViewFlipper>
</com.android.internal.policy.impl.keyguard.KeyguardHostView>
diff --git a/core/res/res/layout/keyguard_pattern_view.xml b/core/res/res/layout/keyguard_pattern_view.xml
index 954a92c..356bce3 100644
--- a/core/res/res/layout/keyguard_pattern_view.xml
+++ b/core/res/res/layout/keyguard_pattern_view.xml
@@ -23,42 +23,36 @@
<com.android.internal.policy.impl.keyguard.KeyguardPatternView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyguard_pattern_view"
+ android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal">
- <GridLayout
- android:orientation="vertical"
+ <include layout="@layout/keyguard_navigation"/>
+
+ <Space android:layout_gravity="fill" />
+
+ <Button android:id="@+id/forgot_password_button"
+ android:layout_gravity="right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="@*android:dimen/keyguard_lockscreen_status_line_font_size"
+ android:drawableLeft="@*android:drawable/lockscreen_forgot_password_button"
+ android:drawablePadding="0dip"
+ android:visibility="gone"/>
+
+ <!-- We need MATCH_PARENT here only to force the size of the parent to be passed to
+ the pattern view for it to compute its size. This is an unusual case, caused by
+ LockPatternView's requirement to maintain a square aspect ratio based on the width
+ of the screen. -->
+ <com.android.internal.widget.LockPatternView
+ android:id="@+id/lockPatternView"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="center_horizontal">
-
- <include layout="@layout/keyguard_navigation"/>
-
- <Space android:layout_gravity="fill" />
-
- <Button android:id="@+id/forgot_password_button"
- android:layout_gravity="right"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@*android:dimen/keyguard_lockscreen_status_line_font_size"
- android:drawableLeft="@*android:drawable/lockscreen_forgot_password_button"
- android:drawablePadding="0dip"
- android:visibility="gone"/>
-
- <!-- We need MATCH_PARENT here only to force the size of the parent to be passed to
- the pattern view for it to compute its size. This is an unusual case, caused by
- LockPatternView's requirement to maintain a square aspect ratio based on the width
- of the screen. -->
- <com.android.internal.widget.LockPatternView
- android:id="@+id/lockPatternView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginEnd="8dip"
- android:layout_marginBottom="4dip"
- android:layout_marginStart="8dip"
- android:layout_gravity="center_horizontal"
- />
-
- </GridLayout>
+ android:layout_marginEnd="8dip"
+ android:layout_marginBottom="4dip"
+ android:layout_marginStart="8dip"
+ android:layout_gravity="center_horizontal"
+ />
</com.android.internal.policy.impl.keyguard.KeyguardPatternView>
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/res/res/values/public.xml b/core/res/res/values/public.xml
index 139715c..3101cde 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
<!-- This file defines the base public resources exported by the
platform, which must always exist. -->
@@ -19,1776 +20,6 @@
*************************************************************** -->
<resources>
- <!-- We don't want to publish private symbols in android.R as part of the
- SDK. Instead, put them here. -->
- <private-symbols package="com.android.internal" />
-
- <!-- Private symbols that we need to reference from framework code. See
- frameworks/base/core/res/MakeJavaSymbols.sed for how to easily generate
- this.
- -->
- <java-symbol type="id" name="account_name" />
- <java-symbol type="id" name="account_row_icon" />
- <java-symbol type="id" name="account_row_text" />
- <java-symbol type="id" name="account_type" />
- <java-symbol type="id" name="action_bar" />
- <java-symbol type="id" name="action_bar_container" />
- <java-symbol type="id" name="action_bar_overlay_layout" />
- <java-symbol type="id" name="action_bar_title" />
- <java-symbol type="id" name="action_bar_subtitle" />
- <java-symbol type="id" name="action_context_bar" />
- <java-symbol type="id" name="action_menu_presenter" />
- <java-symbol type="id" name="action_mode_close_button" />
- <java-symbol type="id" name="activity_chooser_view_content" />
- <java-symbol type="id" name="albumart" />
- <java-symbol type="id" name="alertTitle" />
- <java-symbol type="id" name="allow_button" />
- <java-symbol type="id" name="alwaysUse" />
- <java-symbol type="id" name="amPm" />
- <java-symbol type="id" name="authtoken_type" />
- <java-symbol type="id" name="back_button" />
- <java-symbol type="id" name="btn_next" />
- <java-symbol type="id" name="btn_play" />
- <java-symbol type="id" name="btn_prev" />
- <java-symbol type="id" name="button_bar" />
- <java-symbol type="id" name="buttonPanel" />
- <java-symbol type="id" name="by_common" />
- <java-symbol type="id" name="by_org" />
- <java-symbol type="id" name="by_org_unit" />
- <java-symbol type="id" name="calendar_view" />
- <java-symbol type="id" name="cancel" />
- <java-symbol type="id" name="characterPicker" />
- <java-symbol type="id" name="clearDefaultHint" />
- <java-symbol type="id" name="contentPanel" />
- <java-symbol type="id" name="customPanel" />
- <java-symbol type="id" name="datePicker" />
- <java-symbol type="id" name="day" />
- <java-symbol type="id" name="day_names" />
- <java-symbol type="id" name="decrement" />
- <java-symbol type="id" name="default_activity_button" />
- <java-symbol type="id" name="deny_button" />
- <java-symbol type="id" name="description" />
- <java-symbol type="id" name="divider" />
- <java-symbol type="id" name="edit_query" />
- <java-symbol type="id" name="edittext_container" />
- <java-symbol type="id" name="enter_pin_section" />
- <java-symbol type="id" name="expand_activities_button" />
- <java-symbol type="id" name="expand_button" />
- <java-symbol type="id" name="expand_button_divider" />
- <java-symbol type="id" name="expires_on" />
- <java-symbol type="id" name="find_next" />
- <java-symbol type="id" name="find_prev" />
- <java-symbol type="id" name="ffwd" />
- <java-symbol type="id" name="fillInIntent" />
- <java-symbol type="id" name="find" />
- <java-symbol type="id" name="fullscreenArea" />
- <java-symbol type="id" name="hard_keyboard_section" />
- <java-symbol type="id" name="hard_keyboard_switch" />
- <java-symbol type="id" name="headers" />
- <java-symbol type="id" name="hour" />
- <java-symbol type="id" name="icon" />
- <java-symbol type="id" name="image" />
- <java-symbol type="id" name="increment" />
- <java-symbol type="id" name="internalEmpty" />
- <java-symbol type="id" name="info" />
- <java-symbol type="id" name="inputExtractAccessories" />
- <java-symbol type="id" name="inputExtractAction" />
- <java-symbol type="id" name="inputExtractEditButton" />
- <java-symbol type="id" name="issued_on" />
- <java-symbol type="id" name="left_icon" />
- <java-symbol type="id" name="leftSpacer" />
- <java-symbol type="id" name="line1" />
- <java-symbol type="id" name="line3" />
- <java-symbol type="id" name="list_footer" />
- <java-symbol type="id" name="list_item" />
- <java-symbol type="id" name="listContainer" />
- <java-symbol type="id" name="locale" />
- <java-symbol type="id" name="matches" />
- <java-symbol type="id" name="mediacontroller_progress" />
- <java-symbol type="id" name="minute" />
- <java-symbol type="id" name="mode_normal" />
- <java-symbol type="id" name="month" />
- <java-symbol type="id" name="month_name" />
- <java-symbol type="id" name="name" />
- <java-symbol type="id" name="next" />
- <java-symbol type="id" name="next_button" />
- <java-symbol type="id" name="new_app_action" />
- <java-symbol type="id" name="new_app_description" />
- <java-symbol type="id" name="new_app_icon" />
- <java-symbol type="id" name="no_permissions" />
- <java-symbol type="id" name="numberpicker_input" />
- <java-symbol type="id" name="old_app_action" />
- <java-symbol type="id" name="old_app_description" />
- <java-symbol type="id" name="old_app_icon" />
- <java-symbol type="id" name="overlay_display_window_texture" />
- <java-symbol type="id" name="overlay_display_window_title" />
- <java-symbol type="id" name="package_label" />
- <java-symbol type="id" name="packages_list" />
- <java-symbol type="id" name="pause" />
- <java-symbol type="id" name="show_more" />
- <java-symbol type="id" name="perm_icon" />
- <java-symbol type="id" name="show_more_icon" />
- <java-symbol type="id" name="show_more_text" />
- <java-symbol type="id" name="dangerous_perms_list" />
- <java-symbol type="id" name="non_dangerous_perms_list" />
- <java-symbol type="id" name="permission_group" />
- <java-symbol type="id" name="permission_list" />
- <java-symbol type="id" name="pickers" />
- <java-symbol type="id" name="prefs" />
- <java-symbol type="id" name="prefs_frame" />
- <java-symbol type="id" name="prev" />
- <java-symbol type="id" name="progress" />
- <java-symbol type="id" name="progress_circular" />
- <java-symbol type="id" name="progress_horizontal" />
- <java-symbol type="id" name="progress_number" />
- <java-symbol type="id" name="progress_percent" />
- <java-symbol type="id" name="progressContainer" />
- <java-symbol type="id" name="rew" />
- <java-symbol type="id" name="rightSpacer" />
- <java-symbol type="id" name="rowTypeId" />
- <java-symbol type="id" name="scrollView" />
- <java-symbol type="id" name="search_app_icon" />
- <java-symbol type="id" name="search_badge" />
- <java-symbol type="id" name="search_bar" />
- <java-symbol type="id" name="search_button" />
- <java-symbol type="id" name="search_close_btn" />
- <java-symbol type="id" name="search_edit_frame" />
- <java-symbol type="id" name="search_go_btn" />
- <java-symbol type="id" name="search_mag_icon" />
- <java-symbol type="id" name="search_plate" />
- <java-symbol type="id" name="search_src_text" />
- <java-symbol type="id" name="search_view" />
- <java-symbol type="id" name="search_voice_btn" />
- <java-symbol type="id" name="select_all" />
- <java-symbol type="id" name="serial_number" />
- <java-symbol type="id" name="seekbar" />
- <java-symbol type="id" name="sha1_fingerprint" />
- <java-symbol type="id" name="sha256_fingerprint" />
- <java-symbol type="id" name="share" />
- <java-symbol type="id" name="shortcut" />
- <java-symbol type="id" name="skip_button" />
- <java-symbol type="id" name="slider_group" />
- <java-symbol type="id" name="split_action_bar" />
- <java-symbol type="id" name="stream_icon" />
- <java-symbol type="id" name="submit_area" />
- <java-symbol type="id" name="switch_new" />
- <java-symbol type="id" name="switch_old" />
- <java-symbol type="id" name="switchWidget" />
- <java-symbol type="id" name="text" />
- <java-symbol type="id" name="time" />
- <java-symbol type="id" name="time_current" />
- <java-symbol type="id" name="timeDisplayBackground" />
- <java-symbol type="id" name="timeDisplayForeground" />
- <java-symbol type="id" name="titleDivider" />
- <java-symbol type="id" name="titleDividerTop" />
- <java-symbol type="id" name="timePicker" />
- <java-symbol type="id" name="title_template" />
- <java-symbol type="id" name="to_common" />
- <java-symbol type="id" name="to_org" />
- <java-symbol type="id" name="to_org_unit" />
- <java-symbol type="id" name="top_action_bar" />
- <java-symbol type="id" name="topPanel" />
- <java-symbol type="id" name="up" />
- <java-symbol type="id" name="value" />
- <java-symbol type="id" name="visible_panel" />
- <java-symbol type="id" name="websearch" />
- <java-symbol type="id" name="wifi_p2p_wps_pin" />
- <java-symbol type="id" name="year" />
- <java-symbol type="id" name="zoomControls" />
- <java-symbol type="id" name="zoomIn" />
- <java-symbol type="id" name="zoomMagnify" />
- <java-symbol type="id" name="zoomOut" />
- <java-symbol type="id" name="actions" />
- <java-symbol type="id" name="action0" />
- <java-symbol type="id" name="action1" />
- <java-symbol type="id" name="action2" />
- <java-symbol type="id" name="big_picture" />
- <java-symbol type="id" name="big_text" />
- <java-symbol type="id" name="chronometer" />
- <java-symbol type="id" name="inbox_text0" />
- <java-symbol type="id" name="inbox_text1" />
- <java-symbol type="id" name="inbox_text2" />
- <java-symbol type="id" name="inbox_text3" />
- <java-symbol type="id" name="inbox_text4" />
- <java-symbol type="id" name="inbox_text5" />
- <java-symbol type="id" name="inbox_text6" />
- <java-symbol type="id" name="inbox_more" />
- <java-symbol type="id" name="status_bar_latest_event_content" />
- <java-symbol type="id" name="action_divider" />
- <java-symbol type="id" name="overflow_divider" />
-
- <java-symbol type="attr" name="actionModeShareDrawable" />
- <java-symbol type="attr" name="alertDialogCenterButtons" />
- <java-symbol type="attr" name="gestureOverlayViewStyle" />
- <java-symbol type="attr" name="keyboardViewStyle" />
- <java-symbol type="attr" name="numberPickerStyle" />
- <java-symbol type="attr" name="pointerStyle" />
- <java-symbol type="attr" name="preferenceFrameLayoutStyle" />
- <java-symbol type="attr" name="searchDialogTheme" />
- <java-symbol type="attr" name="searchViewSearchIcon" />
- <java-symbol type="attr" name="stackViewStyle" />
- <java-symbol type="attr" name="switchStyle" />
- <java-symbol type="attr" name="textAppearanceAutoCorrectionSuggestion" />
- <java-symbol type="attr" name="textAppearanceEasyCorrectSuggestion" />
- <java-symbol type="attr" name="textAppearanceMisspelledSuggestion" />
- <java-symbol type="attr" name="textColorSearchUrl" />
- <java-symbol type="attr" name="timePickerStyle" />
- <java-symbol type="attr" name="windowFixedWidthMajor" />
- <java-symbol type="attr" name="windowFixedWidthMinor" />
- <java-symbol type="attr" name="windowFixedHeightMajor" />
- <java-symbol type="attr" name="windowFixedHeightMinor" />
- <java-symbol type="attr" name="accessibilityFocusedDrawable"/>
-
- <java-symbol type="bool" name="action_bar_embed_tabs" />
- <java-symbol type="bool" name="action_bar_embed_tabs_pre_jb" />
- <java-symbol type="bool" name="action_bar_expanded_action_views_exclusive" />
- <java-symbol type="bool" name="config_allowActionMenuItemTextWithIcon" />
- <java-symbol type="bool" name="config_bluetooth_adapter_quick_switch" />
- <java-symbol type="bool" name="config_bluetooth_sco_off_call" />
- <java-symbol type="bool" name="config_cellBroadcastAppLinks" />
- <java-symbol type="bool" name="config_duplicate_port_omadm_wappush" />
- <java-symbol type="bool" name="config_enable_emergency_call_while_sim_locked" />
- <java-symbol type="bool" name="config_enable_puk_unlock_screen" />
- <java-symbol type="bool" name="config_mms_content_disposition_support" />
- <java-symbol type="bool" name="config_showMenuShortcutsWhenKeyboardPresent" />
- <java-symbol type="bool" name="config_sip_wifi_only" />
- <java-symbol type="bool" name="config_sms_capable" />
- <java-symbol type="bool" name="config_sms_utf8_support" />
- <java-symbol type="bool" name="config_swipeDisambiguation" />
- <java-symbol type="bool" name="config_syncstorageengine_masterSyncAutomatically" />
- <java-symbol type="bool" name="config_telephony_use_own_number_for_voicemail" />
- <java-symbol type="bool" name="config_ui_enableFadingMarquee" />
- <java-symbol type="bool" name="config_use_strict_phone_number_comparation" />
- <java-symbol type="bool" name="config_voice_capable" />
- <java-symbol type="bool" name="preferences_prefer_dual_pane" />
- <java-symbol type="bool" name="skip_restoring_network_selection" />
- <java-symbol type="bool" name="split_action_bar_is_narrow" />
- <java-symbol type="bool" name="config_useMasterVolume" />
- <java-symbol type="bool" name="config_useVolumeKeySounds" />
- <java-symbol type="bool" name="config_enableWallpaperService" />
- <java-symbol type="bool" name="config_sendAudioBecomingNoisy" />
- <java-symbol type="bool" name="config_enableScreenshotChord" />
- <java-symbol type="bool" name="config_bluetooth_default_profiles" />
-
- <java-symbol type="integer" name="config_cursorWindowSize" />
- <java-symbol type="integer" name="config_longPressOnPowerBehavior" />
- <java-symbol type="integer" name="config_max_pan_devices" />
- <java-symbol type="integer" name="config_ntpTimeout" />
- <java-symbol type="integer" name="config_wifi_framework_scan_interval" />
- <java-symbol type="integer" name="config_wifi_supplicant_scan_interval" />
- <java-symbol type="integer" name="db_connection_pool_size" />
- <java-symbol type="integer" name="db_journal_size_limit" />
- <java-symbol type="integer" name="db_wal_autocheckpoint" />
- <java-symbol type="integer" name="max_action_buttons" />
- <java-symbol type="integer" name="config_wifi_driver_stop_delay" />
- <java-symbol type="integer" name="config_soundEffectVolumeDb" />
- <java-symbol type="integer" name="config_lockSoundVolumeDb" />
- <java-symbol type="integer" name="config_multiuserMaximumUsers" />
-
- <java-symbol type="color" name="tab_indicator_text_v4" />
-
- <java-symbol type="dimen" name="config_prefDialogWidth" />
- <java-symbol type="dimen" name="config_viewConfigurationTouchSlop" />
- <java-symbol type="dimen" name="default_app_widget_padding_bottom" />
- <java-symbol type="dimen" name="default_app_widget_padding_left" />
- <java-symbol type="dimen" name="default_app_widget_padding_right" />
- <java-symbol type="dimen" name="default_app_widget_padding_top" />
- <java-symbol type="dimen" name="default_gap" />
- <java-symbol type="dimen" name="dropdownitem_icon_width" />
- <java-symbol type="dimen" name="dropdownitem_text_padding_left" />
- <java-symbol type="dimen" name="fastscroll_overlay_size" />
- <java-symbol type="dimen" name="fastscroll_thumb_height" />
- <java-symbol type="dimen" name="fastscroll_thumb_width" />
- <java-symbol type="dimen" name="fastscroll_thumb_width" />
- <java-symbol type="dimen" name="password_keyboard_spacebar_vertical_correction" />
- <java-symbol type="dimen" name="search_view_preferred_width" />
- <java-symbol type="dimen" name="textview_error_popup_default_width" />
- <java-symbol type="dimen" name="toast_y_offset" />
- <java-symbol type="dimen" name="volume_panel_top" />
- <java-symbol type="dimen" name="action_bar_stacked_max_height" />
- <java-symbol type="dimen" name="action_bar_stacked_tab_max_width" />
- <java-symbol type="dimen" name="notification_text_size" />
- <java-symbol type="dimen" name="notification_title_text_size" />
- <java-symbol type="dimen" name="notification_subtext_size" />
-
- <java-symbol type="string" name="add_account_button_label" />
- <java-symbol type="string" name="addToDictionary" />
- <java-symbol type="string" name="action_bar_home_description" />
- <java-symbol type="string" name="action_bar_up_description" />
- <java-symbol type="string" name="delete" />
- <java-symbol type="string" name="deleteText" />
- <java-symbol type="string" name="ellipsis_two_dots" />
- <java-symbol type="string" name="ellipsis" />
- <java-symbol type="string" name="grant_permissions_header_text" />
- <java-symbol type="string" name="list_delimeter" />
- <java-symbol type="string" name="menu_delete_shortcut_label" />
- <java-symbol type="string" name="menu_enter_shortcut_label" />
- <java-symbol type="string" name="menu_space_shortcut_label" />
- <java-symbol type="string" name="notification_title" />
- <java-symbol type="string" name="permission_request_notification_with_subtitle" />
- <java-symbol type="string" name="prepend_shortcut_label" />
- <java-symbol type="string" name="replace" />
- <java-symbol type="string" name="textSelectionCABTitle" />
- <java-symbol type="string" name="BaMmi" />
- <java-symbol type="string" name="CLIRDefaultOffNextCallOff" />
- <java-symbol type="string" name="CLIRDefaultOffNextCallOn" />
- <java-symbol type="string" name="CLIRDefaultOnNextCallOff" />
- <java-symbol type="string" name="CLIRDefaultOnNextCallOn" />
- <java-symbol type="string" name="CLIRPermanent" />
- <java-symbol type="string" name="CfMmi" />
- <java-symbol type="string" name="ClipMmi" />
- <java-symbol type="string" name="ClirMmi" />
- <java-symbol type="string" name="CwMmi" />
- <java-symbol type="string" name="Midnight" />
- <java-symbol type="string" name="Noon" />
- <java-symbol type="string" name="PinMmi" />
- <java-symbol type="string" name="PwdMmi" />
- <java-symbol type="string" name="RestrictedChangedTitle" />
- <java-symbol type="string" name="RestrictedOnAllVoice" />
- <java-symbol type="string" name="RestrictedOnData" />
- <java-symbol type="string" name="RestrictedOnEmergency" />
- <java-symbol type="string" name="RestrictedOnNormal" />
- <java-symbol type="string" name="SetupCallDefault" />
- <java-symbol type="string" name="abbrev_month" />
- <java-symbol type="string" name="abbrev_month_day" />
- <java-symbol type="string" name="abbrev_month_day_year" />
- <java-symbol type="string" name="abbrev_month_year" />
- <java-symbol type="string" name="accept" />
- <java-symbol type="string" name="activity_chooser_view_see_all" />
- <java-symbol type="string" name="activitychooserview_choose_application" />
- <java-symbol type="string" name="alternate_eri_file" />
- <java-symbol type="string" name="alwaysUse" />
- <java-symbol type="string" name="am" />
- <java-symbol type="string" name="autofill_address_line_1_label_re" />
- <java-symbol type="string" name="autofill_address_line_1_re" />
- <java-symbol type="string" name="autofill_address_line_2_re" />
- <java-symbol type="string" name="autofill_address_line_3_re" />
- <java-symbol type="string" name="autofill_address_name_separator" />
- <java-symbol type="string" name="autofill_address_summary_format" />
- <java-symbol type="string" name="autofill_address_summary_name_format" />
- <java-symbol type="string" name="autofill_address_summary_separator" />
- <java-symbol type="string" name="autofill_address_type_same_as_re" />
- <java-symbol type="string" name="autofill_address_type_use_my_re" />
- <java-symbol type="string" name="autofill_area" />
- <java-symbol type="string" name="autofill_area_code_notext_re" />
- <java-symbol type="string" name="autofill_area_code_re" />
- <java-symbol type="string" name="autofill_attention_ignored_re" />
- <java-symbol type="string" name="autofill_billing_designator_re" />
- <java-symbol type="string" name="autofill_card_cvc_re" />
- <java-symbol type="string" name="autofill_card_ignored_re" />
- <java-symbol type="string" name="autofill_card_number_re" />
- <java-symbol type="string" name="autofill_city_re" />
- <java-symbol type="string" name="autofill_company_re" />
- <java-symbol type="string" name="autofill_country_code_re" />
- <java-symbol type="string" name="autofill_country_re" />
- <java-symbol type="string" name="autofill_county" />
- <java-symbol type="string" name="autofill_department" />
- <java-symbol type="string" name="autofill_district" />
- <java-symbol type="string" name="autofill_email_re" />
- <java-symbol type="string" name="autofill_emirate" />
- <java-symbol type="string" name="autofill_expiration_date_re" />
- <java-symbol type="string" name="autofill_expiration_month_re" />
- <java-symbol type="string" name="autofill_fax_re" />
- <java-symbol type="string" name="autofill_first_name_re" />
- <java-symbol type="string" name="autofill_island" />
- <java-symbol type="string" name="autofill_last_name_re" />
- <java-symbol type="string" name="autofill_middle_initial_re" />
- <java-symbol type="string" name="autofill_middle_name_re" />
- <java-symbol type="string" name="autofill_name_on_card_contextual_re" />
- <java-symbol type="string" name="autofill_name_on_card_re" />
- <java-symbol type="string" name="autofill_name_re" />
- <java-symbol type="string" name="autofill_name_specific_re" />
- <java-symbol type="string" name="autofill_parish" />
- <java-symbol type="string" name="autofill_phone_extension_re" />
- <java-symbol type="string" name="autofill_phone_prefix_re" />
- <java-symbol type="string" name="autofill_phone_prefix_separator_re" />
- <java-symbol type="string" name="autofill_phone_re" />
- <java-symbol type="string" name="autofill_phone_suffix_re" />
- <java-symbol type="string" name="autofill_phone_suffix_separator_re" />
- <java-symbol type="string" name="autofill_postal_code" />
- <java-symbol type="string" name="autofill_prefecture" />
- <java-symbol type="string" name="autofill_province" />
- <java-symbol type="string" name="autofill_region_ignored_re" />
- <java-symbol type="string" name="autofill_shipping_designator_re" />
- <java-symbol type="string" name="autofill_state" />
- <java-symbol type="string" name="autofill_state_re" />
- <java-symbol type="string" name="autofill_this_form" />
- <java-symbol type="string" name="autofill_username_re" />
- <java-symbol type="string" name="autofill_zip_4_re" />
- <java-symbol type="string" name="autofill_zip_code" />
- <java-symbol type="string" name="autofill_zip_code_re" />
- <java-symbol type="string" name="badPin" />
- <java-symbol type="string" name="badPuk" />
- <java-symbol type="string" name="byteShort" />
- <java-symbol type="string" name="cfTemplateForwarded" />
- <java-symbol type="string" name="cfTemplateForwardedTime" />
- <java-symbol type="string" name="cfTemplateNotForwarded" />
- <java-symbol type="string" name="cfTemplateRegistered" />
- <java-symbol type="string" name="cfTemplateRegisteredTime" />
- <java-symbol type="string" name="chooseActivity" />
- <java-symbol type="string" name="config_default_dns_server" />
- <java-symbol type="string" name="config_ethernet_iface_regex" />
- <java-symbol type="string" name="config_ntpServer" />
- <java-symbol type="string" name="config_tether_apndata" />
- <java-symbol type="string" name="config_useragentprofile_url" />
- <java-symbol type="string" name="config_wifi_p2p_device_type" />
- <java-symbol type="string" name="contentServiceSync" />
- <java-symbol type="string" name="contentServiceSyncNotificationTitle" />
- <java-symbol type="string" name="contentServiceTooManyDeletesNotificationDesc" />
- <java-symbol type="string" name="date1_date2" />
- <java-symbol type="string" name="date1_time1_date2_time2" />
- <java-symbol type="string" name="date_and_time" />
- <java-symbol type="string" name="date_picker_decrement_day_button" />
- <java-symbol type="string" name="date_picker_decrement_month_button" />
- <java-symbol type="string" name="date_picker_decrement_year_button" />
- <java-symbol type="string" name="date_picker_dialog_title" />
- <java-symbol type="string" name="date_picker_increment_day_button" />
- <java-symbol type="string" name="date_picker_increment_month_button" />
- <java-symbol type="string" name="date_picker_increment_year_button" />
- <java-symbol type="string" name="date_time" />
- <java-symbol type="string" name="date_time_set" />
- <java-symbol type="string" name="date_time_done" />
- <java-symbol type="string" name="day_of_week_long_friday" />
- <java-symbol type="string" name="day_of_week_long_monday" />
- <java-symbol type="string" name="day_of_week_long_saturday" />
- <java-symbol type="string" name="day_of_week_long_sunday" />
- <java-symbol type="string" name="day_of_week_long_thursday" />
- <java-symbol type="string" name="day_of_week_long_tuesday" />
- <java-symbol type="string" name="day_of_week_long_wednesday" />
- <java-symbol type="string" name="day_of_week_medium_friday" />
- <java-symbol type="string" name="day_of_week_medium_monday" />
- <java-symbol type="string" name="day_of_week_medium_saturday" />
- <java-symbol type="string" name="day_of_week_medium_sunday" />
- <java-symbol type="string" name="day_of_week_medium_thursday" />
- <java-symbol type="string" name="day_of_week_medium_tuesday" />
- <java-symbol type="string" name="day_of_week_medium_wednesday" />
- <java-symbol type="string" name="day_of_week_short_friday" />
- <java-symbol type="string" name="day_of_week_short_monday" />
- <java-symbol type="string" name="day_of_week_short_saturday" />
- <java-symbol type="string" name="day_of_week_short_sunday" />
- <java-symbol type="string" name="day_of_week_short_thursday" />
- <java-symbol type="string" name="day_of_week_short_tuesday" />
- <java-symbol type="string" name="day_of_week_short_wednesday" />
- <java-symbol type="string" name="day_of_week_shortest_friday" />
- <java-symbol type="string" name="day_of_week_shortest_monday" />
- <java-symbol type="string" name="day_of_week_shortest_saturday" />
- <java-symbol type="string" name="day_of_week_shortest_sunday" />
- <java-symbol type="string" name="day_of_week_shortest_thursday" />
- <java-symbol type="string" name="day_of_week_shortest_tuesday" />
- <java-symbol type="string" name="day_of_week_shortest_wednesday" />
- <java-symbol type="string" name="db_default_journal_mode" />
- <java-symbol type="string" name="db_default_sync_mode" />
- <java-symbol type="string" name="db_wal_sync_mode" />
- <java-symbol type="string" name="decline" />
- <java-symbol type="string" name="default_text_encoding" />
- <java-symbol type="string" name="description_target_unlock_tablet" />
- <java-symbol type="string" name="display_manager_built_in_display_name" />
- <java-symbol type="string" name="display_manager_hdmi_display_name" />
- <java-symbol type="string" name="display_manager_overlay_display_name" />
- <java-symbol type="string" name="display_manager_overlay_display_title" />
- <java-symbol type="string" name="double_tap_toast" />
- <java-symbol type="string" name="elapsed_time_short_format_h_mm_ss" />
- <java-symbol type="string" name="elapsed_time_short_format_mm_ss" />
- <java-symbol type="string" name="emailTypeCustom" />
- <java-symbol type="string" name="emailTypeHome" />
- <java-symbol type="string" name="emailTypeMobile" />
- <java-symbol type="string" name="emailTypeOther" />
- <java-symbol type="string" name="emailTypeWork" />
- <java-symbol type="string" name="emergency_call_dialog_number_for_display" />
- <java-symbol type="string" name="emergency_calls_only" />
- <java-symbol type="string" name="eventTypeAnniversary" />
- <java-symbol type="string" name="eventTypeBirthday" />
- <java-symbol type="string" name="eventTypeCustom" />
- <java-symbol type="string" name="eventTypeOther" />
- <java-symbol type="string" name="extmedia_format_button_format" />
- <java-symbol type="string" name="extmedia_format_message" />
- <java-symbol type="string" name="extmedia_format_title" />
- <java-symbol type="string" name="fileSizeSuffix" />
- <java-symbol type="string" name="force_close" />
- <java-symbol type="string" name="format_error" />
- <java-symbol type="string" name="gadget_host_error_inflating" />
- <java-symbol type="string" name="gigabyteShort" />
- <java-symbol type="string" name="gpsNotifMessage" />
- <java-symbol type="string" name="gpsNotifTicker" />
- <java-symbol type="string" name="gpsNotifTitle" />
- <java-symbol type="string" name="gpsVerifNo" />
- <java-symbol type="string" name="gpsVerifYes" />
- <java-symbol type="string" name="gsm_alphabet_default_charset" />
- <java-symbol type="string" name="hour_ampm" />
- <java-symbol type="string" name="hour_cap_ampm" />
- <java-symbol type="string" name="hour_minute_24" />
- <java-symbol type="string" name="hour_minute_ampm" />
- <java-symbol type="string" name="hour_minute_cap_ampm" />
- <java-symbol type="string" name="httpError" />
- <java-symbol type="string" name="httpErrorAuth" />
- <java-symbol type="string" name="httpErrorConnect" />
- <java-symbol type="string" name="httpErrorFailedSslHandshake" />
- <java-symbol type="string" name="httpErrorFile" />
- <java-symbol type="string" name="httpErrorFileNotFound" />
- <java-symbol type="string" name="httpErrorIO" />
- <java-symbol type="string" name="httpErrorLookup" />
- <java-symbol type="string" name="httpErrorOk" />
- <java-symbol type="string" name="httpErrorProxyAuth" />
- <java-symbol type="string" name="httpErrorRedirectLoop" />
- <java-symbol type="string" name="httpErrorTimeout" />
- <java-symbol type="string" name="httpErrorTooManyRequests" />
- <java-symbol type="string" name="httpErrorUnsupportedAuthScheme" />
- <java-symbol type="string" name="imProtocolAim" />
- <java-symbol type="string" name="imProtocolCustom" />
- <java-symbol type="string" name="imProtocolGoogleTalk" />
- <java-symbol type="string" name="imProtocolIcq" />
- <java-symbol type="string" name="imProtocolJabber" />
- <java-symbol type="string" name="imProtocolMsn" />
- <java-symbol type="string" name="imProtocolNetMeeting" />
- <java-symbol type="string" name="imProtocolQq" />
- <java-symbol type="string" name="imProtocolSkype" />
- <java-symbol type="string" name="imProtocolYahoo" />
- <java-symbol type="string" name="imTypeCustom" />
- <java-symbol type="string" name="imTypeHome" />
- <java-symbol type="string" name="imTypeOther" />
- <java-symbol type="string" name="imTypeWork" />
- <java-symbol type="string" name="ime_action_default" />
- <java-symbol type="string" name="ime_action_done" />
- <java-symbol type="string" name="ime_action_go" />
- <java-symbol type="string" name="ime_action_next" />
- <java-symbol type="string" name="ime_action_previous" />
- <java-symbol type="string" name="ime_action_search" />
- <java-symbol type="string" name="ime_action_send" />
- <java-symbol type="string" name="invalidPin" />
- <java-symbol type="string" name="js_dialog_before_unload" />
- <java-symbol type="string" name="js_dialog_title" />
- <java-symbol type="string" name="js_dialog_title_default" />
- <java-symbol type="string" name="keyboard_headset_required_to_hear_password" />
- <java-symbol type="string" name="keyboard_password_character_no_headset" />
- <java-symbol type="string" name="keyboardview_keycode_alt" />
- <java-symbol type="string" name="keyboardview_keycode_cancel" />
- <java-symbol type="string" name="keyboardview_keycode_delete" />
- <java-symbol type="string" name="keyboardview_keycode_done" />
- <java-symbol type="string" name="keyboardview_keycode_enter" />
- <java-symbol type="string" name="keyboardview_keycode_mode_change" />
- <java-symbol type="string" name="keyboardview_keycode_shift" />
- <java-symbol type="string" name="kilobyteShort" />
- <java-symbol type="string" name="last_month" />
- <java-symbol type="string" name="launchBrowserDefault" />
- <java-symbol type="string" name="lockscreen_access_pattern_cell_added" />
- <java-symbol type="string" name="lockscreen_access_pattern_cleared" />
- <java-symbol type="string" name="lockscreen_access_pattern_detected" />
- <java-symbol type="string" name="lockscreen_access_pattern_start" />
- <java-symbol type="string" name="lockscreen_emergency_call" />
- <java-symbol type="string" name="lockscreen_return_to_call" />
- <java-symbol type="string" name="lockscreen_transport_pause_description" />
- <java-symbol type="string" name="lockscreen_transport_play_description" />
- <java-symbol type="string" name="lockscreen_transport_stop_description" />
- <java-symbol type="string" name="low_memory" />
- <java-symbol type="string" name="media_bad_removal" />
- <java-symbol type="string" name="media_checking" />
- <java-symbol type="string" name="media_removed" />
- <java-symbol type="string" name="media_shared" />
- <java-symbol type="string" name="media_unknown_state" />
- <java-symbol type="string" name="megabyteShort" />
- <java-symbol type="string" name="midnight" />
- <java-symbol type="string" name="mismatchPin" />
- <java-symbol type="string" name="mmiComplete" />
- <java-symbol type="string" name="mmiError" />
- <java-symbol type="string" name="mmiFdnError" />
- <java-symbol type="string" name="month" />
- <java-symbol type="string" name="month_day" />
- <java-symbol type="string" name="month_day_year" />
- <java-symbol type="string" name="month_long_april" />
- <java-symbol type="string" name="month_long_august" />
- <java-symbol type="string" name="month_long_december" />
- <java-symbol type="string" name="month_long_february" />
- <java-symbol type="string" name="month_long_january" />
- <java-symbol type="string" name="month_long_july" />
- <java-symbol type="string" name="month_long_june" />
- <java-symbol type="string" name="month_long_march" />
- <java-symbol type="string" name="month_long_may" />
- <java-symbol type="string" name="month_long_november" />
- <java-symbol type="string" name="month_long_october" />
- <java-symbol type="string" name="month_long_september" />
- <java-symbol type="string" name="month_long_standalone_april" />
- <java-symbol type="string" name="month_long_standalone_august" />
- <java-symbol type="string" name="month_long_standalone_december" />
- <java-symbol type="string" name="month_long_standalone_february" />
- <java-symbol type="string" name="month_long_standalone_january" />
- <java-symbol type="string" name="month_long_standalone_july" />
- <java-symbol type="string" name="month_long_standalone_june" />
- <java-symbol type="string" name="month_long_standalone_march" />
- <java-symbol type="string" name="month_long_standalone_may" />
- <java-symbol type="string" name="month_long_standalone_november" />
- <java-symbol type="string" name="month_long_standalone_october" />
- <java-symbol type="string" name="month_long_standalone_september" />
- <java-symbol type="string" name="month_medium_april" />
- <java-symbol type="string" name="month_medium_august" />
- <java-symbol type="string" name="month_medium_december" />
- <java-symbol type="string" name="month_medium_february" />
- <java-symbol type="string" name="month_medium_january" />
- <java-symbol type="string" name="month_medium_july" />
- <java-symbol type="string" name="month_medium_june" />
- <java-symbol type="string" name="month_medium_march" />
- <java-symbol type="string" name="month_medium_may" />
- <java-symbol type="string" name="month_medium_november" />
- <java-symbol type="string" name="month_medium_october" />
- <java-symbol type="string" name="month_medium_september" />
- <java-symbol type="string" name="month_shortest_april" />
- <java-symbol type="string" name="month_shortest_august" />
- <java-symbol type="string" name="month_shortest_december" />
- <java-symbol type="string" name="month_shortest_february" />
- <java-symbol type="string" name="month_shortest_january" />
- <java-symbol type="string" name="month_shortest_july" />
- <java-symbol type="string" name="month_shortest_june" />
- <java-symbol type="string" name="month_shortest_march" />
- <java-symbol type="string" name="month_shortest_may" />
- <java-symbol type="string" name="month_shortest_november" />
- <java-symbol type="string" name="month_shortest_october" />
- <java-symbol type="string" name="month_shortest_september" />
- <java-symbol type="string" name="month_year" />
- <java-symbol type="string" name="more_item_label" />
- <java-symbol type="string" name="needPuk" />
- <java-symbol type="string" name="needPuk2" />
- <java-symbol type="string" name="new_app_action" />
- <java-symbol type="string" name="new_app_description" />
- <java-symbol type="string" name="noApplications" />
- <java-symbol type="string" name="no_file_chosen" />
- <java-symbol type="string" name="no_matches" />
- <java-symbol type="string" name="noon" />
- <java-symbol type="string" name="number_picker_increment_scroll_action" />
- <java-symbol type="string" name="number_picker_increment_scroll_mode" />
- <java-symbol type="string" name="numeric_date" />
- <java-symbol type="string" name="numeric_date_format" />
- <java-symbol type="string" name="numeric_date_template" />
- <java-symbol type="string" name="numeric_md1_md2" />
- <java-symbol type="string" name="numeric_md1_time1_md2_time2" />
- <java-symbol type="string" name="numeric_mdy1_mdy2" />
- <java-symbol type="string" name="numeric_mdy1_time1_mdy2_time2" />
- <java-symbol type="string" name="numeric_wday1_md1_time1_wday2_md2_time2" />
- <java-symbol type="string" name="numeric_wday1_md1_wday2_md2" />
- <java-symbol type="string" name="numeric_wday1_mdy1_time1_wday2_mdy2_time2" />
- <java-symbol type="string" name="numeric_wday1_mdy1_wday2_mdy2" />
- <java-symbol type="string" name="old_app_action" />
- <java-symbol type="string" name="old_app_description" />
- <java-symbol type="string" name="older" />
- <java-symbol type="string" name="open_permission_deny" />
- <java-symbol type="string" name="orgTypeCustom" />
- <java-symbol type="string" name="orgTypeOther" />
- <java-symbol type="string" name="orgTypeWork" />
- <java-symbol type="string" name="passwordIncorrect" />
- <java-symbol type="string" name="perms_description_app" />
- <java-symbol type="string" name="perms_new_perm_prefix" />
- <java-symbol type="string" name="perms_hide" />
- <java-symbol type="string" name="perms_show_all" />
- <java-symbol type="string" name="default_permission_group" />
- <java-symbol type="string" name="permissions_format" />
- <java-symbol type="string" name="petabyteShort" />
- <java-symbol type="string" name="phoneTypeAssistant" />
- <java-symbol type="string" name="phoneTypeCallback" />
- <java-symbol type="string" name="phoneTypeCar" />
- <java-symbol type="string" name="phoneTypeCompanyMain" />
- <java-symbol type="string" name="phoneTypeCustom" />
- <java-symbol type="string" name="phoneTypeFaxHome" />
- <java-symbol type="string" name="phoneTypeFaxWork" />
- <java-symbol type="string" name="phoneTypeHome" />
- <java-symbol type="string" name="phoneTypeIsdn" />
- <java-symbol type="string" name="phoneTypeMain" />
- <java-symbol type="string" name="phoneTypeMms" />
- <java-symbol type="string" name="phoneTypeMobile" />
- <java-symbol type="string" name="phoneTypeOther" />
- <java-symbol type="string" name="phoneTypeOtherFax" />
- <java-symbol type="string" name="phoneTypePager" />
- <java-symbol type="string" name="phoneTypeRadio" />
- <java-symbol type="string" name="phoneTypeTelex" />
- <java-symbol type="string" name="phoneTypeTtyTdd" />
- <java-symbol type="string" name="phoneTypeWork" />
- <java-symbol type="string" name="phoneTypeWorkMobile" />
- <java-symbol type="string" name="phoneTypeWorkPager" />
- <java-symbol type="string" name="pm" />
- <java-symbol type="string" name="policydesc_disableCamera" />
- <java-symbol type="string" name="policydesc_encryptedStorage" />
- <java-symbol type="string" name="policydesc_expirePassword" />
- <java-symbol type="string" name="policydesc_forceLock" />
- <java-symbol type="string" name="policydesc_limitPassword" />
- <java-symbol type="string" name="policydesc_resetPassword" />
- <java-symbol type="string" name="policydesc_setGlobalProxy" />
- <java-symbol type="string" name="policydesc_watchLogin" />
- <java-symbol type="string" name="policydesc_wipeData" />
- <java-symbol type="string" name="policydesc_disableKeyguardWidgets" />
- <java-symbol type="string" name="policylab_disableCamera" />
- <java-symbol type="string" name="policylab_encryptedStorage" />
- <java-symbol type="string" name="policylab_expirePassword" />
- <java-symbol type="string" name="policylab_forceLock" />
- <java-symbol type="string" name="policylab_limitPassword" />
- <java-symbol type="string" name="policylab_resetPassword" />
- <java-symbol type="string" name="policylab_setGlobalProxy" />
- <java-symbol type="string" name="policylab_watchLogin" />
- <java-symbol type="string" name="policylab_wipeData" />
- <java-symbol type="string" name="policylab_disableKeyguardWidgets" />
- <java-symbol type="string" name="postalTypeCustom" />
- <java-symbol type="string" name="postalTypeHome" />
- <java-symbol type="string" name="postalTypeOther" />
- <java-symbol type="string" name="postalTypeWork" />
- <java-symbol type="string" name="power_off" />
- <java-symbol type="string" name="preposition_for_date" />
- <java-symbol type="string" name="preposition_for_time" />
- <java-symbol type="string" name="progress_erasing" />
- <java-symbol type="string" name="progress_unmounting" />
- <java-symbol type="string" name="reboot_safemode_confirm" />
- <java-symbol type="string" name="reboot_safemode_title" />
- <java-symbol type="string" name="relationTypeAssistant" />
- <java-symbol type="string" name="relationTypeBrother" />
- <java-symbol type="string" name="relationTypeChild" />
- <java-symbol type="string" name="relationTypeDomesticPartner" />
- <java-symbol type="string" name="relationTypeFather" />
- <java-symbol type="string" name="relationTypeFriend" />
- <java-symbol type="string" name="relationTypeManager" />
- <java-symbol type="string" name="relationTypeMother" />
- <java-symbol type="string" name="relationTypeParent" />
- <java-symbol type="string" name="relationTypePartner" />
- <java-symbol type="string" name="relationTypeReferredBy" />
- <java-symbol type="string" name="relationTypeRelative" />
- <java-symbol type="string" name="relationTypeSister" />
- <java-symbol type="string" name="relationTypeSpouse" />
- <java-symbol type="string" name="relative_time" />
- <java-symbol type="string" name="reset" />
- <java-symbol type="string" name="ringtone_default" />
- <java-symbol type="string" name="ringtone_default_with_actual" />
- <java-symbol type="string" name="ringtone_picker_title" />
- <java-symbol type="string" name="ringtone_silent" />
- <java-symbol type="string" name="ringtone_unknown" />
- <java-symbol type="string" name="roamingText0" />
- <java-symbol type="string" name="roamingText1" />
- <java-symbol type="string" name="roamingText10" />
- <java-symbol type="string" name="roamingText11" />
- <java-symbol type="string" name="roamingText12" />
- <java-symbol type="string" name="roamingText2" />
- <java-symbol type="string" name="roamingText3" />
- <java-symbol type="string" name="roamingText4" />
- <java-symbol type="string" name="roamingText5" />
- <java-symbol type="string" name="roamingText6" />
- <java-symbol type="string" name="roamingText7" />
- <java-symbol type="string" name="roamingText8" />
- <java-symbol type="string" name="roamingText9" />
- <java-symbol type="string" name="roamingTextSearching" />
- <java-symbol type="string" name="same_month_md1_md2" />
- <java-symbol type="string" name="same_month_md1_time1_md2_time2" />
- <java-symbol type="string" name="same_month_mdy1_mdy2" />
- <java-symbol type="string" name="same_month_mdy1_time1_mdy2_time2" />
- <java-symbol type="string" name="same_month_wday1_md1_time1_wday2_md2_time2" />
- <java-symbol type="string" name="same_month_wday1_md1_wday2_md2" />
- <java-symbol type="string" name="same_month_wday1_mdy1_time1_wday2_mdy2_time2" />
- <java-symbol type="string" name="same_month_wday1_mdy1_wday2_mdy2" />
- <java-symbol type="string" name="same_year_md1_md2" />
- <java-symbol type="string" name="same_year_md1_time1_md2_time2" />
- <java-symbol type="string" name="same_year_mdy1_mdy2" />
- <java-symbol type="string" name="same_year_mdy1_time1_mdy2_time2" />
- <java-symbol type="string" name="same_year_wday1_md1_time1_wday2_md2_time2" />
- <java-symbol type="string" name="same_year_wday1_md1_wday2_md2" />
- <java-symbol type="string" name="same_year_wday1_mdy1_time1_wday2_mdy2_time2" />
- <java-symbol type="string" name="same_year_wday1_mdy1_wday2_mdy2" />
- <java-symbol type="string" name="save_password_label" />
- <java-symbol type="string" name="save_password_message" />
- <java-symbol type="string" name="save_password_never" />
- <java-symbol type="string" name="save_password_notnow" />
- <java-symbol type="string" name="save_password_remember" />
- <java-symbol type="string" name="sendText" />
- <java-symbol type="string" name="sending" />
- <java-symbol type="string" name="serviceClassData" />
- <java-symbol type="string" name="serviceClassDataAsync" />
- <java-symbol type="string" name="serviceClassDataSync" />
- <java-symbol type="string" name="serviceClassFAX" />
- <java-symbol type="string" name="serviceClassPAD" />
- <java-symbol type="string" name="serviceClassPacket" />
- <java-symbol type="string" name="serviceClassSMS" />
- <java-symbol type="string" name="serviceClassVoice" />
- <java-symbol type="string" name="serviceDisabled" />
- <java-symbol type="string" name="serviceEnabled" />
- <java-symbol type="string" name="serviceEnabledFor" />
- <java-symbol type="string" name="serviceErased" />
- <java-symbol type="string" name="serviceNotProvisioned" />
- <java-symbol type="string" name="serviceRegistered" />
- <java-symbol type="string" name="setup_autofill" />
- <java-symbol type="string" name="share" />
- <java-symbol type="string" name="shareactionprovider_share_with" />
- <java-symbol type="string" name="shareactionprovider_share_with_application" />
- <java-symbol type="string" name="short_format_month" />
- <java-symbol type="string" name="shutdown_confirm" />
- <java-symbol type="string" name="shutdown_confirm_question" />
- <java-symbol type="string" name="shutdown_progress" />
- <java-symbol type="string" name="sim_added_message" />
- <java-symbol type="string" name="sim_added_title" />
- <java-symbol type="string" name="sim_removed_message" />
- <java-symbol type="string" name="sim_removed_title" />
- <java-symbol type="string" name="sim_restart_button" />
- <java-symbol type="string" name="sipAddressTypeCustom" />
- <java-symbol type="string" name="sipAddressTypeHome" />
- <java-symbol type="string" name="sipAddressTypeOther" />
- <java-symbol type="string" name="sipAddressTypeWork" />
- <java-symbol type="string" name="sms_control_message" />
- <java-symbol type="string" name="sms_control_title" />
- <java-symbol type="string" name="sms_control_no" />
- <java-symbol type="string" name="sms_control_yes" />
- <java-symbol type="string" name="sms_premium_short_code_confirm_message" />
- <java-symbol type="string" name="sms_premium_short_code_confirm_title" />
- <java-symbol type="string" name="sms_short_code_confirm_allow" />
- <java-symbol type="string" name="sms_short_code_confirm_deny" />
- <java-symbol type="string" name="sms_short_code_confirm_message" />
- <java-symbol type="string" name="sms_short_code_confirm_report" />
- <java-symbol type="string" name="sms_short_code_confirm_title" />
- <java-symbol type="string" name="submit" />
- <java-symbol type="string" name="sync_binding_label" />
- <java-symbol type="string" name="sync_do_nothing" />
- <java-symbol type="string" name="sync_really_delete" />
- <java-symbol type="string" name="sync_too_many_deletes_desc" />
- <java-symbol type="string" name="sync_undo_deletes" />
- <java-symbol type="string" name="terabyteShort" />
- <java-symbol type="string" name="text_copied" />
- <java-symbol type="string" name="time1_time2" />
- <java-symbol type="string" name="time_date" />
- <java-symbol type="string" name="time_of_day" />
- <java-symbol type="string" name="time_picker_decrement_hour_button" />
- <java-symbol type="string" name="time_picker_decrement_minute_button" />
- <java-symbol type="string" name="time_picker_decrement_set_am_button" />
- <java-symbol type="string" name="time_picker_dialog_title" />
- <java-symbol type="string" name="time_picker_increment_hour_button" />
- <java-symbol type="string" name="time_picker_increment_minute_button" />
- <java-symbol type="string" name="time_picker_increment_set_pm_button" />
- <java-symbol type="string" name="time_picker_separator" />
- <java-symbol type="string" name="time_wday" />
- <java-symbol type="string" name="time_wday_date" />
- <java-symbol type="string" name="today" />
- <java-symbol type="string" name="tomorrow" />
- <java-symbol type="string" name="twelve_hour_time_format" />
- <java-symbol type="string" name="twenty_four_hour_time_format" />
- <java-symbol type="string" name="upload_file" />
- <java-symbol type="string" name="volume_alarm" />
- <java-symbol type="string" name="volume_icon_description_bluetooth" />
- <java-symbol type="string" name="volume_icon_description_incall" />
- <java-symbol type="string" name="volume_icon_description_media" />
- <java-symbol type="string" name="volume_icon_description_notification" />
- <java-symbol type="string" name="volume_icon_description_ringer" />
- <java-symbol type="string" name="wait" />
- <java-symbol type="string" name="wday1_date1_time1_wday2_date2_time2" />
- <java-symbol type="string" name="wday1_date1_wday2_date2" />
- <java-symbol type="string" name="wday_date" />
- <java-symbol type="string" name="web_user_agent" />
- <java-symbol type="string" name="web_user_agent_target_content" />
- <java-symbol type="string" name="webpage_unresponsive" />
- <java-symbol type="string" name="whichApplication" />
- <java-symbol type="string" name="wifi_available_sign_in" />
- <java-symbol type="string" name="wifi_available_sign_in_detailed" />
- <java-symbol type="string" name="wifi_p2p_dialog_title" />
- <java-symbol type="string" name="wifi_p2p_enabled_notification_message" />
- <java-symbol type="string" name="wifi_p2p_enabled_notification_title" />
- <java-symbol type="string" name="wifi_p2p_failed_message" />
- <java-symbol type="string" name="wifi_p2p_from_message" />
- <java-symbol type="string" name="wifi_p2p_invitation_sent_title" />
- <java-symbol type="string" name="wifi_p2p_invitation_to_connect_title" />
- <java-symbol type="string" name="wifi_p2p_show_pin_message" />
- <java-symbol type="string" name="wifi_p2p_to_message" />
- <java-symbol type="string" name="wifi_p2p_turnon_message" />
- <java-symbol type="string" name="wifi_tether_configure_ssid_default" />
- <java-symbol type="string" name="wifi_watchdog_network_disabled" />
- <java-symbol type="string" name="wifi_watchdog_network_disabled_detailed" />
- <java-symbol type="string" name="yesterday" />
- <java-symbol type="string" name="imei" />
- <java-symbol type="string" name="meid" />
- <java-symbol type="string" name="granularity_label_character" />
- <java-symbol type="string" name="granularity_label_word" />
- <java-symbol type="string" name="granularity_label_link" />
- <java-symbol type="string" name="granularity_label_line" />
- <java-symbol type="string" name="default_audio_route_name" />
- <java-symbol type="string" name="default_audio_route_name_headphones" />
- <java-symbol type="string" name="default_audio_route_name_dock_speakers" />
- <java-symbol type="string" name="default_audio_route_name_hdmi" />
- <java-symbol type="string" name="default_audio_route_category_name" />
-
- <java-symbol type="plurals" name="abbrev_in_num_days" />
- <java-symbol type="plurals" name="abbrev_in_num_hours" />
- <java-symbol type="plurals" name="abbrev_in_num_minutes" />
- <java-symbol type="plurals" name="abbrev_in_num_seconds" />
- <java-symbol type="plurals" name="abbrev_num_days_ago" />
- <java-symbol type="plurals" name="abbrev_num_hours_ago" />
- <java-symbol type="plurals" name="abbrev_num_minutes_ago" />
- <java-symbol type="plurals" name="abbrev_num_seconds_ago" />
- <java-symbol type="plurals" name="in_num_days" />
- <java-symbol type="plurals" name="in_num_hours" />
- <java-symbol type="plurals" name="in_num_minutes" />
- <java-symbol type="plurals" name="in_num_seconds" />
- <java-symbol type="plurals" name="last_num_days" />
- <java-symbol type="plurals" name="matches_found" />
- <java-symbol type="plurals" name="num_days_ago" />
- <java-symbol type="plurals" name="num_hours_ago" />
- <java-symbol type="plurals" name="num_minutes_ago" />
- <java-symbol type="plurals" name="num_seconds_ago" />
-
- <java-symbol type="array" name="carrier_properties" />
- <java-symbol type="array" name="config_data_usage_network_types" />
- <java-symbol type="array" name="config_sms_enabled_locking_shift_tables" />
- <java-symbol type="array" name="config_sms_enabled_single_shift_tables" />
- <java-symbol type="array" name="config_twoDigitNumberPattern" />
- <java-symbol type="array" name="networkAttributes" />
- <java-symbol type="array" name="preloaded_color_state_lists" />
- <java-symbol type="array" name="preloaded_drawables" />
- <java-symbol type="array" name="special_locale_codes" />
- <java-symbol type="array" name="special_locale_names" />
- <java-symbol type="array" name="config_masterVolumeRamp" />
- <java-symbol type="array" name="config_cdma_dun_supported_types" />
-
- <java-symbol type="drawable" name="default_wallpaper" />
- <java-symbol type="drawable" name="indicator_input_error" />
- <java-symbol type="drawable" name="overscroll_edge" />
- <java-symbol type="drawable" name="overscroll_glow" />
- <java-symbol type="drawable" name="popup_bottom_dark" />
- <java-symbol type="drawable" name="popup_bottom_bright" />
- <java-symbol type="drawable" name="popup_bottom_medium" />
- <java-symbol type="drawable" name="popup_center_dark" />
- <java-symbol type="drawable" name="popup_center_bright" />
- <java-symbol type="drawable" name="popup_full_dark" />
- <java-symbol type="drawable" name="popup_full_bright" />
- <java-symbol type="drawable" name="popup_top_dark" />
- <java-symbol type="drawable" name="popup_top_bright" />
- <java-symbol type="drawable" name="search_spinner" />
- <java-symbol type="drawable" name="sym_app_on_sd_unavailable_icon" />
- <java-symbol type="drawable" name="text_edit_side_paste_window" />
- <java-symbol type="drawable" name="text_edit_paste_window" />
- <java-symbol type="drawable" name="btn_check_off" />
- <java-symbol type="drawable" name="btn_code_lock_default_holo" />
- <java-symbol type="drawable" name="btn_code_lock_touched_holo" />
- <java-symbol type="drawable" name="clock_dial" />
- <java-symbol type="drawable" name="clock_hand_hour" />
- <java-symbol type="drawable" name="clock_hand_minute" />
- <java-symbol type="drawable" name="emo_im_angel" />
- <java-symbol type="drawable" name="emo_im_cool" />
- <java-symbol type="drawable" name="emo_im_crying" />
- <java-symbol type="drawable" name="emo_im_embarrassed" />
- <java-symbol type="drawable" name="emo_im_foot_in_mouth" />
- <java-symbol type="drawable" name="emo_im_happy" />
- <java-symbol type="drawable" name="emo_im_kissing" />
- <java-symbol type="drawable" name="emo_im_laughing" />
- <java-symbol type="drawable" name="emo_im_lips_are_sealed" />
- <java-symbol type="drawable" name="emo_im_money_mouth" />
- <java-symbol type="drawable" name="emo_im_sad" />
- <java-symbol type="drawable" name="emo_im_surprised" />
- <java-symbol type="drawable" name="emo_im_tongue_sticking_out" />
- <java-symbol type="drawable" name="emo_im_undecided" />
- <java-symbol type="drawable" name="emo_im_winking" />
- <java-symbol type="drawable" name="emo_im_wtf" />
- <java-symbol type="drawable" name="emo_im_yelling" />
- <java-symbol type="drawable" name="expander_close_holo_dark" />
- <java-symbol type="drawable" name="expander_open_holo_dark" />
- <java-symbol type="drawable" name="ic_audio_alarm" />
- <java-symbol type="drawable" name="ic_audio_alarm_mute" />
- <java-symbol type="drawable" name="ic_audio_bt" />
- <java-symbol type="drawable" name="ic_audio_bt_mute" />
- <java-symbol type="drawable" name="ic_audio_notification" />
- <java-symbol type="drawable" name="ic_audio_notification_mute" />
- <java-symbol type="drawable" name="ic_audio_phone" />
- <java-symbol type="drawable" name="ic_audio_ring_notif" />
- <java-symbol type="drawable" name="ic_audio_ring_notif_mute" />
- <java-symbol type="drawable" name="ic_audio_ring_notif_vibrate" />
- <java-symbol type="drawable" name="ic_audio_vol" />
- <java-symbol type="drawable" name="ic_audio_vol_mute" />
- <java-symbol type="drawable" name="ic_bullet_key_permission" />
- <java-symbol type="drawable" name="ic_contact_picture" />
- <java-symbol type="drawable" name="ic_dialog_usb" />
- <java-symbol type="drawable" name="ic_emergency" />
- <java-symbol type="drawable" name="ic_media_stop" />
- <java-symbol type="drawable" name="ic_text_dot" />
- <java-symbol type="drawable" name="indicator_code_lock_drag_direction_green_up" />
- <java-symbol type="drawable" name="indicator_code_lock_drag_direction_red_up" />
- <java-symbol type="drawable" name="indicator_code_lock_point_area_default_holo" />
- <java-symbol type="drawable" name="indicator_code_lock_point_area_green_holo" />
- <java-symbol type="drawable" name="indicator_code_lock_point_area_red_holo" />
- <java-symbol type="drawable" name="jog_dial_arrow_long_left_green" />
- <java-symbol type="drawable" name="jog_dial_arrow_long_right_red" />
- <java-symbol type="drawable" name="jog_dial_arrow_short_left_and_right" />
- <java-symbol type="drawable" name="jog_dial_bg" />
- <java-symbol type="drawable" name="jog_dial_dimple" />
- <java-symbol type="drawable" name="jog_dial_dimple_dim" />
- <java-symbol type="drawable" name="jog_tab_bar_left_generic" />
- <java-symbol type="drawable" name="jog_tab_bar_right_generic" />
- <java-symbol type="drawable" name="jog_tab_left_generic" />
- <java-symbol type="drawable" name="jog_tab_right_generic" />
- <java-symbol type="drawable" name="jog_tab_target_gray" />
- <java-symbol type="drawable" name="picture_emergency" />
- <java-symbol type="drawable" name="platlogo" />
- <java-symbol type="drawable" name="platlogo_alt" />
- <java-symbol type="drawable" name="stat_notify_sync_error" />
- <java-symbol type="drawable" name="stat_notify_wifi_in_range" />
- <java-symbol type="drawable" name="stat_sys_gps_on" />
- <java-symbol type="drawable" name="stat_sys_tether_wifi" />
- <java-symbol type="drawable" name="status_bar_background" />
- <java-symbol type="drawable" name="sym_keyboard_shift" />
- <java-symbol type="drawable" name="sym_keyboard_shift_locked" />
- <java-symbol type="drawable" name="tab_bottom_left" />
- <java-symbol type="drawable" name="tab_bottom_left_v4" />
- <java-symbol type="drawable" name="tab_bottom_right" />
- <java-symbol type="drawable" name="tab_bottom_right_v4" />
- <java-symbol type="drawable" name="tab_indicator_v4" />
- <java-symbol type="drawable" name="text_select_handle_left" />
- <java-symbol type="drawable" name="text_select_handle_middle" />
- <java-symbol type="drawable" name="text_select_handle_right" />
- <java-symbol type="drawable" name="unknown_image" />
- <java-symbol type="drawable" name="unlock_default" />
- <java-symbol type="drawable" name="unlock_halo" />
- <java-symbol type="drawable" name="unlock_ring" />
- <java-symbol type="drawable" name="unlock_wave" />
- <java-symbol type="drawable" name="ic_lockscreen_camera" />
- <java-symbol type="drawable" name="ic_lockscreen_silent" />
- <java-symbol type="drawable" name="ic_lockscreen_unlock" />
- <java-symbol type="drawable" name="ic_action_assist_generic" />
- <java-symbol type="drawable" name="notification_bg" />
- <java-symbol type="drawable" name="notification_bg_low" />
- <java-symbol type="drawable" name="notification_template_icon_bg" />
- <java-symbol type="drawable" name="notification_template_icon_low_bg" />
- <java-symbol type="drawable" name="ic_lockscreen_unlock_phantom" />
- <java-symbol type="drawable" name="ic_media_route_on_holo_dark" />
- <java-symbol type="drawable" name="ic_media_route_disabled_holo_dark" />
-
- <java-symbol type="layout" name="action_bar_home" />
- <java-symbol type="layout" name="action_bar_title_item" />
- <java-symbol type="layout" name="action_menu_item_layout" />
- <java-symbol type="layout" name="action_menu_layout" />
- <java-symbol type="layout" name="action_mode_close_item" />
- <java-symbol type="layout" name="alert_dialog" />
- <java-symbol type="layout" name="choose_account" />
- <java-symbol type="layout" name="choose_account_row" />
- <java-symbol type="layout" name="choose_account_type" />
- <java-symbol type="layout" name="choose_type_and_account" />
- <java-symbol type="layout" name="grant_credentials_permission" />
- <java-symbol type="layout" name="number_picker" />
- <java-symbol type="layout" name="permissions_package_list_item" />
- <java-symbol type="layout" name="popup_menu_item_layout" />
- <java-symbol type="layout" name="remote_views_adapter_default_loading_view" />
- <java-symbol type="layout" name="search_bar" />
- <java-symbol type="layout" name="search_dropdown_item_icons_2line" />
- <java-symbol type="layout" name="search_view" />
- <java-symbol type="layout" name="select_dialog" />
- <java-symbol type="layout" name="simple_dropdown_hint" />
- <java-symbol type="layout" name="status_bar_latest_event_content" />
- <java-symbol type="layout" name="status_bar_latest_event_ticker" />
- <java-symbol type="layout" name="status_bar_latest_event_ticker_large_icon" />
- <java-symbol type="layout" name="text_edit_action_popup_text" />
- <java-symbol type="layout" name="text_drag_thumbnail" />
- <java-symbol type="layout" name="typing_filter" />
- <java-symbol type="layout" name="activity_chooser_view" />
- <java-symbol type="layout" name="activity_chooser_view_list_item" />
- <java-symbol type="layout" name="activity_list" />
- <java-symbol type="layout" name="activity_list_item_2" />
- <java-symbol type="layout" name="alert_dialog_progress" />
- <java-symbol type="layout" name="always_use_checkbox" />
- <java-symbol type="layout" name="app_permission_item" />
- <java-symbol type="layout" name="app_permission_item_old" />
- <java-symbol type="layout" name="app_perms_summary" />
- <java-symbol type="layout" name="calendar_view" />
- <java-symbol type="layout" name="character_picker" />
- <java-symbol type="layout" name="character_picker_button" />
- <java-symbol type="layout" name="date_picker" />
- <java-symbol type="layout" name="date_picker_dialog" />
- <java-symbol type="layout" name="expanded_menu_layout" />
- <java-symbol type="layout" name="fragment_bread_crumb_item" />
- <java-symbol type="layout" name="fragment_bread_crumbs" />
- <java-symbol type="layout" name="heavy_weight_switcher" />
- <java-symbol type="layout" name="icon_menu_item_layout" />
- <java-symbol type="layout" name="icon_menu_layout" />
- <java-symbol type="layout" name="input_method" />
- <java-symbol type="layout" name="input_method_extract_view" />
- <java-symbol type="layout" name="input_method_switch_dialog_title" />
- <java-symbol type="layout" name="js_prompt" />
- <java-symbol type="layout" name="list_content_simple" />
- <java-symbol type="layout" name="list_menu_item_checkbox" />
- <java-symbol type="layout" name="list_menu_item_icon" />
- <java-symbol type="layout" name="list_menu_item_layout" />
- <java-symbol type="layout" name="list_menu_item_radio" />
- <java-symbol type="layout" name="locale_picker_item" />
- <java-symbol type="layout" name="media_controller" />
- <java-symbol type="layout" name="overlay_display_window" />
- <java-symbol type="layout" name="preference" />
- <java-symbol type="layout" name="preference_header_item" />
- <java-symbol type="layout" name="preference_list_content" />
- <java-symbol type="layout" name="preference_list_content_single" />
- <java-symbol type="layout" name="preference_list_fragment" />
- <java-symbol type="layout" name="preference_widget_seekbar" />
- <java-symbol type="layout" name="progress_dialog" />
- <java-symbol type="layout" name="resolve_list_item" />
- <java-symbol type="layout" name="seekbar_dialog" />
- <java-symbol type="layout" name="select_dialog_singlechoice_holo" />
- <java-symbol type="layout" name="ssl_certificate" />
- <java-symbol type="layout" name="tab_content" />
- <java-symbol type="layout" name="tab_indicator_holo" />
- <java-symbol type="layout" name="textview_hint" />
- <java-symbol type="layout" name="time_picker" />
- <java-symbol type="layout" name="time_picker_dialog" />
- <java-symbol type="layout" name="transient_notification" />
- <java-symbol type="layout" name="volume_adjust" />
- <java-symbol type="layout" name="volume_adjust_item" />
- <java-symbol type="layout" name="web_text_view_dropdown" />
- <java-symbol type="layout" name="webview_find" />
- <java-symbol type="layout" name="webview_select_singlechoice" />
- <java-symbol type="layout" name="wifi_p2p_dialog" />
- <java-symbol type="layout" name="wifi_p2p_dialog_row" />
- <java-symbol type="layout" name="zoom_container" />
- <java-symbol type="layout" name="zoom_controls" />
- <java-symbol type="layout" name="zoom_magnify" />
- <java-symbol type="layout" name="notification_action" />
- <java-symbol type="layout" name="notification_action_tombstone" />
- <java-symbol type="layout" name="notification_intruder_content" />
- <java-symbol type="layout" name="notification_template_base" />
- <java-symbol type="layout" name="notification_template_big_base" />
- <java-symbol type="layout" name="notification_template_big_picture" />
- <java-symbol type="layout" name="notification_template_big_text" />
- <java-symbol type="layout" name="notification_template_part_time" />
- <java-symbol type="layout" name="notification_template_part_chronometer" />
- <java-symbol type="layout" name="notification_template_inbox" />
- <java-symbol type="layout" name="keyguard_multi_user_avatar" />
- <java-symbol type="layout" name="keyguard_multi_user_selector_widget" />
-
- <java-symbol type="anim" name="slide_in_child_bottom" />
- <java-symbol type="anim" name="slide_in_right" />
- <java-symbol type="anim" name="slide_out_left" />
-
- <java-symbol type="menu" name="webview_copy" />
- <java-symbol type="menu" name="webview_find" />
-
- <java-symbol type="xml" name="password_kbd_qwerty" />
- <java-symbol type="xml" name="autotext" />
- <java-symbol type="xml" name="eri" />
- <java-symbol type="xml" name="password_kbd_numeric" />
- <java-symbol type="xml" name="password_kbd_qwerty_shifted" />
- <java-symbol type="xml" name="password_kbd_symbols" />
- <java-symbol type="xml" name="password_kbd_symbols_shift" />
- <java-symbol type="xml" name="power_profile" />
- <java-symbol type="xml" name="time_zones_by_country" />
- <java-symbol type="xml" name="sms_short_codes" />
-
- <java-symbol type="raw" name="accessibility_gestures" />
- <java-symbol type="raw" name="incognito_mode_start_page" />
- <java-symbol type="raw" name="loaderror" />
- <java-symbol type="raw" name="nodomain" />
-
- <java-symbol type="style" name="Animation.DropDownUp" />
- <java-symbol type="style" name="Animation.DropDownDown" />
- <java-symbol type="style" name="Animation.PopupWindow" />
- <java-symbol type="style" name="Animation.TypingFilter" />
- <java-symbol type="style" name="Animation.TypingFilterRestore" />
- <java-symbol type="style" name="Animation.Dream" />
- <java-symbol type="style" name="Theme.DeviceDefault.Dialog.Alert" />
- <java-symbol type="style" name="Theme.DeviceDefault.Light.Dialog.Alert" />
- <java-symbol type="style" name="Theme.Dialog.Alert" />
- <java-symbol type="style" name="Theme.Holo.Dialog.Alert" />
- <java-symbol type="style" name="Theme.Holo.Light.Dialog.Alert" />
- <java-symbol type="style" name="ActiveWallpaperSettings" />
- <java-symbol type="style" name="Animation.InputMethodFancy" />
- <java-symbol type="style" name="Animation.Wallpaper" />
- <java-symbol type="style" name="Animation.ZoomButtons" />
- <java-symbol type="style" name="PreviewWallpaperSettings" />
- <java-symbol type="style" name="TextAppearance.SlidingTabActive" />
- <java-symbol type="style" name="TextAppearance.SlidingTabNormal" />
- <java-symbol type="style" name="Theme.DeviceDefault.Dialog.NoFrame" />
- <java-symbol type="style" name="Theme.IconMenu" />
- <java-symbol type="style" name="Theme.Panel.Volume" />
-
- <java-symbol type="attr" name="mediaRouteButtonStyle" />
- <java-symbol type="attr" name="externalRouteEnabledDrawable" />
- <java-symbol type="id" name="extended_settings" />
- <java-symbol type="id" name="check" />
- <java-symbol type="id" name="volume_slider" />
- <java-symbol type="id" name="volume_icon" />
- <java-symbol type="drawable" name="ic_media_route_on_holo_dark" />
- <java-symbol type="layout" name="media_route_chooser_layout" />
- <java-symbol type="layout" name="media_route_list_item_top_header" />
- <java-symbol type="layout" name="media_route_list_item_section_header" />
- <java-symbol type="layout" name="media_route_list_item" />
- <java-symbol type="layout" name="media_route_list_item_checkable" />
- <java-symbol type="layout" name="media_route_list_item_collapse_group" />
- <java-symbol type="string" name="bluetooth_a2dp_audio_route_name" />
-
- <!-- From android.policy -->
- <java-symbol type="anim" name="app_starting_exit" />
- <java-symbol type="anim" name="lock_screen_behind_enter" />
- <java-symbol type="anim" name="lock_screen_wallpaper_behind_enter" />
- <java-symbol type="anim" name="dock_top_enter" />
- <java-symbol type="anim" name="dock_top_exit" />
- <java-symbol type="anim" name="dock_bottom_enter" />
- <java-symbol type="anim" name="dock_bottom_exit" />
- <java-symbol type="anim" name="dock_left_enter" />
- <java-symbol type="anim" name="dock_left_exit" />
- <java-symbol type="anim" name="dock_right_enter" />
- <java-symbol type="anim" name="dock_right_exit" />
- <java-symbol type="anim" name="keyguard_security_animate_in" />
- <java-symbol type="anim" name="keyguard_security_animate_out" />
- <java-symbol type="anim" name="keyguard_security_fade_in" />
- <java-symbol type="anim" name="keyguard_security_fade_out" />
- <java-symbol type="array" name="config_keyboardTapVibePattern" />
- <java-symbol type="array" name="config_longPressVibePattern" />
- <java-symbol type="array" name="config_safeModeDisabledVibePattern" />
- <java-symbol type="array" name="config_safeModeEnabledVibePattern" />
- <java-symbol type="array" name="config_virtualKeyVibePattern" />
- <java-symbol type="array" name="lockscreen_targets_when_silent" />
- <java-symbol type="array" name="lockscreen_targets_when_soundon" />
- <java-symbol type="array" name="lockscreen_targets_with_camera" />
- <java-symbol type="attr" name="actionModePopupWindowStyle" />
- <java-symbol type="attr" name="dialogCustomTitleDecorLayout" />
- <java-symbol type="attr" name="dialogTitleDecorLayout" />
- <java-symbol type="attr" name="dialogTitleIconsDecorLayout" />
- <java-symbol type="bool" name="config_allowAllRotations" />
- <java-symbol type="bool" name="config_annoy_dianne" />
- <java-symbol type="bool" name="config_carDockEnablesAccelerometer" />
- <java-symbol type="bool" name="config_deskDockEnablesAccelerometer" />
- <java-symbol type="bool" name="config_disableMenuKeyInLockScreen" />
- <java-symbol type="bool" name="config_enableLockBeforeUnlockScreen" />
- <java-symbol type="bool" name="config_enableLockScreenRotation" />
- <java-symbol type="bool" name="config_lidControlsSleep" />
- <java-symbol type="bool" name="config_reverseDefaultRotation" />
- <java-symbol type="bool" name="config_showNavigationBar" />
- <java-symbol type="bool" name="target_honeycomb_needs_options_menu" />
- <java-symbol type="dimen" name="navigation_bar_height" />
- <java-symbol type="dimen" name="navigation_bar_height_landscape" />
- <java-symbol type="dimen" name="navigation_bar_width" />
- <java-symbol type="dimen" name="status_bar_height" />
- <java-symbol type="dimen" name="kg_widget_page_padding" />
- <java-symbol type="drawable" name="ic_jog_dial_sound_off" />
- <java-symbol type="drawable" name="ic_jog_dial_sound_on" />
- <java-symbol type="drawable" name="ic_jog_dial_unlock" />
- <java-symbol type="drawable" name="ic_jog_dial_vibrate_on" />
- <java-symbol type="drawable" name="ic_lock_airplane_mode" />
- <java-symbol type="drawable" name="ic_lock_airplane_mode_off" />
- <java-symbol type="drawable" name="ic_menu_cc" />
- <java-symbol type="drawable" name="jog_tab_bar_left_unlock" />
- <java-symbol type="drawable" name="jog_tab_bar_right_sound_off" />
- <java-symbol type="drawable" name="jog_tab_bar_right_sound_on" />
- <java-symbol type="drawable" name="jog_tab_left_unlock" />
- <java-symbol type="drawable" name="jog_tab_right_sound_off" />
- <java-symbol type="drawable" name="jog_tab_right_sound_on" />
- <java-symbol type="drawable" name="jog_tab_target_green" />
- <java-symbol type="drawable" name="jog_tab_target_yellow" />
- <java-symbol type="drawable" name="magnified_region_frame" />
- <java-symbol type="drawable" name="menu_background" />
- <java-symbol type="drawable" name="stat_sys_secure" />
- <java-symbol type="drawable" name="kg_widget_overscroll_layer_left" />
- <java-symbol type="drawable" name="kg_widget_overscroll_layer_right" />
- <java-symbol type="id" name="action_mode_bar_stub" />
- <java-symbol type="id" name="alarm_status" />
- <java-symbol type="id" name="backspace" />
- <java-symbol type="id" name="button0" />
- <java-symbol type="id" name="button4" />
- <java-symbol type="id" name="button5" />
- <java-symbol type="id" name="button6" />
- <java-symbol type="id" name="button7" />
- <java-symbol type="id" name="carrier" />
- <java-symbol type="id" name="date" />
- <java-symbol type="id" name="eight" />
- <java-symbol type="id" name="emergencyCallButton" />
- <java-symbol type="id" name="face_unlock_area_view" />
- <java-symbol type="id" name="five" />
- <java-symbol type="id" name="forgotPatternButton" />
- <java-symbol type="id" name="four" />
- <java-symbol type="id" name="headerText" />
- <java-symbol type="id" name="icon_menu_presenter" />
- <java-symbol type="id" name="instructions" />
- <java-symbol type="id" name="keyboard" />
- <java-symbol type="id" name="list_menu_presenter" />
- <java-symbol type="id" name="lockPattern" />
- <java-symbol type="id" name="lock_screen" />
- <java-symbol type="id" name="login" />
- <java-symbol type="id" name="nine" />
- <java-symbol type="id" name="no_applications_message" />
- <java-symbol type="id" name="ok" />
- <java-symbol type="id" name="one" />
- <java-symbol type="id" name="option1" />
- <java-symbol type="id" name="option2" />
- <java-symbol type="id" name="option3" />
- <java-symbol type="id" name="password" />
- <java-symbol type="id" name="passwordEntry" />
- <java-symbol type="id" name="pinDel" />
- <java-symbol type="id" name="pinDisplay" />
- <java-symbol type="id" name="owner_info" />
- <java-symbol type="id" name="pukDel" />
- <java-symbol type="id" name="pukDisplay" />
- <java-symbol type="id" name="right_icon" />
- <java-symbol type="id" name="seven" />
- <java-symbol type="id" name="six" />
- <java-symbol type="id" name="status" />
- <java-symbol type="id" name="status1" />
- <java-symbol type="id" name="switch_ime_button" />
- <java-symbol type="id" name="three" />
- <java-symbol type="id" name="title_container" />
- <java-symbol type="id" name="topHeader" />
- <java-symbol type="id" name="transport" />
- <java-symbol type="id" name="transport_bg_protect" />
- <java-symbol type="id" name="two" />
- <java-symbol type="id" name="unlock_widget" />
- <java-symbol type="id" name="zero" />
- <java-symbol type="id" name="keyguard_message_area" />
- <java-symbol type="id" name="keyguard_click_area" />
- <java-symbol type="id" name="keyguard_selector_view" />
- <java-symbol type="id" name="keyguard_pattern_view" />
- <java-symbol type="id" name="keyguard_password_view" />
- <java-symbol type="id" name="keyguard_face_unlock_view" />
- <java-symbol type="id" name="keyguard_sim_pin_view" />
- <java-symbol type="id" name="keyguard_sim_puk_view" />
- <java-symbol type="id" name="keyguard_account_view" />
- <java-symbol type="id" name="app_widget_container" />
- <java-symbol type="id" name="view_flipper" />
- <java-symbol type="id" name="emergency_call_button" />
- <java-symbol type="id" name="keyguard_host_view" />
- <java-symbol type="id" name="delete_button" />
- <java-symbol type="id" name="lockPatternView" />
- <java-symbol type="id" name="forgot_password_button" />
- <java-symbol type="id" name="glow_pad_view" />
- <java-symbol type="id" name="sim_pin_entry" />
- <java-symbol type="id" name="delete_button" />
- <java-symbol type="id" name="sim_puk_entry" />
- <java-symbol type="id" name="sim_pin_entry" />
- <java-symbol type="id" name="puk_delete_button" />
- <java-symbol type="id" name="pin_delete_button" />
- <java-symbol type="id" name="keyguard_user_avatar" />
- <java-symbol type="id" name="keyguard_user_name" />
- <java-symbol type="id" name="keyguard_active_user" />
- <java-symbol type="id" name="keyguard_inactive_users" />
- <java-symbol type="integer" name="config_carDockRotation" />
- <java-symbol type="integer" name="config_defaultUiModeType" />
- <java-symbol type="integer" name="config_deskDockRotation" />
- <java-symbol type="integer" name="config_lidKeyboardAccessibility" />
- <java-symbol type="integer" name="config_lidNavigationAccessibility" />
- <java-symbol type="integer" name="config_lidOpenRotation" />
- <java-symbol type="integer" name="config_longPressOnHomeBehavior" />
- <java-symbol type="integer" name="kg_security_flip_duration" />
- <java-symbol type="layout" name="global_actions_item" />
- <java-symbol type="layout" name="global_actions_silent_mode" />
- <java-symbol type="layout" name="keyguard_screen_glogin_unlock" />
- <java-symbol type="layout" name="keyguard_screen_password_landscape" />
- <java-symbol type="layout" name="keyguard_screen_password_portrait" />
- <java-symbol type="layout" name="keyguard_screen_sim_pin_landscape" />
- <java-symbol type="layout" name="keyguard_screen_sim_pin_portrait" />
- <java-symbol type="layout" name="keyguard_screen_sim_puk_landscape" />
- <java-symbol type="layout" name="keyguard_screen_sim_puk_portrait" />
- <java-symbol type="layout" name="keyguard_screen_tab_unlock" />
- <java-symbol type="layout" name="keyguard_screen_tab_unlock_land" />
- <java-symbol type="layout" name="keyguard_screen_unlock_landscape" />
- <java-symbol type="layout" name="keyguard_screen_unlock_portrait" />
- <java-symbol type="layout" name="keyguard_selector_view" />
- <java-symbol type="layout" name="keyguard_pattern_view" />
- <java-symbol type="layout" name="keyguard_password_view" />
- <java-symbol type="layout" name="keyguard_face_unlock_view" />
- <java-symbol type="layout" name="keyguard_sim_pin_view" />
- <java-symbol type="layout" name="keyguard_sim_puk_view" />
- <java-symbol type="layout" name="keyguard_account_view" />
- <java-symbol type="layout" name="recent_apps_dialog" />
- <java-symbol type="layout" name="screen_action_bar" />
- <java-symbol type="layout" name="screen_action_bar_overlay" />
- <java-symbol type="layout" name="screen_custom_title" />
- <java-symbol type="layout" name="screen_progress" />
- <java-symbol type="layout" name="screen_simple" />
- <java-symbol type="layout" name="screen_simple_overlay_action_mode" />
- <java-symbol type="layout" name="screen_title" />
- <java-symbol type="layout" name="screen_title_icons" />
- <java-symbol type="layout" name="keyguard_host_view" />
- <java-symbol type="string" name="abbrev_wday_month_day_no_year" />
- <java-symbol type="string" name="android_upgrading_title" />
- <java-symbol type="string" name="bugreport_title" />
- <java-symbol type="string" name="bugreport_message" />
- <java-symbol type="string" name="faceunlock_multiple_failures" />
- <java-symbol type="string" name="global_action_power_off" />
- <java-symbol type="string" name="global_actions_airplane_mode_off_status" />
- <java-symbol type="string" name="global_actions_airplane_mode_on_status" />
- <java-symbol type="string" name="global_actions_toggle_airplane_mode" />
- <java-symbol type="string" name="global_action_bug_report" />
- <java-symbol type="string" name="global_action_silent_mode_off_status" />
- <java-symbol type="string" name="global_action_silent_mode_on_status" />
- <java-symbol type="string" name="global_action_toggle_silent_mode" />
- <java-symbol type="string" name="invalidPuk" />
- <java-symbol type="string" name="keyguard_password_enter_pin_code" />
- <java-symbol type="string" name="keyguard_password_enter_puk_code" />
- <java-symbol type="string" name="keyguard_password_wrong_pin_code" />
- <java-symbol type="string" name="lockscreen_carrier_default" />
- <java-symbol type="string" name="lockscreen_charged" />
- <java-symbol type="string" name="lockscreen_failed_attempts_almost_at_wipe" />
- <java-symbol type="string" name="lockscreen_failed_attempts_almost_glogin" />
- <java-symbol type="string" name="lockscreen_failed_attempts_now_wiping" />
- <java-symbol type="string" name="lockscreen_forgot_pattern_button_text" />
- <java-symbol type="string" name="lockscreen_glogin_checking_password" />
- <java-symbol type="string" name="lockscreen_glogin_forgot_pattern" />
- <java-symbol type="string" name="lockscreen_glogin_invalid_input" />
- <java-symbol type="string" name="lockscreen_glogin_too_many_attempts" />
- <java-symbol type="string" name="lockscreen_instructions_when_pattern_disabled" />
- <java-symbol type="string" name="lockscreen_low_battery" />
- <java-symbol type="string" name="lockscreen_missing_sim_instructions" />
- <java-symbol type="string" name="lockscreen_missing_sim_instructions_long" />
- <java-symbol type="string" name="lockscreen_missing_sim_message_short" />
- <java-symbol type="string" name="lockscreen_network_locked_message" />
- <java-symbol type="string" name="lockscreen_password_wrong" />
- <java-symbol type="string" name="lockscreen_pattern_instructions" />
- <java-symbol type="string" name="lockscreen_pattern_wrong" />
- <java-symbol type="string" name="lockscreen_permanent_disabled_sim_message_short" />
- <java-symbol type="string" name="lockscreen_permanent_disabled_sim_instructions" />
- <java-symbol type="string" name="lockscreen_plugged_in" />
- <java-symbol type="string" name="lockscreen_sim_locked_message" />
- <java-symbol type="string" name="lockscreen_sim_puk_locked_message" />
- <java-symbol type="string" name="lockscreen_sim_unlock_progress_dialog_message" />
- <java-symbol type="string" name="lockscreen_sound_off_label" />
- <java-symbol type="string" name="lockscreen_sound_on_label" />
- <java-symbol type="string" name="lockscreen_too_many_failed_attempts_countdown" />
- <java-symbol type="string" name="lockscreen_too_many_failed_attempts_dialog_message" />
- <java-symbol type="string" name="lockscreen_too_many_failed_password_attempts_dialog_message" />
- <java-symbol type="string" name="lockscreen_too_many_failed_pin_attempts_dialog_message" />
- <java-symbol type="string" name="lockscreen_unlock_label" />
- <java-symbol type="string" name="status_bar_device_locked" />
- <java-symbol type="style" name="Animation.LockScreen" />
- <java-symbol type="style" name="Theme.Dialog.RecentApplications" />
- <java-symbol type="style" name="Theme.ExpandedMenu" />
- <java-symbol type="string" name="kg_emergency_call_label" />
- <java-symbol type="string" name="kg_forgot_pattern_button_text" />
- <java-symbol type="string" name="kg_wrong_pattern" />
- <java-symbol type="string" name="kg_wrong_password" />
- <java-symbol type="string" name="kg_wrong_pin" />
- <java-symbol type="string" name="kg_too_many_failed_attempts_countdown" />
- <java-symbol type="string" name="kg_pattern_instructions" />
- <java-symbol type="string" name="kg_sim_pin_instructions" />
- <java-symbol type="string" name="kg_pin_instructions" />
- <java-symbol type="string" name="kg_password_instructions" />
- <java-symbol type="string" name="kg_puk_enter_puk_hint" />
- <java-symbol type="string" name="kg_puk_enter_pin_hint" />
- <java-symbol type="string" name="kg_sim_unlock_progress_dialog_message" />
- <java-symbol type="string" name="kg_password_wrong_pin_code" />
- <java-symbol type="string" name="kg_invalid_sim_pin_hint" />
- <java-symbol type="string" name="kg_invalid_sim_puk_hint" />
- <java-symbol type="string" name="kg_sim_puk_recovery_hint" />
- <java-symbol type="string" name="kg_invalid_puk" />
- <java-symbol type="string" name="kg_login_too_many_attempts" />
- <java-symbol type="string" name="kg_login_instructions" />
- <java-symbol type="string" name="kg_login_username_hint" />
- <java-symbol type="string" name="kg_login_password_hint" />
- <java-symbol type="string" name="kg_login_submit_button" />
- <java-symbol type="string" name="kg_login_invalid_input" />
- <java-symbol type="string" name="kg_login_account_recovery_hint" />
- <java-symbol type="string" name="kg_login_checking_password" />
- <java-symbol type="string" name="kg_too_many_failed_pin_attempts_dialog_message" />
- <java-symbol type="string" name="kg_too_many_failed_pattern_attempts_dialog_message" />
- <java-symbol type="string" name="kg_too_many_failed_password_attempts_dialog_message" />
- <java-symbol type="string" name="kg_failed_attempts_almost_at_wipe" />
- <java-symbol type="string" name="kg_failed_attempts_now_wiping" />
- <java-symbol type="string" name="kg_failed_attempts_almost_at_login" />
-
- <!-- From services -->
- <java-symbol type="anim" name="screen_rotate_0_enter" />
- <java-symbol type="anim" name="screen_rotate_0_exit" />
- <java-symbol type="anim" name="screen_rotate_0_frame" />
- <java-symbol type="anim" name="screen_rotate_180_enter" />
- <java-symbol type="anim" name="screen_rotate_180_exit" />
- <java-symbol type="anim" name="screen_rotate_180_frame" />
- <java-symbol type="anim" name="screen_rotate_finish_enter" />
- <java-symbol type="anim" name="screen_rotate_finish_exit" />
- <java-symbol type="anim" name="screen_rotate_finish_frame" />
- <java-symbol type="anim" name="screen_rotate_minus_90_enter" />
- <java-symbol type="anim" name="screen_rotate_minus_90_exit" />
- <java-symbol type="anim" name="screen_rotate_minus_90_frame" />
- <java-symbol type="anim" name="screen_rotate_plus_90_enter" />
- <java-symbol type="anim" name="screen_rotate_plus_90_exit" />
- <java-symbol type="anim" name="screen_rotate_plus_90_frame" />
- <java-symbol type="anim" name="screen_rotate_start_enter" />
- <java-symbol type="anim" name="screen_rotate_start_exit" />
- <java-symbol type="anim" name="screen_rotate_start_frame" />
- <java-symbol type="anim" name="window_move_from_decor" />
- <java-symbol type="array" name="config_autoBrightnessButtonBacklightValues" />
- <java-symbol type="array" name="config_autoBrightnessKeyboardBacklightValues" />
- <java-symbol type="array" name="config_autoBrightnessLcdBacklightValues" />
- <java-symbol type="array" name="config_autoBrightnessLevels" />
- <java-symbol type="array" name="config_protectedNetworks" />
- <java-symbol type="array" name="config_statusBarIcons" />
- <java-symbol type="array" name="config_tether_bluetooth_regexs" />
- <java-symbol type="array" name="config_tether_dhcp_range" />
- <java-symbol type="array" name="config_tether_upstream_types" />
- <java-symbol type="array" name="config_tether_usb_regexs" />
- <java-symbol type="array" name="config_tether_wifi_regexs" />
- <java-symbol type="array" name="config_usbHostBlacklist" />
- <java-symbol type="array" name="config_serialPorts" />
- <java-symbol type="array" name="radioAttributes" />
- <java-symbol type="array" name="config_oemUsbModeOverride" />
- <java-symbol type="array" name="config_locationProviderPackageNames" />
- <java-symbol type="array" name="config_overlay_locationProviderPackageNames" />
- <java-symbol type="bool" name="config_animateScreenLights" />
- <java-symbol type="bool" name="config_automatic_brightness_available" />
- <java-symbol type="bool" name="config_sf_limitedAlpha" />
- <java-symbol type="bool" name="config_unplugTurnsOnScreen" />
- <java-symbol type="bool" name="config_wifi_background_scan_support" />
- <java-symbol type="bool" name="config_wifi_dual_band_support" />
- <java-symbol type="bool" name="config_wimaxEnabled" />
- <java-symbol type="bool" name="show_ongoing_ime_switcher" />
- <java-symbol type="color" name="config_defaultNotificationColor" />
- <java-symbol type="drawable" name="ic_notification_ime_default" />
- <java-symbol type="drawable" name="stat_notify_car_mode" />
- <java-symbol type="drawable" name="stat_notify_disabled" />
- <java-symbol type="drawable" name="stat_notify_disk_full" />
- <java-symbol type="drawable" name="stat_sys_adb" />
- <java-symbol type="drawable" name="stat_sys_battery" />
- <java-symbol type="drawable" name="stat_sys_battery_charge" />
- <java-symbol type="drawable" name="stat_sys_battery_unknown" />
- <java-symbol type="drawable" name="stat_sys_data_usb" />
- <java-symbol type="drawable" name="stat_sys_tether_bluetooth" />
- <java-symbol type="drawable" name="stat_sys_tether_general" />
- <java-symbol type="drawable" name="stat_sys_tether_usb" />
- <java-symbol type="drawable" name="stat_sys_throttled" />
- <java-symbol type="drawable" name="vpn_connected" />
- <java-symbol type="drawable" name="vpn_disconnected" />
- <java-symbol type="id" name="ask_checkbox" />
- <java-symbol type="id" name="compat_checkbox" />
- <java-symbol type="id" name="original_app_icon" />
- <java-symbol type="id" name="original_message" />
- <java-symbol type="id" name="radio" />
- <java-symbol type="id" name="reask_hint" />
- <java-symbol type="id" name="replace_app_icon" />
- <java-symbol type="id" name="replace_message" />
- <java-symbol type="fraction" name="config_dimBehindFadeDuration" />
- <java-symbol type="integer" name="config_carDockKeepsScreenOn" />
- <java-symbol type="integer" name="config_criticalBatteryWarningLevel" />
- <java-symbol type="integer" name="config_datause_notification_type" />
- <java-symbol type="integer" name="config_datause_polling_period_sec" />
- <java-symbol type="integer" name="config_datause_threshold_bytes" />
- <java-symbol type="integer" name="config_datause_throttle_kbitsps" />
- <java-symbol type="integer" name="config_defaultNotificationLedOff" />
- <java-symbol type="integer" name="config_defaultNotificationLedOn" />
- <java-symbol type="integer" name="config_deskDockKeepsScreenOn" />
- <java-symbol type="integer" name="config_lightSensorWarmupTime" />
- <java-symbol type="integer" name="config_lowBatteryCloseWarningLevel" />
- <java-symbol type="integer" name="config_lowBatteryWarningLevel" />
- <java-symbol type="integer" name="config_networkPolicyDefaultWarning" />
- <java-symbol type="integer" name="config_networkTransitionTimeout" />
- <java-symbol type="integer" name="config_notificationsBatteryFullARGB" />
- <java-symbol type="integer" name="config_notificationsBatteryLedOff" />
- <java-symbol type="integer" name="config_notificationsBatteryLedOn" />
- <java-symbol type="integer" name="config_notificationsBatteryLowARGB" />
- <java-symbol type="integer" name="config_notificationsBatteryMediumARGB" />
- <java-symbol type="integer" name="config_radioScanningTimeout" />
- <java-symbol type="integer" name="config_screenBrightnessSettingMinimum" />
- <java-symbol type="integer" name="config_screenBrightnessSettingMaximum" />
- <java-symbol type="integer" name="config_screenBrightnessSettingDefault" />
- <java-symbol type="integer" name="config_screenBrightnessDim" />
- <java-symbol type="integer" name="config_shutdownBatteryTemperature" />
- <java-symbol type="integer" name="config_virtualKeyQuietTimeMillis" />
- <java-symbol type="layout" name="am_compat_mode_dialog" />
- <java-symbol type="layout" name="launch_warning" />
- <java-symbol type="layout" name="safe_mode" />
- <java-symbol type="layout" name="simple_list_item_2_single_choice" />
- <java-symbol type="plurals" name="wifi_available" />
- <java-symbol type="plurals" name="wifi_available_detailed" />
- <java-symbol type="string" name="accessibility_binding_label" />
- <java-symbol type="string" name="adb_active_notification_message" />
- <java-symbol type="string" name="adb_active_notification_title" />
- <java-symbol type="string" name="aerr_application" />
- <java-symbol type="string" name="aerr_process" />
- <java-symbol type="string" name="aerr_title" />
- <java-symbol type="string" name="android_upgrading_apk" />
- <java-symbol type="string" name="android_upgrading_complete" />
- <java-symbol type="string" name="android_upgrading_starting_apps" />
- <java-symbol type="string" name="anr_activity_application" />
- <java-symbol type="string" name="anr_activity_process" />
- <java-symbol type="string" name="anr_application_process" />
- <java-symbol type="string" name="anr_process" />
- <java-symbol type="string" name="anr_title" />
- <java-symbol type="string" name="car_mode_disable_notification_message" />
- <java-symbol type="string" name="car_mode_disable_notification_title" />
- <java-symbol type="string" name="chooser_wallpaper" />
- <java-symbol type="string" name="config_datause_iface" />
- <java-symbol type="string" name="config_wimaxManagerClassname" />
- <java-symbol type="string" name="config_wimaxNativeLibLocation" />
- <java-symbol type="string" name="config_wimaxServiceClassname" />
- <java-symbol type="string" name="config_wimaxServiceJarLocation" />
- <java-symbol type="string" name="config_wimaxStateTrackerClassname" />
- <java-symbol type="string" name="configure_input_methods" />
- <java-symbol type="string" name="data_usage_3g_limit_snoozed_title" />
- <java-symbol type="string" name="data_usage_3g_limit_title" />
- <java-symbol type="string" name="data_usage_4g_limit_snoozed_title" />
- <java-symbol type="string" name="data_usage_4g_limit_title" />
- <java-symbol type="string" name="data_usage_limit_body" />
- <java-symbol type="string" name="data_usage_limit_snoozed_body" />
- <java-symbol type="string" name="data_usage_mobile_limit_snoozed_title" />
- <java-symbol type="string" name="data_usage_mobile_limit_title" />
- <java-symbol type="string" name="data_usage_restricted_body" />
- <java-symbol type="string" name="data_usage_restricted_title" />
- <java-symbol type="string" name="data_usage_warning_body" />
- <java-symbol type="string" name="data_usage_warning_title" />
- <java-symbol type="string" name="data_usage_wifi_limit_snoozed_title" />
- <java-symbol type="string" name="data_usage_wifi_limit_title" />
- <java-symbol type="string" name="default_wallpaper_component" />
- <java-symbol type="string" name="dlg_ok" />
- <java-symbol type="string" name="factorytest_failed" />
- <java-symbol type="string" name="factorytest_no_action" />
- <java-symbol type="string" name="factorytest_not_system" />
- <java-symbol type="string" name="factorytest_reboot" />
- <java-symbol type="string" name="hardware" />
- <java-symbol type="string" name="heavy_weight_notification" />
- <java-symbol type="string" name="heavy_weight_notification_detail" />
- <java-symbol type="string" name="input_method_binding_label" />
- <java-symbol type="string" name="launch_warning_original" />
- <java-symbol type="string" name="launch_warning_replace" />
- <java-symbol type="string" name="launch_warning_title" />
- <java-symbol type="string" name="low_internal_storage_view_text" />
- <java-symbol type="string" name="low_internal_storage_view_title" />
- <java-symbol type="string" name="report" />
- <java-symbol type="string" name="select_input_method" />
- <java-symbol type="string" name="select_keyboard_layout_notification_title" />
- <java-symbol type="string" name="select_keyboard_layout_notification_message" />
- <java-symbol type="string" name="smv_application" />
- <java-symbol type="string" name="smv_process" />
- <java-symbol type="string" name="tethered_notification_message" />
- <java-symbol type="string" name="tethered_notification_title" />
- <java-symbol type="string" name="throttle_warning_notification_message" />
- <java-symbol type="string" name="throttle_warning_notification_title" />
- <java-symbol type="string" name="throttled_notification_message" />
- <java-symbol type="string" name="throttled_notification_title" />
- <java-symbol type="string" name="usb_accessory_notification_title" />
- <java-symbol type="string" name="usb_cd_installer_notification_title" />
- <java-symbol type="string" name="usb_mtp_notification_title" />
- <java-symbol type="string" name="usb_notification_message" />
- <java-symbol type="string" name="use_physical_keyboard" />
- <java-symbol type="string" name="usb_ptp_notification_title" />
- <java-symbol type="string" name="vpn_text" />
- <java-symbol type="string" name="vpn_text_long" />
- <java-symbol type="string" name="vpn_title" />
- <java-symbol type="string" name="vpn_title_long" />
- <java-symbol type="string" name="vpn_lockdown_connecting" />
- <java-symbol type="string" name="vpn_lockdown_connected" />
- <java-symbol type="string" name="vpn_lockdown_error" />
- <java-symbol type="string" name="vpn_lockdown_reset" />
- <java-symbol type="string" name="wallpaper_binding_label" />
- <java-symbol type="style" name="Theme.Dialog.AppError" />
- <java-symbol type="style" name="Theme.Toast" />
- <java-symbol type="xml" name="storage_list" />
- <java-symbol type="bool" name="config_enableDreams" />
- <java-symbol type="string" name="enable_explore_by_touch_warning_title" />
- <java-symbol type="string" name="enable_explore_by_touch_warning_message" />
-
- <java-symbol type="layout" name="resolver_grid" />
- <java-symbol type="id" name="resolver_grid" />
- <java-symbol type="id" name="button_once" />
- <java-symbol type="id" name="button_always" />
- <java-symbol type="integer" name="config_maxResolverActivityColumns" />
-
- <!-- From SystemUI -->
- <java-symbol type="anim" name="push_down_in" />
- <java-symbol type="anim" name="push_down_out" />
- <java-symbol type="anim" name="push_up_in" />
- <java-symbol type="anim" name="push_up_out" />
- <java-symbol type="bool" name="config_alwaysUseCdmaRssi" />
- <java-symbol type="dimen" name="status_bar_icon_size" />
- <java-symbol type="dimen" name="system_bar_icon_size" />
- <java-symbol type="drawable" name="list_selector_pressed_holo_dark" />
- <java-symbol type="drawable" name="scrubber_control_disabled_holo" />
- <java-symbol type="drawable" name="scrubber_control_selector_holo" />
- <java-symbol type="drawable" name="scrubber_progress_horizontal_holo_dark" />
- <java-symbol type="drawable" name="usb_android" />
- <java-symbol type="drawable" name="usb_android_connected" />
- <java-symbol type="id" name="banner" />
- <java-symbol type="id" name="mount_button" />
- <java-symbol type="id" name="unmount_button" />
- <java-symbol type="layout" name="usb_storage_activity" />
- <java-symbol type="string" name="chooseUsbActivity" />
- <java-symbol type="string" name="dlg_confirm_kill_storage_users_text" />
- <java-symbol type="string" name="dlg_confirm_kill_storage_users_title" />
- <java-symbol type="string" name="dlg_error_title" />
- <java-symbol type="string" name="ext_media_badremoval_notification_message" />
- <java-symbol type="string" name="ext_media_badremoval_notification_title" />
- <java-symbol type="string" name="ext_media_checking_notification_message" />
- <java-symbol type="string" name="ext_media_checking_notification_title" />
- <java-symbol type="string" name="ext_media_nofs_notification_message" />
- <java-symbol type="string" name="ext_media_nofs_notification_title" />
- <java-symbol type="string" name="ext_media_nomedia_notification_message" />
- <java-symbol type="string" name="ext_media_nomedia_notification_title" />
- <java-symbol type="string" name="ext_media_safe_unmount_notification_message" />
- <java-symbol type="string" name="ext_media_safe_unmount_notification_title" />
- <java-symbol type="string" name="ext_media_unmountable_notification_message" />
- <java-symbol type="string" name="ext_media_unmountable_notification_title" />
- <java-symbol type="string" name="usb_storage_error_message" />
- <java-symbol type="string" name="usb_storage_message" />
- <java-symbol type="string" name="usb_storage_notification_message" />
- <java-symbol type="string" name="usb_storage_notification_title" />
- <java-symbol type="string" name="usb_storage_stop_message" />
- <java-symbol type="string" name="usb_storage_stop_notification_message" />
- <java-symbol type="string" name="usb_storage_stop_notification_title" />
- <java-symbol type="string" name="usb_storage_stop_title" />
- <java-symbol type="string" name="usb_storage_title" />
- <java-symbol type="style" name="Animation.RecentApplications" />
-
- <!-- ImfTest -->
- <java-symbol type="layout" name="auto_complete_list" />
-
- <!-- From SettingsProvider -->
- <java-symbol type="raw" name="fallbackring" />
-
- <!-- From Settings -->
- <java-symbol type="array" name="config_mobile_hotspot_provision_app" />
- <java-symbol type="bool" name="config_intrusiveNotificationLed" />
- <java-symbol type="dimen" name="preference_fragment_padding_bottom" />
- <java-symbol type="dimen" name="preference_fragment_padding_side" />
- <java-symbol type="drawable" name="expander_ic_maximized" />
- <java-symbol type="drawable" name="expander_ic_minimized" />
- <java-symbol type="drawable" name="ic_menu_archive" />
- <java-symbol type="drawable" name="ic_menu_goto" />
- <java-symbol type="drawable" name="ic_settings_language" />
- <java-symbol type="drawable" name="title_bar_medium" />
- <java-symbol type="id" name="body" />
- <java-symbol type="string" name="fast_scroll_alphabet" />
- <java-symbol type="string" name="ssl_certificate" />
-
- <!-- From Phone -->
- <java-symbol type="bool" name="config_built_in_sip_phone" />
-
- <!-- From TelephonyProvider -->
- <java-symbol type="xml" name="apns" />
-
- <!-- From ContactsProvider -->
- <java-symbol type="array" name="common_nicknames" />
- <java-symbol type="drawable" name="call_contact" />
- <java-symbol type="drawable" name="create_contact" />
- <java-symbol type="string" name="common_name_prefixes" />
- <java-symbol type="string" name="common_last_name_prefixes" />
- <java-symbol type="string" name="common_name_suffixes" />
- <java-symbol type="string" name="common_name_conjunctions" />
- <java-symbol type="string" name="dial_number_using" />
- <java-symbol type="string" name="create_contact_using" />
-
- <!-- From DownloadProvider -->
- <java-symbol type="integer" name="config_MaxConcurrentDownloadsAllowed" />
- <java-symbol type="integer" name="config_downloadDataDirSize" />
- <java-symbol type="integer" name="config_downloadDataDirLowSpaceThreshold" />
-
- <!-- From Contacts -->
- <java-symbol type="drawable" name="quickcontact_badge_overlay_dark" />
-
- <!-- From Browser -->
- <java-symbol type="drawable" name="ic_menu_moreoverflow_normal_holo_dark" />
- <java-symbol type="id" name="placeholder" />
- <java-symbol type="string" name="ssl_certificate_is_valid" />
-
- <!-- From Mms -->
- <java-symbol type="drawable" name="ic_menu_play_clip" />
-
- <!-- From Stk -->
- <java-symbol type="bool" name="config_sf_slowBlur" />
- <java-symbol type="drawable" name="ic_volume" />
- <java-symbol type="drawable" name="stat_notify_sim_toolkit" />
-
- <!-- From maps library -->
- <java-symbol type="array" name="maps_starting_lat_lng" />
- <java-symbol type="array" name="maps_starting_zoom" />
- <java-symbol type="attr" name="mapViewStyle" />
- <java-symbol type="attr" name="state_focused" />
- <java-symbol type="attr" name="state_selected" />
- <java-symbol type="attr" name="state_pressed" />
- <java-symbol type="drawable" name="compass_arrow" />
- <java-symbol type="drawable" name="compass_base" />
- <java-symbol type="drawable" name="ic_maps_indicator_current_position_anim" />
- <java-symbol type="drawable" name="loading_tile_android" />
- <java-symbol type="drawable" name="maps_google_logo" />
- <java-symbol type="drawable" name="no_tile_256" />
- <java-symbol type="drawable" name="reticle" />
-
- <!-- From PinyinIME(!!!) -->
- <java-symbol type="string" name="inputMethod" />
-
- <!-- AndroidManifest.xml attributes. -->
- <eat-comment />
-
<!-- ===============================================================
Resources for version 1 of the platform.
=============================================================== -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index f989e4e..8d4fad7 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -780,6 +780,12 @@
create and manage their own tokens, bypassing their normal
Z-ordering. Should never be needed for normal apps.</string>
+ <!-- [CHAR LIMIT=NONE] Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_freezeScreen">freeze screen</string>
+ <!-- [CHAR LIMIT=NONE] Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_freezeScreen">Allows the application to temporarily freeze
+ the screen for a full-screen transition.</string>
+
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_injectEvents">press keys and control buttons</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
new file mode 100644
index 0000000..669ffe7
--- /dev/null
+++ b/core/res/res/values/symbols.xml
@@ -0,0 +1,1789 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources>
+
+ <!-- We don't want to publish private symbols in android.R as part of the
+ SDK. Instead, put them here. -->
+ <private-symbols package="com.android.internal" />
+
+ <!-- Private symbols that we need to reference from framework code. See
+ frameworks/base/core/res/MakeJavaSymbols.sed for how to easily generate
+ this.
+ -->
+ <java-symbol type="id" name="account_name" />
+ <java-symbol type="id" name="account_row_icon" />
+ <java-symbol type="id" name="account_row_text" />
+ <java-symbol type="id" name="account_type" />
+ <java-symbol type="id" name="action_bar" />
+ <java-symbol type="id" name="action_bar_container" />
+ <java-symbol type="id" name="action_bar_overlay_layout" />
+ <java-symbol type="id" name="action_bar_title" />
+ <java-symbol type="id" name="action_bar_subtitle" />
+ <java-symbol type="id" name="action_context_bar" />
+ <java-symbol type="id" name="action_menu_presenter" />
+ <java-symbol type="id" name="action_mode_close_button" />
+ <java-symbol type="id" name="activity_chooser_view_content" />
+ <java-symbol type="id" name="albumart" />
+ <java-symbol type="id" name="alertTitle" />
+ <java-symbol type="id" name="allow_button" />
+ <java-symbol type="id" name="alwaysUse" />
+ <java-symbol type="id" name="amPm" />
+ <java-symbol type="id" name="authtoken_type" />
+ <java-symbol type="id" name="back_button" />
+ <java-symbol type="id" name="btn_next" />
+ <java-symbol type="id" name="btn_play" />
+ <java-symbol type="id" name="btn_prev" />
+ <java-symbol type="id" name="button_bar" />
+ <java-symbol type="id" name="buttonPanel" />
+ <java-symbol type="id" name="by_common" />
+ <java-symbol type="id" name="by_org" />
+ <java-symbol type="id" name="by_org_unit" />
+ <java-symbol type="id" name="calendar_view" />
+ <java-symbol type="id" name="cancel" />
+ <java-symbol type="id" name="characterPicker" />
+ <java-symbol type="id" name="clearDefaultHint" />
+ <java-symbol type="id" name="contentPanel" />
+ <java-symbol type="id" name="customPanel" />
+ <java-symbol type="id" name="datePicker" />
+ <java-symbol type="id" name="day" />
+ <java-symbol type="id" name="day_names" />
+ <java-symbol type="id" name="decrement" />
+ <java-symbol type="id" name="default_activity_button" />
+ <java-symbol type="id" name="deny_button" />
+ <java-symbol type="id" name="description" />
+ <java-symbol type="id" name="divider" />
+ <java-symbol type="id" name="edit_query" />
+ <java-symbol type="id" name="edittext_container" />
+ <java-symbol type="id" name="enter_pin_section" />
+ <java-symbol type="id" name="expand_activities_button" />
+ <java-symbol type="id" name="expand_button" />
+ <java-symbol type="id" name="expand_button_divider" />
+ <java-symbol type="id" name="expires_on" />
+ <java-symbol type="id" name="find_next" />
+ <java-symbol type="id" name="find_prev" />
+ <java-symbol type="id" name="ffwd" />
+ <java-symbol type="id" name="fillInIntent" />
+ <java-symbol type="id" name="find" />
+ <java-symbol type="id" name="fullscreenArea" />
+ <java-symbol type="id" name="hard_keyboard_section" />
+ <java-symbol type="id" name="hard_keyboard_switch" />
+ <java-symbol type="id" name="headers" />
+ <java-symbol type="id" name="hour" />
+ <java-symbol type="id" name="icon" />
+ <java-symbol type="id" name="image" />
+ <java-symbol type="id" name="increment" />
+ <java-symbol type="id" name="internalEmpty" />
+ <java-symbol type="id" name="info" />
+ <java-symbol type="id" name="inputExtractAccessories" />
+ <java-symbol type="id" name="inputExtractAction" />
+ <java-symbol type="id" name="inputExtractEditButton" />
+ <java-symbol type="id" name="issued_on" />
+ <java-symbol type="id" name="left_icon" />
+ <java-symbol type="id" name="leftSpacer" />
+ <java-symbol type="id" name="line1" />
+ <java-symbol type="id" name="line3" />
+ <java-symbol type="id" name="list_footer" />
+ <java-symbol type="id" name="list_item" />
+ <java-symbol type="id" name="listContainer" />
+ <java-symbol type="id" name="locale" />
+ <java-symbol type="id" name="matches" />
+ <java-symbol type="id" name="mediacontroller_progress" />
+ <java-symbol type="id" name="minute" />
+ <java-symbol type="id" name="mode_normal" />
+ <java-symbol type="id" name="month" />
+ <java-symbol type="id" name="month_name" />
+ <java-symbol type="id" name="name" />
+ <java-symbol type="id" name="next" />
+ <java-symbol type="id" name="next_button" />
+ <java-symbol type="id" name="new_app_action" />
+ <java-symbol type="id" name="new_app_description" />
+ <java-symbol type="id" name="new_app_icon" />
+ <java-symbol type="id" name="no_permissions" />
+ <java-symbol type="id" name="numberpicker_input" />
+ <java-symbol type="id" name="old_app_action" />
+ <java-symbol type="id" name="old_app_description" />
+ <java-symbol type="id" name="old_app_icon" />
+ <java-symbol type="id" name="overlay_display_window_texture" />
+ <java-symbol type="id" name="overlay_display_window_title" />
+ <java-symbol type="id" name="package_label" />
+ <java-symbol type="id" name="packages_list" />
+ <java-symbol type="id" name="pause" />
+ <java-symbol type="id" name="show_more" />
+ <java-symbol type="id" name="perm_icon" />
+ <java-symbol type="id" name="show_more_icon" />
+ <java-symbol type="id" name="show_more_text" />
+ <java-symbol type="id" name="dangerous_perms_list" />
+ <java-symbol type="id" name="non_dangerous_perms_list" />
+ <java-symbol type="id" name="permission_group" />
+ <java-symbol type="id" name="permission_list" />
+ <java-symbol type="id" name="pickers" />
+ <java-symbol type="id" name="prefs" />
+ <java-symbol type="id" name="prefs_frame" />
+ <java-symbol type="id" name="prev" />
+ <java-symbol type="id" name="progress" />
+ <java-symbol type="id" name="progress_circular" />
+ <java-symbol type="id" name="progress_horizontal" />
+ <java-symbol type="id" name="progress_number" />
+ <java-symbol type="id" name="progress_percent" />
+ <java-symbol type="id" name="progressContainer" />
+ <java-symbol type="id" name="rew" />
+ <java-symbol type="id" name="rightSpacer" />
+ <java-symbol type="id" name="rowTypeId" />
+ <java-symbol type="id" name="scrollView" />
+ <java-symbol type="id" name="search_app_icon" />
+ <java-symbol type="id" name="search_badge" />
+ <java-symbol type="id" name="search_bar" />
+ <java-symbol type="id" name="search_button" />
+ <java-symbol type="id" name="search_close_btn" />
+ <java-symbol type="id" name="search_edit_frame" />
+ <java-symbol type="id" name="search_go_btn" />
+ <java-symbol type="id" name="search_mag_icon" />
+ <java-symbol type="id" name="search_plate" />
+ <java-symbol type="id" name="search_src_text" />
+ <java-symbol type="id" name="search_view" />
+ <java-symbol type="id" name="search_voice_btn" />
+ <java-symbol type="id" name="select_all" />
+ <java-symbol type="id" name="serial_number" />
+ <java-symbol type="id" name="seekbar" />
+ <java-symbol type="id" name="sha1_fingerprint" />
+ <java-symbol type="id" name="sha256_fingerprint" />
+ <java-symbol type="id" name="share" />
+ <java-symbol type="id" name="shortcut" />
+ <java-symbol type="id" name="skip_button" />
+ <java-symbol type="id" name="slider_group" />
+ <java-symbol type="id" name="split_action_bar" />
+ <java-symbol type="id" name="stream_icon" />
+ <java-symbol type="id" name="submit_area" />
+ <java-symbol type="id" name="switch_new" />
+ <java-symbol type="id" name="switch_old" />
+ <java-symbol type="id" name="switchWidget" />
+ <java-symbol type="id" name="text" />
+ <java-symbol type="id" name="time" />
+ <java-symbol type="id" name="time_current" />
+ <java-symbol type="id" name="timeDisplayBackground" />
+ <java-symbol type="id" name="timeDisplayForeground" />
+ <java-symbol type="id" name="titleDivider" />
+ <java-symbol type="id" name="titleDividerTop" />
+ <java-symbol type="id" name="timePicker" />
+ <java-symbol type="id" name="title_template" />
+ <java-symbol type="id" name="to_common" />
+ <java-symbol type="id" name="to_org" />
+ <java-symbol type="id" name="to_org_unit" />
+ <java-symbol type="id" name="top_action_bar" />
+ <java-symbol type="id" name="topPanel" />
+ <java-symbol type="id" name="up" />
+ <java-symbol type="id" name="value" />
+ <java-symbol type="id" name="visible_panel" />
+ <java-symbol type="id" name="websearch" />
+ <java-symbol type="id" name="wifi_p2p_wps_pin" />
+ <java-symbol type="id" name="year" />
+ <java-symbol type="id" name="zoomControls" />
+ <java-symbol type="id" name="zoomIn" />
+ <java-symbol type="id" name="zoomMagnify" />
+ <java-symbol type="id" name="zoomOut" />
+ <java-symbol type="id" name="actions" />
+ <java-symbol type="id" name="action0" />
+ <java-symbol type="id" name="action1" />
+ <java-symbol type="id" name="action2" />
+ <java-symbol type="id" name="big_picture" />
+ <java-symbol type="id" name="big_text" />
+ <java-symbol type="id" name="chronometer" />
+ <java-symbol type="id" name="inbox_text0" />
+ <java-symbol type="id" name="inbox_text1" />
+ <java-symbol type="id" name="inbox_text2" />
+ <java-symbol type="id" name="inbox_text3" />
+ <java-symbol type="id" name="inbox_text4" />
+ <java-symbol type="id" name="inbox_text5" />
+ <java-symbol type="id" name="inbox_text6" />
+ <java-symbol type="id" name="inbox_more" />
+ <java-symbol type="id" name="status_bar_latest_event_content" />
+ <java-symbol type="id" name="action_divider" />
+ <java-symbol type="id" name="overflow_divider" />
+
+ <java-symbol type="attr" name="actionModeShareDrawable" />
+ <java-symbol type="attr" name="alertDialogCenterButtons" />
+ <java-symbol type="attr" name="gestureOverlayViewStyle" />
+ <java-symbol type="attr" name="keyboardViewStyle" />
+ <java-symbol type="attr" name="numberPickerStyle" />
+ <java-symbol type="attr" name="pointerStyle" />
+ <java-symbol type="attr" name="preferenceFrameLayoutStyle" />
+ <java-symbol type="attr" name="searchDialogTheme" />
+ <java-symbol type="attr" name="searchViewSearchIcon" />
+ <java-symbol type="attr" name="stackViewStyle" />
+ <java-symbol type="attr" name="switchStyle" />
+ <java-symbol type="attr" name="textAppearanceAutoCorrectionSuggestion" />
+ <java-symbol type="attr" name="textAppearanceEasyCorrectSuggestion" />
+ <java-symbol type="attr" name="textAppearanceMisspelledSuggestion" />
+ <java-symbol type="attr" name="textColorSearchUrl" />
+ <java-symbol type="attr" name="timePickerStyle" />
+ <java-symbol type="attr" name="windowFixedWidthMajor" />
+ <java-symbol type="attr" name="windowFixedWidthMinor" />
+ <java-symbol type="attr" name="windowFixedHeightMajor" />
+ <java-symbol type="attr" name="windowFixedHeightMinor" />
+ <java-symbol type="attr" name="accessibilityFocusedDrawable"/>
+
+ <java-symbol type="bool" name="action_bar_embed_tabs" />
+ <java-symbol type="bool" name="action_bar_embed_tabs_pre_jb" />
+ <java-symbol type="bool" name="action_bar_expanded_action_views_exclusive" />
+ <java-symbol type="bool" name="config_allowActionMenuItemTextWithIcon" />
+ <java-symbol type="bool" name="config_bluetooth_adapter_quick_switch" />
+ <java-symbol type="bool" name="config_bluetooth_sco_off_call" />
+ <java-symbol type="bool" name="config_cellBroadcastAppLinks" />
+ <java-symbol type="bool" name="config_duplicate_port_omadm_wappush" />
+ <java-symbol type="bool" name="config_enable_emergency_call_while_sim_locked" />
+ <java-symbol type="bool" name="config_enable_puk_unlock_screen" />
+ <java-symbol type="bool" name="config_mms_content_disposition_support" />
+ <java-symbol type="bool" name="config_showMenuShortcutsWhenKeyboardPresent" />
+ <java-symbol type="bool" name="config_sip_wifi_only" />
+ <java-symbol type="bool" name="config_sms_capable" />
+ <java-symbol type="bool" name="config_sms_utf8_support" />
+ <java-symbol type="bool" name="config_swipeDisambiguation" />
+ <java-symbol type="bool" name="config_syncstorageengine_masterSyncAutomatically" />
+ <java-symbol type="bool" name="config_telephony_use_own_number_for_voicemail" />
+ <java-symbol type="bool" name="config_ui_enableFadingMarquee" />
+ <java-symbol type="bool" name="config_use_strict_phone_number_comparation" />
+ <java-symbol type="bool" name="config_voice_capable" />
+ <java-symbol type="bool" name="preferences_prefer_dual_pane" />
+ <java-symbol type="bool" name="skip_restoring_network_selection" />
+ <java-symbol type="bool" name="split_action_bar_is_narrow" />
+ <java-symbol type="bool" name="config_useMasterVolume" />
+ <java-symbol type="bool" name="config_useVolumeKeySounds" />
+ <java-symbol type="bool" name="config_enableWallpaperService" />
+ <java-symbol type="bool" name="config_sendAudioBecomingNoisy" />
+ <java-symbol type="bool" name="config_enableScreenshotChord" />
+ <java-symbol type="bool" name="config_bluetooth_default_profiles" />
+
+ <java-symbol type="integer" name="config_cursorWindowSize" />
+ <java-symbol type="integer" name="config_longPressOnPowerBehavior" />
+ <java-symbol type="integer" name="config_max_pan_devices" />
+ <java-symbol type="integer" name="config_ntpTimeout" />
+ <java-symbol type="integer" name="config_wifi_framework_scan_interval" />
+ <java-symbol type="integer" name="config_wifi_supplicant_scan_interval" />
+ <java-symbol type="integer" name="db_connection_pool_size" />
+ <java-symbol type="integer" name="db_journal_size_limit" />
+ <java-symbol type="integer" name="db_wal_autocheckpoint" />
+ <java-symbol type="integer" name="max_action_buttons" />
+ <java-symbol type="integer" name="config_wifi_driver_stop_delay" />
+ <java-symbol type="integer" name="config_soundEffectVolumeDb" />
+ <java-symbol type="integer" name="config_lockSoundVolumeDb" />
+ <java-symbol type="integer" name="config_multiuserMaximumUsers" />
+
+ <java-symbol type="color" name="tab_indicator_text_v4" />
+
+ <java-symbol type="dimen" name="config_prefDialogWidth" />
+ <java-symbol type="dimen" name="config_viewConfigurationTouchSlop" />
+ <java-symbol type="dimen" name="default_app_widget_padding_bottom" />
+ <java-symbol type="dimen" name="default_app_widget_padding_left" />
+ <java-symbol type="dimen" name="default_app_widget_padding_right" />
+ <java-symbol type="dimen" name="default_app_widget_padding_top" />
+ <java-symbol type="dimen" name="default_gap" />
+ <java-symbol type="dimen" name="dropdownitem_icon_width" />
+ <java-symbol type="dimen" name="dropdownitem_text_padding_left" />
+ <java-symbol type="dimen" name="fastscroll_overlay_size" />
+ <java-symbol type="dimen" name="fastscroll_thumb_height" />
+ <java-symbol type="dimen" name="fastscroll_thumb_width" />
+ <java-symbol type="dimen" name="fastscroll_thumb_width" />
+ <java-symbol type="dimen" name="password_keyboard_spacebar_vertical_correction" />
+ <java-symbol type="dimen" name="search_view_preferred_width" />
+ <java-symbol type="dimen" name="textview_error_popup_default_width" />
+ <java-symbol type="dimen" name="toast_y_offset" />
+ <java-symbol type="dimen" name="volume_panel_top" />
+ <java-symbol type="dimen" name="action_bar_stacked_max_height" />
+ <java-symbol type="dimen" name="action_bar_stacked_tab_max_width" />
+ <java-symbol type="dimen" name="notification_text_size" />
+ <java-symbol type="dimen" name="notification_title_text_size" />
+ <java-symbol type="dimen" name="notification_subtext_size" />
+
+ <java-symbol type="string" name="add_account_button_label" />
+ <java-symbol type="string" name="addToDictionary" />
+ <java-symbol type="string" name="action_bar_home_description" />
+ <java-symbol type="string" name="action_bar_up_description" />
+ <java-symbol type="string" name="delete" />
+ <java-symbol type="string" name="deleteText" />
+ <java-symbol type="string" name="ellipsis_two_dots" />
+ <java-symbol type="string" name="ellipsis" />
+ <java-symbol type="string" name="grant_permissions_header_text" />
+ <java-symbol type="string" name="list_delimeter" />
+ <java-symbol type="string" name="menu_delete_shortcut_label" />
+ <java-symbol type="string" name="menu_enter_shortcut_label" />
+ <java-symbol type="string" name="menu_space_shortcut_label" />
+ <java-symbol type="string" name="notification_title" />
+ <java-symbol type="string" name="permission_request_notification_with_subtitle" />
+ <java-symbol type="string" name="prepend_shortcut_label" />
+ <java-symbol type="string" name="replace" />
+ <java-symbol type="string" name="textSelectionCABTitle" />
+ <java-symbol type="string" name="BaMmi" />
+ <java-symbol type="string" name="CLIRDefaultOffNextCallOff" />
+ <java-symbol type="string" name="CLIRDefaultOffNextCallOn" />
+ <java-symbol type="string" name="CLIRDefaultOnNextCallOff" />
+ <java-symbol type="string" name="CLIRDefaultOnNextCallOn" />
+ <java-symbol type="string" name="CLIRPermanent" />
+ <java-symbol type="string" name="CfMmi" />
+ <java-symbol type="string" name="ClipMmi" />
+ <java-symbol type="string" name="ClirMmi" />
+ <java-symbol type="string" name="CwMmi" />
+ <java-symbol type="string" name="Midnight" />
+ <java-symbol type="string" name="Noon" />
+ <java-symbol type="string" name="PinMmi" />
+ <java-symbol type="string" name="PwdMmi" />
+ <java-symbol type="string" name="RestrictedChangedTitle" />
+ <java-symbol type="string" name="RestrictedOnAllVoice" />
+ <java-symbol type="string" name="RestrictedOnData" />
+ <java-symbol type="string" name="RestrictedOnEmergency" />
+ <java-symbol type="string" name="RestrictedOnNormal" />
+ <java-symbol type="string" name="SetupCallDefault" />
+ <java-symbol type="string" name="abbrev_month" />
+ <java-symbol type="string" name="abbrev_month_day" />
+ <java-symbol type="string" name="abbrev_month_day_year" />
+ <java-symbol type="string" name="abbrev_month_year" />
+ <java-symbol type="string" name="accept" />
+ <java-symbol type="string" name="activity_chooser_view_see_all" />
+ <java-symbol type="string" name="activitychooserview_choose_application" />
+ <java-symbol type="string" name="alternate_eri_file" />
+ <java-symbol type="string" name="alwaysUse" />
+ <java-symbol type="string" name="am" />
+ <java-symbol type="string" name="autofill_address_line_1_label_re" />
+ <java-symbol type="string" name="autofill_address_line_1_re" />
+ <java-symbol type="string" name="autofill_address_line_2_re" />
+ <java-symbol type="string" name="autofill_address_line_3_re" />
+ <java-symbol type="string" name="autofill_address_name_separator" />
+ <java-symbol type="string" name="autofill_address_summary_format" />
+ <java-symbol type="string" name="autofill_address_summary_name_format" />
+ <java-symbol type="string" name="autofill_address_summary_separator" />
+ <java-symbol type="string" name="autofill_address_type_same_as_re" />
+ <java-symbol type="string" name="autofill_address_type_use_my_re" />
+ <java-symbol type="string" name="autofill_area" />
+ <java-symbol type="string" name="autofill_area_code_notext_re" />
+ <java-symbol type="string" name="autofill_area_code_re" />
+ <java-symbol type="string" name="autofill_attention_ignored_re" />
+ <java-symbol type="string" name="autofill_billing_designator_re" />
+ <java-symbol type="string" name="autofill_card_cvc_re" />
+ <java-symbol type="string" name="autofill_card_ignored_re" />
+ <java-symbol type="string" name="autofill_card_number_re" />
+ <java-symbol type="string" name="autofill_city_re" />
+ <java-symbol type="string" name="autofill_company_re" />
+ <java-symbol type="string" name="autofill_country_code_re" />
+ <java-symbol type="string" name="autofill_country_re" />
+ <java-symbol type="string" name="autofill_county" />
+ <java-symbol type="string" name="autofill_department" />
+ <java-symbol type="string" name="autofill_district" />
+ <java-symbol type="string" name="autofill_email_re" />
+ <java-symbol type="string" name="autofill_emirate" />
+ <java-symbol type="string" name="autofill_expiration_date_re" />
+ <java-symbol type="string" name="autofill_expiration_month_re" />
+ <java-symbol type="string" name="autofill_fax_re" />
+ <java-symbol type="string" name="autofill_first_name_re" />
+ <java-symbol type="string" name="autofill_island" />
+ <java-symbol type="string" name="autofill_last_name_re" />
+ <java-symbol type="string" name="autofill_middle_initial_re" />
+ <java-symbol type="string" name="autofill_middle_name_re" />
+ <java-symbol type="string" name="autofill_name_on_card_contextual_re" />
+ <java-symbol type="string" name="autofill_name_on_card_re" />
+ <java-symbol type="string" name="autofill_name_re" />
+ <java-symbol type="string" name="autofill_name_specific_re" />
+ <java-symbol type="string" name="autofill_parish" />
+ <java-symbol type="string" name="autofill_phone_extension_re" />
+ <java-symbol type="string" name="autofill_phone_prefix_re" />
+ <java-symbol type="string" name="autofill_phone_prefix_separator_re" />
+ <java-symbol type="string" name="autofill_phone_re" />
+ <java-symbol type="string" name="autofill_phone_suffix_re" />
+ <java-symbol type="string" name="autofill_phone_suffix_separator_re" />
+ <java-symbol type="string" name="autofill_postal_code" />
+ <java-symbol type="string" name="autofill_prefecture" />
+ <java-symbol type="string" name="autofill_province" />
+ <java-symbol type="string" name="autofill_region_ignored_re" />
+ <java-symbol type="string" name="autofill_shipping_designator_re" />
+ <java-symbol type="string" name="autofill_state" />
+ <java-symbol type="string" name="autofill_state_re" />
+ <java-symbol type="string" name="autofill_this_form" />
+ <java-symbol type="string" name="autofill_username_re" />
+ <java-symbol type="string" name="autofill_zip_4_re" />
+ <java-symbol type="string" name="autofill_zip_code" />
+ <java-symbol type="string" name="autofill_zip_code_re" />
+ <java-symbol type="string" name="badPin" />
+ <java-symbol type="string" name="badPuk" />
+ <java-symbol type="string" name="byteShort" />
+ <java-symbol type="string" name="cfTemplateForwarded" />
+ <java-symbol type="string" name="cfTemplateForwardedTime" />
+ <java-symbol type="string" name="cfTemplateNotForwarded" />
+ <java-symbol type="string" name="cfTemplateRegistered" />
+ <java-symbol type="string" name="cfTemplateRegisteredTime" />
+ <java-symbol type="string" name="chooseActivity" />
+ <java-symbol type="string" name="config_default_dns_server" />
+ <java-symbol type="string" name="config_ethernet_iface_regex" />
+ <java-symbol type="string" name="config_ntpServer" />
+ <java-symbol type="string" name="config_tether_apndata" />
+ <java-symbol type="string" name="config_useragentprofile_url" />
+ <java-symbol type="string" name="config_wifi_p2p_device_type" />
+ <java-symbol type="string" name="contentServiceSync" />
+ <java-symbol type="string" name="contentServiceSyncNotificationTitle" />
+ <java-symbol type="string" name="contentServiceTooManyDeletesNotificationDesc" />
+ <java-symbol type="string" name="date1_date2" />
+ <java-symbol type="string" name="date1_time1_date2_time2" />
+ <java-symbol type="string" name="date_and_time" />
+ <java-symbol type="string" name="date_picker_decrement_day_button" />
+ <java-symbol type="string" name="date_picker_decrement_month_button" />
+ <java-symbol type="string" name="date_picker_decrement_year_button" />
+ <java-symbol type="string" name="date_picker_dialog_title" />
+ <java-symbol type="string" name="date_picker_increment_day_button" />
+ <java-symbol type="string" name="date_picker_increment_month_button" />
+ <java-symbol type="string" name="date_picker_increment_year_button" />
+ <java-symbol type="string" name="date_time" />
+ <java-symbol type="string" name="date_time_set" />
+ <java-symbol type="string" name="date_time_done" />
+ <java-symbol type="string" name="day_of_week_long_friday" />
+ <java-symbol type="string" name="day_of_week_long_monday" />
+ <java-symbol type="string" name="day_of_week_long_saturday" />
+ <java-symbol type="string" name="day_of_week_long_sunday" />
+ <java-symbol type="string" name="day_of_week_long_thursday" />
+ <java-symbol type="string" name="day_of_week_long_tuesday" />
+ <java-symbol type="string" name="day_of_week_long_wednesday" />
+ <java-symbol type="string" name="day_of_week_medium_friday" />
+ <java-symbol type="string" name="day_of_week_medium_monday" />
+ <java-symbol type="string" name="day_of_week_medium_saturday" />
+ <java-symbol type="string" name="day_of_week_medium_sunday" />
+ <java-symbol type="string" name="day_of_week_medium_thursday" />
+ <java-symbol type="string" name="day_of_week_medium_tuesday" />
+ <java-symbol type="string" name="day_of_week_medium_wednesday" />
+ <java-symbol type="string" name="day_of_week_short_friday" />
+ <java-symbol type="string" name="day_of_week_short_monday" />
+ <java-symbol type="string" name="day_of_week_short_saturday" />
+ <java-symbol type="string" name="day_of_week_short_sunday" />
+ <java-symbol type="string" name="day_of_week_short_thursday" />
+ <java-symbol type="string" name="day_of_week_short_tuesday" />
+ <java-symbol type="string" name="day_of_week_short_wednesday" />
+ <java-symbol type="string" name="day_of_week_shortest_friday" />
+ <java-symbol type="string" name="day_of_week_shortest_monday" />
+ <java-symbol type="string" name="day_of_week_shortest_saturday" />
+ <java-symbol type="string" name="day_of_week_shortest_sunday" />
+ <java-symbol type="string" name="day_of_week_shortest_thursday" />
+ <java-symbol type="string" name="day_of_week_shortest_tuesday" />
+ <java-symbol type="string" name="day_of_week_shortest_wednesday" />
+ <java-symbol type="string" name="db_default_journal_mode" />
+ <java-symbol type="string" name="db_default_sync_mode" />
+ <java-symbol type="string" name="db_wal_sync_mode" />
+ <java-symbol type="string" name="decline" />
+ <java-symbol type="string" name="default_text_encoding" />
+ <java-symbol type="string" name="description_target_unlock_tablet" />
+ <java-symbol type="string" name="display_manager_built_in_display_name" />
+ <java-symbol type="string" name="display_manager_hdmi_display_name" />
+ <java-symbol type="string" name="display_manager_overlay_display_name" />
+ <java-symbol type="string" name="display_manager_overlay_display_title" />
+ <java-symbol type="string" name="double_tap_toast" />
+ <java-symbol type="string" name="elapsed_time_short_format_h_mm_ss" />
+ <java-symbol type="string" name="elapsed_time_short_format_mm_ss" />
+ <java-symbol type="string" name="emailTypeCustom" />
+ <java-symbol type="string" name="emailTypeHome" />
+ <java-symbol type="string" name="emailTypeMobile" />
+ <java-symbol type="string" name="emailTypeOther" />
+ <java-symbol type="string" name="emailTypeWork" />
+ <java-symbol type="string" name="emergency_call_dialog_number_for_display" />
+ <java-symbol type="string" name="emergency_calls_only" />
+ <java-symbol type="string" name="eventTypeAnniversary" />
+ <java-symbol type="string" name="eventTypeBirthday" />
+ <java-symbol type="string" name="eventTypeCustom" />
+ <java-symbol type="string" name="eventTypeOther" />
+ <java-symbol type="string" name="extmedia_format_button_format" />
+ <java-symbol type="string" name="extmedia_format_message" />
+ <java-symbol type="string" name="extmedia_format_title" />
+ <java-symbol type="string" name="fileSizeSuffix" />
+ <java-symbol type="string" name="force_close" />
+ <java-symbol type="string" name="format_error" />
+ <java-symbol type="string" name="gadget_host_error_inflating" />
+ <java-symbol type="string" name="gigabyteShort" />
+ <java-symbol type="string" name="gpsNotifMessage" />
+ <java-symbol type="string" name="gpsNotifTicker" />
+ <java-symbol type="string" name="gpsNotifTitle" />
+ <java-symbol type="string" name="gpsVerifNo" />
+ <java-symbol type="string" name="gpsVerifYes" />
+ <java-symbol type="string" name="gsm_alphabet_default_charset" />
+ <java-symbol type="string" name="hour_ampm" />
+ <java-symbol type="string" name="hour_cap_ampm" />
+ <java-symbol type="string" name="hour_minute_24" />
+ <java-symbol type="string" name="hour_minute_ampm" />
+ <java-symbol type="string" name="hour_minute_cap_ampm" />
+ <java-symbol type="string" name="httpError" />
+ <java-symbol type="string" name="httpErrorAuth" />
+ <java-symbol type="string" name="httpErrorConnect" />
+ <java-symbol type="string" name="httpErrorFailedSslHandshake" />
+ <java-symbol type="string" name="httpErrorFile" />
+ <java-symbol type="string" name="httpErrorFileNotFound" />
+ <java-symbol type="string" name="httpErrorIO" />
+ <java-symbol type="string" name="httpErrorLookup" />
+ <java-symbol type="string" name="httpErrorOk" />
+ <java-symbol type="string" name="httpErrorProxyAuth" />
+ <java-symbol type="string" name="httpErrorRedirectLoop" />
+ <java-symbol type="string" name="httpErrorTimeout" />
+ <java-symbol type="string" name="httpErrorTooManyRequests" />
+ <java-symbol type="string" name="httpErrorUnsupportedAuthScheme" />
+ <java-symbol type="string" name="imProtocolAim" />
+ <java-symbol type="string" name="imProtocolCustom" />
+ <java-symbol type="string" name="imProtocolGoogleTalk" />
+ <java-symbol type="string" name="imProtocolIcq" />
+ <java-symbol type="string" name="imProtocolJabber" />
+ <java-symbol type="string" name="imProtocolMsn" />
+ <java-symbol type="string" name="imProtocolNetMeeting" />
+ <java-symbol type="string" name="imProtocolQq" />
+ <java-symbol type="string" name="imProtocolSkype" />
+ <java-symbol type="string" name="imProtocolYahoo" />
+ <java-symbol type="string" name="imTypeCustom" />
+ <java-symbol type="string" name="imTypeHome" />
+ <java-symbol type="string" name="imTypeOther" />
+ <java-symbol type="string" name="imTypeWork" />
+ <java-symbol type="string" name="ime_action_default" />
+ <java-symbol type="string" name="ime_action_done" />
+ <java-symbol type="string" name="ime_action_go" />
+ <java-symbol type="string" name="ime_action_next" />
+ <java-symbol type="string" name="ime_action_previous" />
+ <java-symbol type="string" name="ime_action_search" />
+ <java-symbol type="string" name="ime_action_send" />
+ <java-symbol type="string" name="invalidPin" />
+ <java-symbol type="string" name="js_dialog_before_unload" />
+ <java-symbol type="string" name="js_dialog_title" />
+ <java-symbol type="string" name="js_dialog_title_default" />
+ <java-symbol type="string" name="keyboard_headset_required_to_hear_password" />
+ <java-symbol type="string" name="keyboard_password_character_no_headset" />
+ <java-symbol type="string" name="keyboardview_keycode_alt" />
+ <java-symbol type="string" name="keyboardview_keycode_cancel" />
+ <java-symbol type="string" name="keyboardview_keycode_delete" />
+ <java-symbol type="string" name="keyboardview_keycode_done" />
+ <java-symbol type="string" name="keyboardview_keycode_enter" />
+ <java-symbol type="string" name="keyboardview_keycode_mode_change" />
+ <java-symbol type="string" name="keyboardview_keycode_shift" />
+ <java-symbol type="string" name="kilobyteShort" />
+ <java-symbol type="string" name="last_month" />
+ <java-symbol type="string" name="launchBrowserDefault" />
+ <java-symbol type="string" name="lockscreen_access_pattern_cell_added" />
+ <java-symbol type="string" name="lockscreen_access_pattern_cleared" />
+ <java-symbol type="string" name="lockscreen_access_pattern_detected" />
+ <java-symbol type="string" name="lockscreen_access_pattern_start" />
+ <java-symbol type="string" name="lockscreen_emergency_call" />
+ <java-symbol type="string" name="lockscreen_return_to_call" />
+ <java-symbol type="string" name="lockscreen_transport_pause_description" />
+ <java-symbol type="string" name="lockscreen_transport_play_description" />
+ <java-symbol type="string" name="lockscreen_transport_stop_description" />
+ <java-symbol type="string" name="low_memory" />
+ <java-symbol type="string" name="media_bad_removal" />
+ <java-symbol type="string" name="media_checking" />
+ <java-symbol type="string" name="media_removed" />
+ <java-symbol type="string" name="media_shared" />
+ <java-symbol type="string" name="media_unknown_state" />
+ <java-symbol type="string" name="megabyteShort" />
+ <java-symbol type="string" name="midnight" />
+ <java-symbol type="string" name="mismatchPin" />
+ <java-symbol type="string" name="mmiComplete" />
+ <java-symbol type="string" name="mmiError" />
+ <java-symbol type="string" name="mmiFdnError" />
+ <java-symbol type="string" name="month" />
+ <java-symbol type="string" name="month_day" />
+ <java-symbol type="string" name="month_day_year" />
+ <java-symbol type="string" name="month_long_april" />
+ <java-symbol type="string" name="month_long_august" />
+ <java-symbol type="string" name="month_long_december" />
+ <java-symbol type="string" name="month_long_february" />
+ <java-symbol type="string" name="month_long_january" />
+ <java-symbol type="string" name="month_long_july" />
+ <java-symbol type="string" name="month_long_june" />
+ <java-symbol type="string" name="month_long_march" />
+ <java-symbol type="string" name="month_long_may" />
+ <java-symbol type="string" name="month_long_november" />
+ <java-symbol type="string" name="month_long_october" />
+ <java-symbol type="string" name="month_long_september" />
+ <java-symbol type="string" name="month_long_standalone_april" />
+ <java-symbol type="string" name="month_long_standalone_august" />
+ <java-symbol type="string" name="month_long_standalone_december" />
+ <java-symbol type="string" name="month_long_standalone_february" />
+ <java-symbol type="string" name="month_long_standalone_january" />
+ <java-symbol type="string" name="month_long_standalone_july" />
+ <java-symbol type="string" name="month_long_standalone_june" />
+ <java-symbol type="string" name="month_long_standalone_march" />
+ <java-symbol type="string" name="month_long_standalone_may" />
+ <java-symbol type="string" name="month_long_standalone_november" />
+ <java-symbol type="string" name="month_long_standalone_october" />
+ <java-symbol type="string" name="month_long_standalone_september" />
+ <java-symbol type="string" name="month_medium_april" />
+ <java-symbol type="string" name="month_medium_august" />
+ <java-symbol type="string" name="month_medium_december" />
+ <java-symbol type="string" name="month_medium_february" />
+ <java-symbol type="string" name="month_medium_january" />
+ <java-symbol type="string" name="month_medium_july" />
+ <java-symbol type="string" name="month_medium_june" />
+ <java-symbol type="string" name="month_medium_march" />
+ <java-symbol type="string" name="month_medium_may" />
+ <java-symbol type="string" name="month_medium_november" />
+ <java-symbol type="string" name="month_medium_october" />
+ <java-symbol type="string" name="month_medium_september" />
+ <java-symbol type="string" name="month_shortest_april" />
+ <java-symbol type="string" name="month_shortest_august" />
+ <java-symbol type="string" name="month_shortest_december" />
+ <java-symbol type="string" name="month_shortest_february" />
+ <java-symbol type="string" name="month_shortest_january" />
+ <java-symbol type="string" name="month_shortest_july" />
+ <java-symbol type="string" name="month_shortest_june" />
+ <java-symbol type="string" name="month_shortest_march" />
+ <java-symbol type="string" name="month_shortest_may" />
+ <java-symbol type="string" name="month_shortest_november" />
+ <java-symbol type="string" name="month_shortest_october" />
+ <java-symbol type="string" name="month_shortest_september" />
+ <java-symbol type="string" name="month_year" />
+ <java-symbol type="string" name="more_item_label" />
+ <java-symbol type="string" name="needPuk" />
+ <java-symbol type="string" name="needPuk2" />
+ <java-symbol type="string" name="new_app_action" />
+ <java-symbol type="string" name="new_app_description" />
+ <java-symbol type="string" name="noApplications" />
+ <java-symbol type="string" name="no_file_chosen" />
+ <java-symbol type="string" name="no_matches" />
+ <java-symbol type="string" name="noon" />
+ <java-symbol type="string" name="number_picker_increment_scroll_action" />
+ <java-symbol type="string" name="number_picker_increment_scroll_mode" />
+ <java-symbol type="string" name="numeric_date" />
+ <java-symbol type="string" name="numeric_date_format" />
+ <java-symbol type="string" name="numeric_date_template" />
+ <java-symbol type="string" name="numeric_md1_md2" />
+ <java-symbol type="string" name="numeric_md1_time1_md2_time2" />
+ <java-symbol type="string" name="numeric_mdy1_mdy2" />
+ <java-symbol type="string" name="numeric_mdy1_time1_mdy2_time2" />
+ <java-symbol type="string" name="numeric_wday1_md1_time1_wday2_md2_time2" />
+ <java-symbol type="string" name="numeric_wday1_md1_wday2_md2" />
+ <java-symbol type="string" name="numeric_wday1_mdy1_time1_wday2_mdy2_time2" />
+ <java-symbol type="string" name="numeric_wday1_mdy1_wday2_mdy2" />
+ <java-symbol type="string" name="old_app_action" />
+ <java-symbol type="string" name="old_app_description" />
+ <java-symbol type="string" name="older" />
+ <java-symbol type="string" name="open_permission_deny" />
+ <java-symbol type="string" name="orgTypeCustom" />
+ <java-symbol type="string" name="orgTypeOther" />
+ <java-symbol type="string" name="orgTypeWork" />
+ <java-symbol type="string" name="passwordIncorrect" />
+ <java-symbol type="string" name="perms_description_app" />
+ <java-symbol type="string" name="perms_new_perm_prefix" />
+ <java-symbol type="string" name="perms_hide" />
+ <java-symbol type="string" name="perms_show_all" />
+ <java-symbol type="string" name="default_permission_group" />
+ <java-symbol type="string" name="permissions_format" />
+ <java-symbol type="string" name="petabyteShort" />
+ <java-symbol type="string" name="phoneTypeAssistant" />
+ <java-symbol type="string" name="phoneTypeCallback" />
+ <java-symbol type="string" name="phoneTypeCar" />
+ <java-symbol type="string" name="phoneTypeCompanyMain" />
+ <java-symbol type="string" name="phoneTypeCustom" />
+ <java-symbol type="string" name="phoneTypeFaxHome" />
+ <java-symbol type="string" name="phoneTypeFaxWork" />
+ <java-symbol type="string" name="phoneTypeHome" />
+ <java-symbol type="string" name="phoneTypeIsdn" />
+ <java-symbol type="string" name="phoneTypeMain" />
+ <java-symbol type="string" name="phoneTypeMms" />
+ <java-symbol type="string" name="phoneTypeMobile" />
+ <java-symbol type="string" name="phoneTypeOther" />
+ <java-symbol type="string" name="phoneTypeOtherFax" />
+ <java-symbol type="string" name="phoneTypePager" />
+ <java-symbol type="string" name="phoneTypeRadio" />
+ <java-symbol type="string" name="phoneTypeTelex" />
+ <java-symbol type="string" name="phoneTypeTtyTdd" />
+ <java-symbol type="string" name="phoneTypeWork" />
+ <java-symbol type="string" name="phoneTypeWorkMobile" />
+ <java-symbol type="string" name="phoneTypeWorkPager" />
+ <java-symbol type="string" name="pm" />
+ <java-symbol type="string" name="policydesc_disableCamera" />
+ <java-symbol type="string" name="policydesc_encryptedStorage" />
+ <java-symbol type="string" name="policydesc_expirePassword" />
+ <java-symbol type="string" name="policydesc_forceLock" />
+ <java-symbol type="string" name="policydesc_limitPassword" />
+ <java-symbol type="string" name="policydesc_resetPassword" />
+ <java-symbol type="string" name="policydesc_setGlobalProxy" />
+ <java-symbol type="string" name="policydesc_watchLogin" />
+ <java-symbol type="string" name="policydesc_wipeData" />
+ <java-symbol type="string" name="policydesc_disableKeyguardWidgets" />
+ <java-symbol type="string" name="policylab_disableCamera" />
+ <java-symbol type="string" name="policylab_encryptedStorage" />
+ <java-symbol type="string" name="policylab_expirePassword" />
+ <java-symbol type="string" name="policylab_forceLock" />
+ <java-symbol type="string" name="policylab_limitPassword" />
+ <java-symbol type="string" name="policylab_resetPassword" />
+ <java-symbol type="string" name="policylab_setGlobalProxy" />
+ <java-symbol type="string" name="policylab_watchLogin" />
+ <java-symbol type="string" name="policylab_wipeData" />
+ <java-symbol type="string" name="policylab_disableKeyguardWidgets" />
+ <java-symbol type="string" name="postalTypeCustom" />
+ <java-symbol type="string" name="postalTypeHome" />
+ <java-symbol type="string" name="postalTypeOther" />
+ <java-symbol type="string" name="postalTypeWork" />
+ <java-symbol type="string" name="power_off" />
+ <java-symbol type="string" name="preposition_for_date" />
+ <java-symbol type="string" name="preposition_for_time" />
+ <java-symbol type="string" name="progress_erasing" />
+ <java-symbol type="string" name="progress_unmounting" />
+ <java-symbol type="string" name="reboot_safemode_confirm" />
+ <java-symbol type="string" name="reboot_safemode_title" />
+ <java-symbol type="string" name="relationTypeAssistant" />
+ <java-symbol type="string" name="relationTypeBrother" />
+ <java-symbol type="string" name="relationTypeChild" />
+ <java-symbol type="string" name="relationTypeDomesticPartner" />
+ <java-symbol type="string" name="relationTypeFather" />
+ <java-symbol type="string" name="relationTypeFriend" />
+ <java-symbol type="string" name="relationTypeManager" />
+ <java-symbol type="string" name="relationTypeMother" />
+ <java-symbol type="string" name="relationTypeParent" />
+ <java-symbol type="string" name="relationTypePartner" />
+ <java-symbol type="string" name="relationTypeReferredBy" />
+ <java-symbol type="string" name="relationTypeRelative" />
+ <java-symbol type="string" name="relationTypeSister" />
+ <java-symbol type="string" name="relationTypeSpouse" />
+ <java-symbol type="string" name="relative_time" />
+ <java-symbol type="string" name="reset" />
+ <java-symbol type="string" name="ringtone_default" />
+ <java-symbol type="string" name="ringtone_default_with_actual" />
+ <java-symbol type="string" name="ringtone_picker_title" />
+ <java-symbol type="string" name="ringtone_silent" />
+ <java-symbol type="string" name="ringtone_unknown" />
+ <java-symbol type="string" name="roamingText0" />
+ <java-symbol type="string" name="roamingText1" />
+ <java-symbol type="string" name="roamingText10" />
+ <java-symbol type="string" name="roamingText11" />
+ <java-symbol type="string" name="roamingText12" />
+ <java-symbol type="string" name="roamingText2" />
+ <java-symbol type="string" name="roamingText3" />
+ <java-symbol type="string" name="roamingText4" />
+ <java-symbol type="string" name="roamingText5" />
+ <java-symbol type="string" name="roamingText6" />
+ <java-symbol type="string" name="roamingText7" />
+ <java-symbol type="string" name="roamingText8" />
+ <java-symbol type="string" name="roamingText9" />
+ <java-symbol type="string" name="roamingTextSearching" />
+ <java-symbol type="string" name="same_month_md1_md2" />
+ <java-symbol type="string" name="same_month_md1_time1_md2_time2" />
+ <java-symbol type="string" name="same_month_mdy1_mdy2" />
+ <java-symbol type="string" name="same_month_mdy1_time1_mdy2_time2" />
+ <java-symbol type="string" name="same_month_wday1_md1_time1_wday2_md2_time2" />
+ <java-symbol type="string" name="same_month_wday1_md1_wday2_md2" />
+ <java-symbol type="string" name="same_month_wday1_mdy1_time1_wday2_mdy2_time2" />
+ <java-symbol type="string" name="same_month_wday1_mdy1_wday2_mdy2" />
+ <java-symbol type="string" name="same_year_md1_md2" />
+ <java-symbol type="string" name="same_year_md1_time1_md2_time2" />
+ <java-symbol type="string" name="same_year_mdy1_mdy2" />
+ <java-symbol type="string" name="same_year_mdy1_time1_mdy2_time2" />
+ <java-symbol type="string" name="same_year_wday1_md1_time1_wday2_md2_time2" />
+ <java-symbol type="string" name="same_year_wday1_md1_wday2_md2" />
+ <java-symbol type="string" name="same_year_wday1_mdy1_time1_wday2_mdy2_time2" />
+ <java-symbol type="string" name="same_year_wday1_mdy1_wday2_mdy2" />
+ <java-symbol type="string" name="save_password_label" />
+ <java-symbol type="string" name="save_password_message" />
+ <java-symbol type="string" name="save_password_never" />
+ <java-symbol type="string" name="save_password_notnow" />
+ <java-symbol type="string" name="save_password_remember" />
+ <java-symbol type="string" name="sendText" />
+ <java-symbol type="string" name="sending" />
+ <java-symbol type="string" name="serviceClassData" />
+ <java-symbol type="string" name="serviceClassDataAsync" />
+ <java-symbol type="string" name="serviceClassDataSync" />
+ <java-symbol type="string" name="serviceClassFAX" />
+ <java-symbol type="string" name="serviceClassPAD" />
+ <java-symbol type="string" name="serviceClassPacket" />
+ <java-symbol type="string" name="serviceClassSMS" />
+ <java-symbol type="string" name="serviceClassVoice" />
+ <java-symbol type="string" name="serviceDisabled" />
+ <java-symbol type="string" name="serviceEnabled" />
+ <java-symbol type="string" name="serviceEnabledFor" />
+ <java-symbol type="string" name="serviceErased" />
+ <java-symbol type="string" name="serviceNotProvisioned" />
+ <java-symbol type="string" name="serviceRegistered" />
+ <java-symbol type="string" name="setup_autofill" />
+ <java-symbol type="string" name="share" />
+ <java-symbol type="string" name="shareactionprovider_share_with" />
+ <java-symbol type="string" name="shareactionprovider_share_with_application" />
+ <java-symbol type="string" name="short_format_month" />
+ <java-symbol type="string" name="shutdown_confirm" />
+ <java-symbol type="string" name="shutdown_confirm_question" />
+ <java-symbol type="string" name="shutdown_progress" />
+ <java-symbol type="string" name="sim_added_message" />
+ <java-symbol type="string" name="sim_added_title" />
+ <java-symbol type="string" name="sim_removed_message" />
+ <java-symbol type="string" name="sim_removed_title" />
+ <java-symbol type="string" name="sim_restart_button" />
+ <java-symbol type="string" name="sipAddressTypeCustom" />
+ <java-symbol type="string" name="sipAddressTypeHome" />
+ <java-symbol type="string" name="sipAddressTypeOther" />
+ <java-symbol type="string" name="sipAddressTypeWork" />
+ <java-symbol type="string" name="sms_control_message" />
+ <java-symbol type="string" name="sms_control_title" />
+ <java-symbol type="string" name="sms_control_no" />
+ <java-symbol type="string" name="sms_control_yes" />
+ <java-symbol type="string" name="sms_premium_short_code_confirm_message" />
+ <java-symbol type="string" name="sms_premium_short_code_confirm_title" />
+ <java-symbol type="string" name="sms_short_code_confirm_allow" />
+ <java-symbol type="string" name="sms_short_code_confirm_deny" />
+ <java-symbol type="string" name="sms_short_code_confirm_message" />
+ <java-symbol type="string" name="sms_short_code_confirm_report" />
+ <java-symbol type="string" name="sms_short_code_confirm_title" />
+ <java-symbol type="string" name="submit" />
+ <java-symbol type="string" name="sync_binding_label" />
+ <java-symbol type="string" name="sync_do_nothing" />
+ <java-symbol type="string" name="sync_really_delete" />
+ <java-symbol type="string" name="sync_too_many_deletes_desc" />
+ <java-symbol type="string" name="sync_undo_deletes" />
+ <java-symbol type="string" name="terabyteShort" />
+ <java-symbol type="string" name="text_copied" />
+ <java-symbol type="string" name="time1_time2" />
+ <java-symbol type="string" name="time_date" />
+ <java-symbol type="string" name="time_of_day" />
+ <java-symbol type="string" name="time_picker_decrement_hour_button" />
+ <java-symbol type="string" name="time_picker_decrement_minute_button" />
+ <java-symbol type="string" name="time_picker_decrement_set_am_button" />
+ <java-symbol type="string" name="time_picker_dialog_title" />
+ <java-symbol type="string" name="time_picker_increment_hour_button" />
+ <java-symbol type="string" name="time_picker_increment_minute_button" />
+ <java-symbol type="string" name="time_picker_increment_set_pm_button" />
+ <java-symbol type="string" name="time_picker_separator" />
+ <java-symbol type="string" name="time_wday" />
+ <java-symbol type="string" name="time_wday_date" />
+ <java-symbol type="string" name="today" />
+ <java-symbol type="string" name="tomorrow" />
+ <java-symbol type="string" name="twelve_hour_time_format" />
+ <java-symbol type="string" name="twenty_four_hour_time_format" />
+ <java-symbol type="string" name="upload_file" />
+ <java-symbol type="string" name="volume_alarm" />
+ <java-symbol type="string" name="volume_icon_description_bluetooth" />
+ <java-symbol type="string" name="volume_icon_description_incall" />
+ <java-symbol type="string" name="volume_icon_description_media" />
+ <java-symbol type="string" name="volume_icon_description_notification" />
+ <java-symbol type="string" name="volume_icon_description_ringer" />
+ <java-symbol type="string" name="wait" />
+ <java-symbol type="string" name="wday1_date1_time1_wday2_date2_time2" />
+ <java-symbol type="string" name="wday1_date1_wday2_date2" />
+ <java-symbol type="string" name="wday_date" />
+ <java-symbol type="string" name="web_user_agent" />
+ <java-symbol type="string" name="web_user_agent_target_content" />
+ <java-symbol type="string" name="webpage_unresponsive" />
+ <java-symbol type="string" name="whichApplication" />
+ <java-symbol type="string" name="wifi_available_sign_in" />
+ <java-symbol type="string" name="wifi_available_sign_in_detailed" />
+ <java-symbol type="string" name="wifi_p2p_dialog_title" />
+ <java-symbol type="string" name="wifi_p2p_enabled_notification_message" />
+ <java-symbol type="string" name="wifi_p2p_enabled_notification_title" />
+ <java-symbol type="string" name="wifi_p2p_failed_message" />
+ <java-symbol type="string" name="wifi_p2p_from_message" />
+ <java-symbol type="string" name="wifi_p2p_invitation_sent_title" />
+ <java-symbol type="string" name="wifi_p2p_invitation_to_connect_title" />
+ <java-symbol type="string" name="wifi_p2p_show_pin_message" />
+ <java-symbol type="string" name="wifi_p2p_to_message" />
+ <java-symbol type="string" name="wifi_p2p_turnon_message" />
+ <java-symbol type="string" name="wifi_tether_configure_ssid_default" />
+ <java-symbol type="string" name="wifi_watchdog_network_disabled" />
+ <java-symbol type="string" name="wifi_watchdog_network_disabled_detailed" />
+ <java-symbol type="string" name="yesterday" />
+ <java-symbol type="string" name="imei" />
+ <java-symbol type="string" name="meid" />
+ <java-symbol type="string" name="granularity_label_character" />
+ <java-symbol type="string" name="granularity_label_word" />
+ <java-symbol type="string" name="granularity_label_link" />
+ <java-symbol type="string" name="granularity_label_line" />
+ <java-symbol type="string" name="default_audio_route_name" />
+ <java-symbol type="string" name="default_audio_route_name_headphones" />
+ <java-symbol type="string" name="default_audio_route_name_dock_speakers" />
+ <java-symbol type="string" name="default_audio_route_name_hdmi" />
+ <java-symbol type="string" name="default_audio_route_category_name" />
+
+ <java-symbol type="plurals" name="abbrev_in_num_days" />
+ <java-symbol type="plurals" name="abbrev_in_num_hours" />
+ <java-symbol type="plurals" name="abbrev_in_num_minutes" />
+ <java-symbol type="plurals" name="abbrev_in_num_seconds" />
+ <java-symbol type="plurals" name="abbrev_num_days_ago" />
+ <java-symbol type="plurals" name="abbrev_num_hours_ago" />
+ <java-symbol type="plurals" name="abbrev_num_minutes_ago" />
+ <java-symbol type="plurals" name="abbrev_num_seconds_ago" />
+ <java-symbol type="plurals" name="in_num_days" />
+ <java-symbol type="plurals" name="in_num_hours" />
+ <java-symbol type="plurals" name="in_num_minutes" />
+ <java-symbol type="plurals" name="in_num_seconds" />
+ <java-symbol type="plurals" name="last_num_days" />
+ <java-symbol type="plurals" name="matches_found" />
+ <java-symbol type="plurals" name="num_days_ago" />
+ <java-symbol type="plurals" name="num_hours_ago" />
+ <java-symbol type="plurals" name="num_minutes_ago" />
+ <java-symbol type="plurals" name="num_seconds_ago" />
+
+ <java-symbol type="array" name="carrier_properties" />
+ <java-symbol type="array" name="config_data_usage_network_types" />
+ <java-symbol type="array" name="config_sms_enabled_locking_shift_tables" />
+ <java-symbol type="array" name="config_sms_enabled_single_shift_tables" />
+ <java-symbol type="array" name="config_twoDigitNumberPattern" />
+ <java-symbol type="array" name="networkAttributes" />
+ <java-symbol type="array" name="preloaded_color_state_lists" />
+ <java-symbol type="array" name="preloaded_drawables" />
+ <java-symbol type="array" name="special_locale_codes" />
+ <java-symbol type="array" name="special_locale_names" />
+ <java-symbol type="array" name="config_masterVolumeRamp" />
+ <java-symbol type="array" name="config_cdma_dun_supported_types" />
+
+ <java-symbol type="drawable" name="default_wallpaper" />
+ <java-symbol type="drawable" name="indicator_input_error" />
+ <java-symbol type="drawable" name="overscroll_edge" />
+ <java-symbol type="drawable" name="overscroll_glow" />
+ <java-symbol type="drawable" name="popup_bottom_dark" />
+ <java-symbol type="drawable" name="popup_bottom_bright" />
+ <java-symbol type="drawable" name="popup_bottom_medium" />
+ <java-symbol type="drawable" name="popup_center_dark" />
+ <java-symbol type="drawable" name="popup_center_bright" />
+ <java-symbol type="drawable" name="popup_full_dark" />
+ <java-symbol type="drawable" name="popup_full_bright" />
+ <java-symbol type="drawable" name="popup_top_dark" />
+ <java-symbol type="drawable" name="popup_top_bright" />
+ <java-symbol type="drawable" name="search_spinner" />
+ <java-symbol type="drawable" name="sym_app_on_sd_unavailable_icon" />
+ <java-symbol type="drawable" name="text_edit_side_paste_window" />
+ <java-symbol type="drawable" name="text_edit_paste_window" />
+ <java-symbol type="drawable" name="btn_check_off" />
+ <java-symbol type="drawable" name="btn_code_lock_default_holo" />
+ <java-symbol type="drawable" name="btn_code_lock_touched_holo" />
+ <java-symbol type="drawable" name="clock_dial" />
+ <java-symbol type="drawable" name="clock_hand_hour" />
+ <java-symbol type="drawable" name="clock_hand_minute" />
+ <java-symbol type="drawable" name="emo_im_angel" />
+ <java-symbol type="drawable" name="emo_im_cool" />
+ <java-symbol type="drawable" name="emo_im_crying" />
+ <java-symbol type="drawable" name="emo_im_embarrassed" />
+ <java-symbol type="drawable" name="emo_im_foot_in_mouth" />
+ <java-symbol type="drawable" name="emo_im_happy" />
+ <java-symbol type="drawable" name="emo_im_kissing" />
+ <java-symbol type="drawable" name="emo_im_laughing" />
+ <java-symbol type="drawable" name="emo_im_lips_are_sealed" />
+ <java-symbol type="drawable" name="emo_im_money_mouth" />
+ <java-symbol type="drawable" name="emo_im_sad" />
+ <java-symbol type="drawable" name="emo_im_surprised" />
+ <java-symbol type="drawable" name="emo_im_tongue_sticking_out" />
+ <java-symbol type="drawable" name="emo_im_undecided" />
+ <java-symbol type="drawable" name="emo_im_winking" />
+ <java-symbol type="drawable" name="emo_im_wtf" />
+ <java-symbol type="drawable" name="emo_im_yelling" />
+ <java-symbol type="drawable" name="expander_close_holo_dark" />
+ <java-symbol type="drawable" name="expander_open_holo_dark" />
+ <java-symbol type="drawable" name="ic_audio_alarm" />
+ <java-symbol type="drawable" name="ic_audio_alarm_mute" />
+ <java-symbol type="drawable" name="ic_audio_bt" />
+ <java-symbol type="drawable" name="ic_audio_bt_mute" />
+ <java-symbol type="drawable" name="ic_audio_notification" />
+ <java-symbol type="drawable" name="ic_audio_notification_mute" />
+ <java-symbol type="drawable" name="ic_audio_phone" />
+ <java-symbol type="drawable" name="ic_audio_ring_notif" />
+ <java-symbol type="drawable" name="ic_audio_ring_notif_mute" />
+ <java-symbol type="drawable" name="ic_audio_ring_notif_vibrate" />
+ <java-symbol type="drawable" name="ic_audio_vol" />
+ <java-symbol type="drawable" name="ic_audio_vol_mute" />
+ <java-symbol type="drawable" name="ic_bullet_key_permission" />
+ <java-symbol type="drawable" name="ic_contact_picture" />
+ <java-symbol type="drawable" name="ic_dialog_usb" />
+ <java-symbol type="drawable" name="ic_emergency" />
+ <java-symbol type="drawable" name="ic_media_stop" />
+ <java-symbol type="drawable" name="ic_text_dot" />
+ <java-symbol type="drawable" name="indicator_code_lock_drag_direction_green_up" />
+ <java-symbol type="drawable" name="indicator_code_lock_drag_direction_red_up" />
+ <java-symbol type="drawable" name="indicator_code_lock_point_area_default_holo" />
+ <java-symbol type="drawable" name="indicator_code_lock_point_area_green_holo" />
+ <java-symbol type="drawable" name="indicator_code_lock_point_area_red_holo" />
+ <java-symbol type="drawable" name="jog_dial_arrow_long_left_green" />
+ <java-symbol type="drawable" name="jog_dial_arrow_long_right_red" />
+ <java-symbol type="drawable" name="jog_dial_arrow_short_left_and_right" />
+ <java-symbol type="drawable" name="jog_dial_bg" />
+ <java-symbol type="drawable" name="jog_dial_dimple" />
+ <java-symbol type="drawable" name="jog_dial_dimple_dim" />
+ <java-symbol type="drawable" name="jog_tab_bar_left_generic" />
+ <java-symbol type="drawable" name="jog_tab_bar_right_generic" />
+ <java-symbol type="drawable" name="jog_tab_left_generic" />
+ <java-symbol type="drawable" name="jog_tab_right_generic" />
+ <java-symbol type="drawable" name="jog_tab_target_gray" />
+ <java-symbol type="drawable" name="picture_emergency" />
+ <java-symbol type="drawable" name="platlogo" />
+ <java-symbol type="drawable" name="platlogo_alt" />
+ <java-symbol type="drawable" name="stat_notify_sync_error" />
+ <java-symbol type="drawable" name="stat_notify_wifi_in_range" />
+ <java-symbol type="drawable" name="stat_sys_gps_on" />
+ <java-symbol type="drawable" name="stat_sys_tether_wifi" />
+ <java-symbol type="drawable" name="status_bar_background" />
+ <java-symbol type="drawable" name="sym_keyboard_shift" />
+ <java-symbol type="drawable" name="sym_keyboard_shift_locked" />
+ <java-symbol type="drawable" name="tab_bottom_left" />
+ <java-symbol type="drawable" name="tab_bottom_left_v4" />
+ <java-symbol type="drawable" name="tab_bottom_right" />
+ <java-symbol type="drawable" name="tab_bottom_right_v4" />
+ <java-symbol type="drawable" name="tab_indicator_v4" />
+ <java-symbol type="drawable" name="text_select_handle_left" />
+ <java-symbol type="drawable" name="text_select_handle_middle" />
+ <java-symbol type="drawable" name="text_select_handle_right" />
+ <java-symbol type="drawable" name="unknown_image" />
+ <java-symbol type="drawable" name="unlock_default" />
+ <java-symbol type="drawable" name="unlock_halo" />
+ <java-symbol type="drawable" name="unlock_ring" />
+ <java-symbol type="drawable" name="unlock_wave" />
+ <java-symbol type="drawable" name="ic_lockscreen_camera" />
+ <java-symbol type="drawable" name="ic_lockscreen_silent" />
+ <java-symbol type="drawable" name="ic_lockscreen_unlock" />
+ <java-symbol type="drawable" name="ic_action_assist_generic" />
+ <java-symbol type="drawable" name="notification_bg" />
+ <java-symbol type="drawable" name="notification_bg_low" />
+ <java-symbol type="drawable" name="notification_template_icon_bg" />
+ <java-symbol type="drawable" name="notification_template_icon_low_bg" />
+ <java-symbol type="drawable" name="ic_lockscreen_unlock_phantom" />
+ <java-symbol type="drawable" name="ic_media_route_on_holo_dark" />
+ <java-symbol type="drawable" name="ic_media_route_disabled_holo_dark" />
+
+ <java-symbol type="layout" name="action_bar_home" />
+ <java-symbol type="layout" name="action_bar_title_item" />
+ <java-symbol type="layout" name="action_menu_item_layout" />
+ <java-symbol type="layout" name="action_menu_layout" />
+ <java-symbol type="layout" name="action_mode_close_item" />
+ <java-symbol type="layout" name="alert_dialog" />
+ <java-symbol type="layout" name="choose_account" />
+ <java-symbol type="layout" name="choose_account_row" />
+ <java-symbol type="layout" name="choose_account_type" />
+ <java-symbol type="layout" name="choose_type_and_account" />
+ <java-symbol type="layout" name="grant_credentials_permission" />
+ <java-symbol type="layout" name="number_picker" />
+ <java-symbol type="layout" name="permissions_package_list_item" />
+ <java-symbol type="layout" name="popup_menu_item_layout" />
+ <java-symbol type="layout" name="remote_views_adapter_default_loading_view" />
+ <java-symbol type="layout" name="search_bar" />
+ <java-symbol type="layout" name="search_dropdown_item_icons_2line" />
+ <java-symbol type="layout" name="search_view" />
+ <java-symbol type="layout" name="select_dialog" />
+ <java-symbol type="layout" name="simple_dropdown_hint" />
+ <java-symbol type="layout" name="status_bar_latest_event_content" />
+ <java-symbol type="layout" name="status_bar_latest_event_ticker" />
+ <java-symbol type="layout" name="status_bar_latest_event_ticker_large_icon" />
+ <java-symbol type="layout" name="text_edit_action_popup_text" />
+ <java-symbol type="layout" name="text_drag_thumbnail" />
+ <java-symbol type="layout" name="typing_filter" />
+ <java-symbol type="layout" name="activity_chooser_view" />
+ <java-symbol type="layout" name="activity_chooser_view_list_item" />
+ <java-symbol type="layout" name="activity_list" />
+ <java-symbol type="layout" name="activity_list_item_2" />
+ <java-symbol type="layout" name="alert_dialog_progress" />
+ <java-symbol type="layout" name="always_use_checkbox" />
+ <java-symbol type="layout" name="app_permission_item" />
+ <java-symbol type="layout" name="app_permission_item_old" />
+ <java-symbol type="layout" name="app_perms_summary" />
+ <java-symbol type="layout" name="calendar_view" />
+ <java-symbol type="layout" name="character_picker" />
+ <java-symbol type="layout" name="character_picker_button" />
+ <java-symbol type="layout" name="date_picker" />
+ <java-symbol type="layout" name="date_picker_dialog" />
+ <java-symbol type="layout" name="expanded_menu_layout" />
+ <java-symbol type="layout" name="fragment_bread_crumb_item" />
+ <java-symbol type="layout" name="fragment_bread_crumbs" />
+ <java-symbol type="layout" name="heavy_weight_switcher" />
+ <java-symbol type="layout" name="icon_menu_item_layout" />
+ <java-symbol type="layout" name="icon_menu_layout" />
+ <java-symbol type="layout" name="input_method" />
+ <java-symbol type="layout" name="input_method_extract_view" />
+ <java-symbol type="layout" name="input_method_switch_dialog_title" />
+ <java-symbol type="layout" name="js_prompt" />
+ <java-symbol type="layout" name="list_content_simple" />
+ <java-symbol type="layout" name="list_menu_item_checkbox" />
+ <java-symbol type="layout" name="list_menu_item_icon" />
+ <java-symbol type="layout" name="list_menu_item_layout" />
+ <java-symbol type="layout" name="list_menu_item_radio" />
+ <java-symbol type="layout" name="locale_picker_item" />
+ <java-symbol type="layout" name="media_controller" />
+ <java-symbol type="layout" name="overlay_display_window" />
+ <java-symbol type="layout" name="preference" />
+ <java-symbol type="layout" name="preference_header_item" />
+ <java-symbol type="layout" name="preference_list_content" />
+ <java-symbol type="layout" name="preference_list_content_single" />
+ <java-symbol type="layout" name="preference_list_fragment" />
+ <java-symbol type="layout" name="preference_widget_seekbar" />
+ <java-symbol type="layout" name="progress_dialog" />
+ <java-symbol type="layout" name="resolve_list_item" />
+ <java-symbol type="layout" name="seekbar_dialog" />
+ <java-symbol type="layout" name="select_dialog_singlechoice_holo" />
+ <java-symbol type="layout" name="ssl_certificate" />
+ <java-symbol type="layout" name="tab_content" />
+ <java-symbol type="layout" name="tab_indicator_holo" />
+ <java-symbol type="layout" name="textview_hint" />
+ <java-symbol type="layout" name="time_picker" />
+ <java-symbol type="layout" name="time_picker_dialog" />
+ <java-symbol type="layout" name="transient_notification" />
+ <java-symbol type="layout" name="volume_adjust" />
+ <java-symbol type="layout" name="volume_adjust_item" />
+ <java-symbol type="layout" name="web_text_view_dropdown" />
+ <java-symbol type="layout" name="webview_find" />
+ <java-symbol type="layout" name="webview_select_singlechoice" />
+ <java-symbol type="layout" name="wifi_p2p_dialog" />
+ <java-symbol type="layout" name="wifi_p2p_dialog_row" />
+ <java-symbol type="layout" name="zoom_container" />
+ <java-symbol type="layout" name="zoom_controls" />
+ <java-symbol type="layout" name="zoom_magnify" />
+ <java-symbol type="layout" name="notification_action" />
+ <java-symbol type="layout" name="notification_action_tombstone" />
+ <java-symbol type="layout" name="notification_intruder_content" />
+ <java-symbol type="layout" name="notification_template_base" />
+ <java-symbol type="layout" name="notification_template_big_base" />
+ <java-symbol type="layout" name="notification_template_big_picture" />
+ <java-symbol type="layout" name="notification_template_big_text" />
+ <java-symbol type="layout" name="notification_template_part_time" />
+ <java-symbol type="layout" name="notification_template_part_chronometer" />
+ <java-symbol type="layout" name="notification_template_inbox" />
+ <java-symbol type="layout" name="keyguard_multi_user_avatar" />
+ <java-symbol type="layout" name="keyguard_multi_user_selector_widget" />
+
+ <java-symbol type="anim" name="slide_in_child_bottom" />
+ <java-symbol type="anim" name="slide_in_right" />
+ <java-symbol type="anim" name="slide_out_left" />
+
+ <java-symbol type="menu" name="webview_copy" />
+ <java-symbol type="menu" name="webview_find" />
+
+ <java-symbol type="xml" name="password_kbd_qwerty" />
+ <java-symbol type="xml" name="autotext" />
+ <java-symbol type="xml" name="eri" />
+ <java-symbol type="xml" name="password_kbd_numeric" />
+ <java-symbol type="xml" name="password_kbd_qwerty_shifted" />
+ <java-symbol type="xml" name="password_kbd_symbols" />
+ <java-symbol type="xml" name="password_kbd_symbols_shift" />
+ <java-symbol type="xml" name="power_profile" />
+ <java-symbol type="xml" name="time_zones_by_country" />
+ <java-symbol type="xml" name="sms_short_codes" />
+
+ <java-symbol type="raw" name="accessibility_gestures" />
+ <java-symbol type="raw" name="incognito_mode_start_page" />
+ <java-symbol type="raw" name="loaderror" />
+ <java-symbol type="raw" name="nodomain" />
+
+ <java-symbol type="style" name="Animation.DropDownUp" />
+ <java-symbol type="style" name="Animation.DropDownDown" />
+ <java-symbol type="style" name="Animation.PopupWindow" />
+ <java-symbol type="style" name="Animation.TypingFilter" />
+ <java-symbol type="style" name="Animation.TypingFilterRestore" />
+ <java-symbol type="style" name="Animation.Dream" />
+ <java-symbol type="style" name="Theme.DeviceDefault.Dialog.Alert" />
+ <java-symbol type="style" name="Theme.DeviceDefault.Light.Dialog.Alert" />
+ <java-symbol type="style" name="Theme.Dialog.Alert" />
+ <java-symbol type="style" name="Theme.Holo.Dialog.Alert" />
+ <java-symbol type="style" name="Theme.Holo.Light.Dialog.Alert" />
+ <java-symbol type="style" name="ActiveWallpaperSettings" />
+ <java-symbol type="style" name="Animation.InputMethodFancy" />
+ <java-symbol type="style" name="Animation.Wallpaper" />
+ <java-symbol type="style" name="Animation.ZoomButtons" />
+ <java-symbol type="style" name="PreviewWallpaperSettings" />
+ <java-symbol type="style" name="TextAppearance.SlidingTabActive" />
+ <java-symbol type="style" name="TextAppearance.SlidingTabNormal" />
+ <java-symbol type="style" name="Theme.DeviceDefault.Dialog.NoFrame" />
+ <java-symbol type="style" name="Theme.IconMenu" />
+ <java-symbol type="style" name="Theme.Panel.Volume" />
+
+ <java-symbol type="attr" name="mediaRouteButtonStyle" />
+ <java-symbol type="attr" name="externalRouteEnabledDrawable" />
+ <java-symbol type="id" name="extended_settings" />
+ <java-symbol type="id" name="check" />
+ <java-symbol type="id" name="volume_slider" />
+ <java-symbol type="id" name="volume_icon" />
+ <java-symbol type="drawable" name="ic_media_route_on_holo_dark" />
+ <java-symbol type="layout" name="media_route_chooser_layout" />
+ <java-symbol type="layout" name="media_route_list_item_top_header" />
+ <java-symbol type="layout" name="media_route_list_item_section_header" />
+ <java-symbol type="layout" name="media_route_list_item" />
+ <java-symbol type="layout" name="media_route_list_item_checkable" />
+ <java-symbol type="layout" name="media_route_list_item_collapse_group" />
+ <java-symbol type="string" name="bluetooth_a2dp_audio_route_name" />
+
+ <!-- From android.policy -->
+ <java-symbol type="anim" name="app_starting_exit" />
+ <java-symbol type="anim" name="lock_screen_behind_enter" />
+ <java-symbol type="anim" name="lock_screen_wallpaper_behind_enter" />
+ <java-symbol type="anim" name="dock_top_enter" />
+ <java-symbol type="anim" name="dock_top_exit" />
+ <java-symbol type="anim" name="dock_bottom_enter" />
+ <java-symbol type="anim" name="dock_bottom_exit" />
+ <java-symbol type="anim" name="dock_left_enter" />
+ <java-symbol type="anim" name="dock_left_exit" />
+ <java-symbol type="anim" name="dock_right_enter" />
+ <java-symbol type="anim" name="dock_right_exit" />
+ <java-symbol type="anim" name="keyguard_security_animate_in" />
+ <java-symbol type="anim" name="keyguard_security_animate_out" />
+ <java-symbol type="anim" name="keyguard_security_fade_in" />
+ <java-symbol type="anim" name="keyguard_security_fade_out" />
+ <java-symbol type="array" name="config_keyboardTapVibePattern" />
+ <java-symbol type="array" name="config_longPressVibePattern" />
+ <java-symbol type="array" name="config_safeModeDisabledVibePattern" />
+ <java-symbol type="array" name="config_safeModeEnabledVibePattern" />
+ <java-symbol type="array" name="config_virtualKeyVibePattern" />
+ <java-symbol type="array" name="lockscreen_targets_when_silent" />
+ <java-symbol type="array" name="lockscreen_targets_when_soundon" />
+ <java-symbol type="array" name="lockscreen_targets_with_camera" />
+ <java-symbol type="attr" name="actionModePopupWindowStyle" />
+ <java-symbol type="attr" name="dialogCustomTitleDecorLayout" />
+ <java-symbol type="attr" name="dialogTitleDecorLayout" />
+ <java-symbol type="attr" name="dialogTitleIconsDecorLayout" />
+ <java-symbol type="bool" name="config_allowAllRotations" />
+ <java-symbol type="bool" name="config_annoy_dianne" />
+ <java-symbol type="bool" name="config_carDockEnablesAccelerometer" />
+ <java-symbol type="bool" name="config_deskDockEnablesAccelerometer" />
+ <java-symbol type="bool" name="config_disableMenuKeyInLockScreen" />
+ <java-symbol type="bool" name="config_enableLockBeforeUnlockScreen" />
+ <java-symbol type="bool" name="config_enableLockScreenRotation" />
+ <java-symbol type="bool" name="config_lidControlsSleep" />
+ <java-symbol type="bool" name="config_reverseDefaultRotation" />
+ <java-symbol type="bool" name="config_showNavigationBar" />
+ <java-symbol type="bool" name="target_honeycomb_needs_options_menu" />
+ <java-symbol type="dimen" name="navigation_bar_height" />
+ <java-symbol type="dimen" name="navigation_bar_height_landscape" />
+ <java-symbol type="dimen" name="navigation_bar_width" />
+ <java-symbol type="dimen" name="status_bar_height" />
+ <java-symbol type="dimen" name="kg_widget_page_padding" />
+ <java-symbol type="drawable" name="ic_jog_dial_sound_off" />
+ <java-symbol type="drawable" name="ic_jog_dial_sound_on" />
+ <java-symbol type="drawable" name="ic_jog_dial_unlock" />
+ <java-symbol type="drawable" name="ic_jog_dial_vibrate_on" />
+ <java-symbol type="drawable" name="ic_lock_airplane_mode" />
+ <java-symbol type="drawable" name="ic_lock_airplane_mode_off" />
+ <java-symbol type="drawable" name="ic_menu_cc" />
+ <java-symbol type="drawable" name="jog_tab_bar_left_unlock" />
+ <java-symbol type="drawable" name="jog_tab_bar_right_sound_off" />
+ <java-symbol type="drawable" name="jog_tab_bar_right_sound_on" />
+ <java-symbol type="drawable" name="jog_tab_left_unlock" />
+ <java-symbol type="drawable" name="jog_tab_right_sound_off" />
+ <java-symbol type="drawable" name="jog_tab_right_sound_on" />
+ <java-symbol type="drawable" name="jog_tab_target_green" />
+ <java-symbol type="drawable" name="jog_tab_target_yellow" />
+ <java-symbol type="drawable" name="magnified_region_frame" />
+ <java-symbol type="drawable" name="menu_background" />
+ <java-symbol type="drawable" name="stat_sys_secure" />
+ <java-symbol type="drawable" name="kg_widget_overscroll_layer_left" />
+ <java-symbol type="drawable" name="kg_widget_overscroll_layer_right" />
+ <java-symbol type="id" name="action_mode_bar_stub" />
+ <java-symbol type="id" name="alarm_status" />
+ <java-symbol type="id" name="backspace" />
+ <java-symbol type="id" name="button0" />
+ <java-symbol type="id" name="button4" />
+ <java-symbol type="id" name="button5" />
+ <java-symbol type="id" name="button6" />
+ <java-symbol type="id" name="button7" />
+ <java-symbol type="id" name="carrier" />
+ <java-symbol type="id" name="date" />
+ <java-symbol type="id" name="eight" />
+ <java-symbol type="id" name="emergencyCallButton" />
+ <java-symbol type="id" name="face_unlock_area_view" />
+ <java-symbol type="id" name="five" />
+ <java-symbol type="id" name="forgotPatternButton" />
+ <java-symbol type="id" name="four" />
+ <java-symbol type="id" name="headerText" />
+ <java-symbol type="id" name="icon_menu_presenter" />
+ <java-symbol type="id" name="instructions" />
+ <java-symbol type="id" name="keyboard" />
+ <java-symbol type="id" name="list_menu_presenter" />
+ <java-symbol type="id" name="lockPattern" />
+ <java-symbol type="id" name="lock_screen" />
+ <java-symbol type="id" name="login" />
+ <java-symbol type="id" name="nine" />
+ <java-symbol type="id" name="no_applications_message" />
+ <java-symbol type="id" name="ok" />
+ <java-symbol type="id" name="one" />
+ <java-symbol type="id" name="option1" />
+ <java-symbol type="id" name="option2" />
+ <java-symbol type="id" name="option3" />
+ <java-symbol type="id" name="password" />
+ <java-symbol type="id" name="passwordEntry" />
+ <java-symbol type="id" name="pinDel" />
+ <java-symbol type="id" name="pinDisplay" />
+ <java-symbol type="id" name="owner_info" />
+ <java-symbol type="id" name="pukDel" />
+ <java-symbol type="id" name="pukDisplay" />
+ <java-symbol type="id" name="right_icon" />
+ <java-symbol type="id" name="seven" />
+ <java-symbol type="id" name="six" />
+ <java-symbol type="id" name="status" />
+ <java-symbol type="id" name="status1" />
+ <java-symbol type="id" name="switch_ime_button" />
+ <java-symbol type="id" name="three" />
+ <java-symbol type="id" name="title_container" />
+ <java-symbol type="id" name="topHeader" />
+ <java-symbol type="id" name="transport" />
+ <java-symbol type="id" name="transport_bg_protect" />
+ <java-symbol type="id" name="two" />
+ <java-symbol type="id" name="unlock_widget" />
+ <java-symbol type="id" name="zero" />
+ <java-symbol type="id" name="keyguard_message_area" />
+ <java-symbol type="id" name="keyguard_click_area" />
+ <java-symbol type="id" name="keyguard_selector_view" />
+ <java-symbol type="id" name="keyguard_pattern_view" />
+ <java-symbol type="id" name="keyguard_password_view" />
+ <java-symbol type="id" name="keyguard_face_unlock_view" />
+ <java-symbol type="id" name="keyguard_sim_pin_view" />
+ <java-symbol type="id" name="keyguard_sim_puk_view" />
+ <java-symbol type="id" name="keyguard_account_view" />
+ <java-symbol type="id" name="app_widget_container" />
+ <java-symbol type="id" name="view_flipper" />
+ <java-symbol type="id" name="emergency_call_button" />
+ <java-symbol type="id" name="keyguard_host_view" />
+ <java-symbol type="id" name="delete_button" />
+ <java-symbol type="id" name="lockPatternView" />
+ <java-symbol type="id" name="forgot_password_button" />
+ <java-symbol type="id" name="glow_pad_view" />
+ <java-symbol type="id" name="sim_pin_entry" />
+ <java-symbol type="id" name="delete_button" />
+ <java-symbol type="id" name="sim_puk_entry" />
+ <java-symbol type="id" name="sim_pin_entry" />
+ <java-symbol type="id" name="puk_delete_button" />
+ <java-symbol type="id" name="pin_delete_button" />
+ <java-symbol type="id" name="keyguard_user_avatar" />
+ <java-symbol type="id" name="keyguard_user_name" />
+ <java-symbol type="id" name="keyguard_active_user" />
+ <java-symbol type="id" name="keyguard_inactive_users" />
+ <java-symbol type="integer" name="config_carDockRotation" />
+ <java-symbol type="integer" name="config_defaultUiModeType" />
+ <java-symbol type="integer" name="config_deskDockRotation" />
+ <java-symbol type="integer" name="config_lidKeyboardAccessibility" />
+ <java-symbol type="integer" name="config_lidNavigationAccessibility" />
+ <java-symbol type="integer" name="config_lidOpenRotation" />
+ <java-symbol type="integer" name="config_longPressOnHomeBehavior" />
+ <java-symbol type="integer" name="kg_security_flip_duration" />
+ <java-symbol type="layout" name="global_actions_item" />
+ <java-symbol type="layout" name="global_actions_silent_mode" />
+ <java-symbol type="layout" name="keyguard_screen_glogin_unlock" />
+ <java-symbol type="layout" name="keyguard_screen_password_landscape" />
+ <java-symbol type="layout" name="keyguard_screen_password_portrait" />
+ <java-symbol type="layout" name="keyguard_screen_sim_pin_landscape" />
+ <java-symbol type="layout" name="keyguard_screen_sim_pin_portrait" />
+ <java-symbol type="layout" name="keyguard_screen_sim_puk_landscape" />
+ <java-symbol type="layout" name="keyguard_screen_sim_puk_portrait" />
+ <java-symbol type="layout" name="keyguard_screen_tab_unlock" />
+ <java-symbol type="layout" name="keyguard_screen_tab_unlock_land" />
+ <java-symbol type="layout" name="keyguard_screen_unlock_landscape" />
+ <java-symbol type="layout" name="keyguard_screen_unlock_portrait" />
+ <java-symbol type="layout" name="keyguard_selector_view" />
+ <java-symbol type="layout" name="keyguard_pattern_view" />
+ <java-symbol type="layout" name="keyguard_password_view" />
+ <java-symbol type="layout" name="keyguard_face_unlock_view" />
+ <java-symbol type="layout" name="keyguard_sim_pin_view" />
+ <java-symbol type="layout" name="keyguard_sim_puk_view" />
+ <java-symbol type="layout" name="keyguard_account_view" />
+ <java-symbol type="layout" name="recent_apps_dialog" />
+ <java-symbol type="layout" name="screen_action_bar" />
+ <java-symbol type="layout" name="screen_action_bar_overlay" />
+ <java-symbol type="layout" name="screen_custom_title" />
+ <java-symbol type="layout" name="screen_progress" />
+ <java-symbol type="layout" name="screen_simple" />
+ <java-symbol type="layout" name="screen_simple_overlay_action_mode" />
+ <java-symbol type="layout" name="screen_title" />
+ <java-symbol type="layout" name="screen_title_icons" />
+ <java-symbol type="layout" name="keyguard_host_view" />
+ <java-symbol type="string" name="abbrev_wday_month_day_no_year" />
+ <java-symbol type="string" name="android_upgrading_title" />
+ <java-symbol type="string" name="bugreport_title" />
+ <java-symbol type="string" name="bugreport_message" />
+ <java-symbol type="string" name="faceunlock_multiple_failures" />
+ <java-symbol type="string" name="global_action_power_off" />
+ <java-symbol type="string" name="global_actions_airplane_mode_off_status" />
+ <java-symbol type="string" name="global_actions_airplane_mode_on_status" />
+ <java-symbol type="string" name="global_actions_toggle_airplane_mode" />
+ <java-symbol type="string" name="global_action_bug_report" />
+ <java-symbol type="string" name="global_action_silent_mode_off_status" />
+ <java-symbol type="string" name="global_action_silent_mode_on_status" />
+ <java-symbol type="string" name="global_action_toggle_silent_mode" />
+ <java-symbol type="string" name="invalidPuk" />
+ <java-symbol type="string" name="keyguard_password_enter_pin_code" />
+ <java-symbol type="string" name="keyguard_password_enter_puk_code" />
+ <java-symbol type="string" name="keyguard_password_wrong_pin_code" />
+ <java-symbol type="string" name="lockscreen_carrier_default" />
+ <java-symbol type="string" name="lockscreen_charged" />
+ <java-symbol type="string" name="lockscreen_failed_attempts_almost_at_wipe" />
+ <java-symbol type="string" name="lockscreen_failed_attempts_almost_glogin" />
+ <java-symbol type="string" name="lockscreen_failed_attempts_now_wiping" />
+ <java-symbol type="string" name="lockscreen_forgot_pattern_button_text" />
+ <java-symbol type="string" name="lockscreen_glogin_checking_password" />
+ <java-symbol type="string" name="lockscreen_glogin_forgot_pattern" />
+ <java-symbol type="string" name="lockscreen_glogin_invalid_input" />
+ <java-symbol type="string" name="lockscreen_glogin_too_many_attempts" />
+ <java-symbol type="string" name="lockscreen_instructions_when_pattern_disabled" />
+ <java-symbol type="string" name="lockscreen_low_battery" />
+ <java-symbol type="string" name="lockscreen_missing_sim_instructions" />
+ <java-symbol type="string" name="lockscreen_missing_sim_instructions_long" />
+ <java-symbol type="string" name="lockscreen_missing_sim_message_short" />
+ <java-symbol type="string" name="lockscreen_network_locked_message" />
+ <java-symbol type="string" name="lockscreen_password_wrong" />
+ <java-symbol type="string" name="lockscreen_pattern_instructions" />
+ <java-symbol type="string" name="lockscreen_pattern_wrong" />
+ <java-symbol type="string" name="lockscreen_permanent_disabled_sim_message_short" />
+ <java-symbol type="string" name="lockscreen_permanent_disabled_sim_instructions" />
+ <java-symbol type="string" name="lockscreen_plugged_in" />
+ <java-symbol type="string" name="lockscreen_sim_locked_message" />
+ <java-symbol type="string" name="lockscreen_sim_puk_locked_message" />
+ <java-symbol type="string" name="lockscreen_sim_unlock_progress_dialog_message" />
+ <java-symbol type="string" name="lockscreen_sound_off_label" />
+ <java-symbol type="string" name="lockscreen_sound_on_label" />
+ <java-symbol type="string" name="lockscreen_too_many_failed_attempts_countdown" />
+ <java-symbol type="string" name="lockscreen_too_many_failed_attempts_dialog_message" />
+ <java-symbol type="string" name="lockscreen_too_many_failed_password_attempts_dialog_message" />
+ <java-symbol type="string" name="lockscreen_too_many_failed_pin_attempts_dialog_message" />
+ <java-symbol type="string" name="lockscreen_unlock_label" />
+ <java-symbol type="string" name="status_bar_device_locked" />
+ <java-symbol type="style" name="Animation.LockScreen" />
+ <java-symbol type="style" name="Theme.Dialog.RecentApplications" />
+ <java-symbol type="style" name="Theme.ExpandedMenu" />
+ <java-symbol type="string" name="kg_emergency_call_label" />
+ <java-symbol type="string" name="kg_forgot_pattern_button_text" />
+ <java-symbol type="string" name="kg_wrong_pattern" />
+ <java-symbol type="string" name="kg_wrong_password" />
+ <java-symbol type="string" name="kg_wrong_pin" />
+ <java-symbol type="string" name="kg_too_many_failed_attempts_countdown" />
+ <java-symbol type="string" name="kg_pattern_instructions" />
+ <java-symbol type="string" name="kg_sim_pin_instructions" />
+ <java-symbol type="string" name="kg_pin_instructions" />
+ <java-symbol type="string" name="kg_password_instructions" />
+ <java-symbol type="string" name="kg_puk_enter_puk_hint" />
+ <java-symbol type="string" name="kg_puk_enter_pin_hint" />
+ <java-symbol type="string" name="kg_sim_unlock_progress_dialog_message" />
+ <java-symbol type="string" name="kg_password_wrong_pin_code" />
+ <java-symbol type="string" name="kg_invalid_sim_pin_hint" />
+ <java-symbol type="string" name="kg_invalid_sim_puk_hint" />
+ <java-symbol type="string" name="kg_sim_puk_recovery_hint" />
+ <java-symbol type="string" name="kg_invalid_puk" />
+ <java-symbol type="string" name="kg_login_too_many_attempts" />
+ <java-symbol type="string" name="kg_login_instructions" />
+ <java-symbol type="string" name="kg_login_username_hint" />
+ <java-symbol type="string" name="kg_login_password_hint" />
+ <java-symbol type="string" name="kg_login_submit_button" />
+ <java-symbol type="string" name="kg_login_invalid_input" />
+ <java-symbol type="string" name="kg_login_account_recovery_hint" />
+ <java-symbol type="string" name="kg_login_checking_password" />
+ <java-symbol type="string" name="kg_too_many_failed_pin_attempts_dialog_message" />
+ <java-symbol type="string" name="kg_too_many_failed_pattern_attempts_dialog_message" />
+ <java-symbol type="string" name="kg_too_many_failed_password_attempts_dialog_message" />
+ <java-symbol type="string" name="kg_failed_attempts_almost_at_wipe" />
+ <java-symbol type="string" name="kg_failed_attempts_now_wiping" />
+ <java-symbol type="string" name="kg_failed_attempts_almost_at_login" />
+
+ <!-- From services -->
+ <java-symbol type="anim" name="screen_rotate_0_enter" />
+ <java-symbol type="anim" name="screen_rotate_0_exit" />
+ <java-symbol type="anim" name="screen_rotate_0_frame" />
+ <java-symbol type="anim" name="screen_rotate_180_enter" />
+ <java-symbol type="anim" name="screen_rotate_180_exit" />
+ <java-symbol type="anim" name="screen_rotate_180_frame" />
+ <java-symbol type="anim" name="screen_rotate_finish_enter" />
+ <java-symbol type="anim" name="screen_rotate_finish_exit" />
+ <java-symbol type="anim" name="screen_rotate_finish_frame" />
+ <java-symbol type="anim" name="screen_rotate_minus_90_enter" />
+ <java-symbol type="anim" name="screen_rotate_minus_90_exit" />
+ <java-symbol type="anim" name="screen_rotate_minus_90_frame" />
+ <java-symbol type="anim" name="screen_rotate_plus_90_enter" />
+ <java-symbol type="anim" name="screen_rotate_plus_90_exit" />
+ <java-symbol type="anim" name="screen_rotate_plus_90_frame" />
+ <java-symbol type="anim" name="screen_rotate_start_enter" />
+ <java-symbol type="anim" name="screen_rotate_start_exit" />
+ <java-symbol type="anim" name="screen_rotate_start_frame" />
+ <java-symbol type="anim" name="screen_user_exit" />
+ <java-symbol type="anim" name="screen_user_enter" />
+ <java-symbol type="anim" name="window_move_from_decor" />
+ <java-symbol type="array" name="config_autoBrightnessButtonBacklightValues" />
+ <java-symbol type="array" name="config_autoBrightnessKeyboardBacklightValues" />
+ <java-symbol type="array" name="config_autoBrightnessLcdBacklightValues" />
+ <java-symbol type="array" name="config_autoBrightnessLevels" />
+ <java-symbol type="array" name="config_protectedNetworks" />
+ <java-symbol type="array" name="config_statusBarIcons" />
+ <java-symbol type="array" name="config_tether_bluetooth_regexs" />
+ <java-symbol type="array" name="config_tether_dhcp_range" />
+ <java-symbol type="array" name="config_tether_upstream_types" />
+ <java-symbol type="array" name="config_tether_usb_regexs" />
+ <java-symbol type="array" name="config_tether_wifi_regexs" />
+ <java-symbol type="array" name="config_usbHostBlacklist" />
+ <java-symbol type="array" name="config_serialPorts" />
+ <java-symbol type="array" name="radioAttributes" />
+ <java-symbol type="array" name="config_oemUsbModeOverride" />
+ <java-symbol type="array" name="config_locationProviderPackageNames" />
+ <java-symbol type="array" name="config_overlay_locationProviderPackageNames" />
+ <java-symbol type="bool" name="config_animateScreenLights" />
+ <java-symbol type="bool" name="config_automatic_brightness_available" />
+ <java-symbol type="bool" name="config_sf_limitedAlpha" />
+ <java-symbol type="bool" name="config_unplugTurnsOnScreen" />
+ <java-symbol type="bool" name="config_wifi_background_scan_support" />
+ <java-symbol type="bool" name="config_wifi_dual_band_support" />
+ <java-symbol type="bool" name="config_wimaxEnabled" />
+ <java-symbol type="bool" name="show_ongoing_ime_switcher" />
+ <java-symbol type="color" name="config_defaultNotificationColor" />
+ <java-symbol type="drawable" name="ic_notification_ime_default" />
+ <java-symbol type="drawable" name="stat_notify_car_mode" />
+ <java-symbol type="drawable" name="stat_notify_disabled" />
+ <java-symbol type="drawable" name="stat_notify_disk_full" />
+ <java-symbol type="drawable" name="stat_sys_adb" />
+ <java-symbol type="drawable" name="stat_sys_battery" />
+ <java-symbol type="drawable" name="stat_sys_battery_charge" />
+ <java-symbol type="drawable" name="stat_sys_battery_unknown" />
+ <java-symbol type="drawable" name="stat_sys_data_usb" />
+ <java-symbol type="drawable" name="stat_sys_tether_bluetooth" />
+ <java-symbol type="drawable" name="stat_sys_tether_general" />
+ <java-symbol type="drawable" name="stat_sys_tether_usb" />
+ <java-symbol type="drawable" name="stat_sys_throttled" />
+ <java-symbol type="drawable" name="vpn_connected" />
+ <java-symbol type="drawable" name="vpn_disconnected" />
+ <java-symbol type="id" name="ask_checkbox" />
+ <java-symbol type="id" name="compat_checkbox" />
+ <java-symbol type="id" name="original_app_icon" />
+ <java-symbol type="id" name="original_message" />
+ <java-symbol type="id" name="radio" />
+ <java-symbol type="id" name="reask_hint" />
+ <java-symbol type="id" name="replace_app_icon" />
+ <java-symbol type="id" name="replace_message" />
+ <java-symbol type="fraction" name="config_dimBehindFadeDuration" />
+ <java-symbol type="integer" name="config_carDockKeepsScreenOn" />
+ <java-symbol type="integer" name="config_criticalBatteryWarningLevel" />
+ <java-symbol type="integer" name="config_datause_notification_type" />
+ <java-symbol type="integer" name="config_datause_polling_period_sec" />
+ <java-symbol type="integer" name="config_datause_threshold_bytes" />
+ <java-symbol type="integer" name="config_datause_throttle_kbitsps" />
+ <java-symbol type="integer" name="config_defaultNotificationLedOff" />
+ <java-symbol type="integer" name="config_defaultNotificationLedOn" />
+ <java-symbol type="integer" name="config_deskDockKeepsScreenOn" />
+ <java-symbol type="integer" name="config_lightSensorWarmupTime" />
+ <java-symbol type="integer" name="config_lowBatteryCloseWarningLevel" />
+ <java-symbol type="integer" name="config_lowBatteryWarningLevel" />
+ <java-symbol type="integer" name="config_networkPolicyDefaultWarning" />
+ <java-symbol type="integer" name="config_networkTransitionTimeout" />
+ <java-symbol type="integer" name="config_notificationsBatteryFullARGB" />
+ <java-symbol type="integer" name="config_notificationsBatteryLedOff" />
+ <java-symbol type="integer" name="config_notificationsBatteryLedOn" />
+ <java-symbol type="integer" name="config_notificationsBatteryLowARGB" />
+ <java-symbol type="integer" name="config_notificationsBatteryMediumARGB" />
+ <java-symbol type="integer" name="config_radioScanningTimeout" />
+ <java-symbol type="integer" name="config_screenBrightnessSettingMinimum" />
+ <java-symbol type="integer" name="config_screenBrightnessSettingMaximum" />
+ <java-symbol type="integer" name="config_screenBrightnessSettingDefault" />
+ <java-symbol type="integer" name="config_screenBrightnessDim" />
+ <java-symbol type="integer" name="config_shutdownBatteryTemperature" />
+ <java-symbol type="integer" name="config_virtualKeyQuietTimeMillis" />
+ <java-symbol type="layout" name="am_compat_mode_dialog" />
+ <java-symbol type="layout" name="launch_warning" />
+ <java-symbol type="layout" name="safe_mode" />
+ <java-symbol type="layout" name="simple_list_item_2_single_choice" />
+ <java-symbol type="plurals" name="wifi_available" />
+ <java-symbol type="plurals" name="wifi_available_detailed" />
+ <java-symbol type="string" name="accessibility_binding_label" />
+ <java-symbol type="string" name="adb_active_notification_message" />
+ <java-symbol type="string" name="adb_active_notification_title" />
+ <java-symbol type="string" name="aerr_application" />
+ <java-symbol type="string" name="aerr_process" />
+ <java-symbol type="string" name="aerr_title" />
+ <java-symbol type="string" name="android_upgrading_apk" />
+ <java-symbol type="string" name="android_upgrading_complete" />
+ <java-symbol type="string" name="android_upgrading_starting_apps" />
+ <java-symbol type="string" name="anr_activity_application" />
+ <java-symbol type="string" name="anr_activity_process" />
+ <java-symbol type="string" name="anr_application_process" />
+ <java-symbol type="string" name="anr_process" />
+ <java-symbol type="string" name="anr_title" />
+ <java-symbol type="string" name="car_mode_disable_notification_message" />
+ <java-symbol type="string" name="car_mode_disable_notification_title" />
+ <java-symbol type="string" name="chooser_wallpaper" />
+ <java-symbol type="string" name="config_datause_iface" />
+ <java-symbol type="string" name="config_wimaxManagerClassname" />
+ <java-symbol type="string" name="config_wimaxNativeLibLocation" />
+ <java-symbol type="string" name="config_wimaxServiceClassname" />
+ <java-symbol type="string" name="config_wimaxServiceJarLocation" />
+ <java-symbol type="string" name="config_wimaxStateTrackerClassname" />
+ <java-symbol type="string" name="configure_input_methods" />
+ <java-symbol type="string" name="data_usage_3g_limit_snoozed_title" />
+ <java-symbol type="string" name="data_usage_3g_limit_title" />
+ <java-symbol type="string" name="data_usage_4g_limit_snoozed_title" />
+ <java-symbol type="string" name="data_usage_4g_limit_title" />
+ <java-symbol type="string" name="data_usage_limit_body" />
+ <java-symbol type="string" name="data_usage_limit_snoozed_body" />
+ <java-symbol type="string" name="data_usage_mobile_limit_snoozed_title" />
+ <java-symbol type="string" name="data_usage_mobile_limit_title" />
+ <java-symbol type="string" name="data_usage_restricted_body" />
+ <java-symbol type="string" name="data_usage_restricted_title" />
+ <java-symbol type="string" name="data_usage_warning_body" />
+ <java-symbol type="string" name="data_usage_warning_title" />
+ <java-symbol type="string" name="data_usage_wifi_limit_snoozed_title" />
+ <java-symbol type="string" name="data_usage_wifi_limit_title" />
+ <java-symbol type="string" name="default_wallpaper_component" />
+ <java-symbol type="string" name="dlg_ok" />
+ <java-symbol type="string" name="factorytest_failed" />
+ <java-symbol type="string" name="factorytest_no_action" />
+ <java-symbol type="string" name="factorytest_not_system" />
+ <java-symbol type="string" name="factorytest_reboot" />
+ <java-symbol type="string" name="hardware" />
+ <java-symbol type="string" name="heavy_weight_notification" />
+ <java-symbol type="string" name="heavy_weight_notification_detail" />
+ <java-symbol type="string" name="input_method_binding_label" />
+ <java-symbol type="string" name="launch_warning_original" />
+ <java-symbol type="string" name="launch_warning_replace" />
+ <java-symbol type="string" name="launch_warning_title" />
+ <java-symbol type="string" name="low_internal_storage_view_text" />
+ <java-symbol type="string" name="low_internal_storage_view_title" />
+ <java-symbol type="string" name="report" />
+ <java-symbol type="string" name="select_input_method" />
+ <java-symbol type="string" name="select_keyboard_layout_notification_title" />
+ <java-symbol type="string" name="select_keyboard_layout_notification_message" />
+ <java-symbol type="string" name="smv_application" />
+ <java-symbol type="string" name="smv_process" />
+ <java-symbol type="string" name="tethered_notification_message" />
+ <java-symbol type="string" name="tethered_notification_title" />
+ <java-symbol type="string" name="throttle_warning_notification_message" />
+ <java-symbol type="string" name="throttle_warning_notification_title" />
+ <java-symbol type="string" name="throttled_notification_message" />
+ <java-symbol type="string" name="throttled_notification_title" />
+ <java-symbol type="string" name="usb_accessory_notification_title" />
+ <java-symbol type="string" name="usb_cd_installer_notification_title" />
+ <java-symbol type="string" name="usb_mtp_notification_title" />
+ <java-symbol type="string" name="usb_notification_message" />
+ <java-symbol type="string" name="use_physical_keyboard" />
+ <java-symbol type="string" name="usb_ptp_notification_title" />
+ <java-symbol type="string" name="vpn_text" />
+ <java-symbol type="string" name="vpn_text_long" />
+ <java-symbol type="string" name="vpn_title" />
+ <java-symbol type="string" name="vpn_title_long" />
+ <java-symbol type="string" name="vpn_lockdown_connecting" />
+ <java-symbol type="string" name="vpn_lockdown_connected" />
+ <java-symbol type="string" name="vpn_lockdown_error" />
+ <java-symbol type="string" name="vpn_lockdown_reset" />
+ <java-symbol type="string" name="wallpaper_binding_label" />
+ <java-symbol type="style" name="Theme.Dialog.AppError" />
+ <java-symbol type="style" name="Theme.Toast" />
+ <java-symbol type="xml" name="storage_list" />
+ <java-symbol type="bool" name="config_enableDreams" />
+ <java-symbol type="string" name="enable_explore_by_touch_warning_title" />
+ <java-symbol type="string" name="enable_explore_by_touch_warning_message" />
+
+ <java-symbol type="layout" name="resolver_grid" />
+ <java-symbol type="id" name="resolver_grid" />
+ <java-symbol type="id" name="button_once" />
+ <java-symbol type="id" name="button_always" />
+ <java-symbol type="integer" name="config_maxResolverActivityColumns" />
+
+ <!-- From SystemUI -->
+ <java-symbol type="anim" name="push_down_in" />
+ <java-symbol type="anim" name="push_down_out" />
+ <java-symbol type="anim" name="push_up_in" />
+ <java-symbol type="anim" name="push_up_out" />
+ <java-symbol type="bool" name="config_alwaysUseCdmaRssi" />
+ <java-symbol type="dimen" name="status_bar_icon_size" />
+ <java-symbol type="dimen" name="system_bar_icon_size" />
+ <java-symbol type="drawable" name="list_selector_pressed_holo_dark" />
+ <java-symbol type="drawable" name="scrubber_control_disabled_holo" />
+ <java-symbol type="drawable" name="scrubber_control_selector_holo" />
+ <java-symbol type="drawable" name="scrubber_progress_horizontal_holo_dark" />
+ <java-symbol type="drawable" name="usb_android" />
+ <java-symbol type="drawable" name="usb_android_connected" />
+ <java-symbol type="id" name="banner" />
+ <java-symbol type="id" name="mount_button" />
+ <java-symbol type="id" name="unmount_button" />
+ <java-symbol type="layout" name="usb_storage_activity" />
+ <java-symbol type="string" name="chooseUsbActivity" />
+ <java-symbol type="string" name="dlg_confirm_kill_storage_users_text" />
+ <java-symbol type="string" name="dlg_confirm_kill_storage_users_title" />
+ <java-symbol type="string" name="dlg_error_title" />
+ <java-symbol type="string" name="ext_media_badremoval_notification_message" />
+ <java-symbol type="string" name="ext_media_badremoval_notification_title" />
+ <java-symbol type="string" name="ext_media_checking_notification_message" />
+ <java-symbol type="string" name="ext_media_checking_notification_title" />
+ <java-symbol type="string" name="ext_media_nofs_notification_message" />
+ <java-symbol type="string" name="ext_media_nofs_notification_title" />
+ <java-symbol type="string" name="ext_media_nomedia_notification_message" />
+ <java-symbol type="string" name="ext_media_nomedia_notification_title" />
+ <java-symbol type="string" name="ext_media_safe_unmount_notification_message" />
+ <java-symbol type="string" name="ext_media_safe_unmount_notification_title" />
+ <java-symbol type="string" name="ext_media_unmountable_notification_message" />
+ <java-symbol type="string" name="ext_media_unmountable_notification_title" />
+ <java-symbol type="string" name="usb_storage_error_message" />
+ <java-symbol type="string" name="usb_storage_message" />
+ <java-symbol type="string" name="usb_storage_notification_message" />
+ <java-symbol type="string" name="usb_storage_notification_title" />
+ <java-symbol type="string" name="usb_storage_stop_message" />
+ <java-symbol type="string" name="usb_storage_stop_notification_message" />
+ <java-symbol type="string" name="usb_storage_stop_notification_title" />
+ <java-symbol type="string" name="usb_storage_stop_title" />
+ <java-symbol type="string" name="usb_storage_title" />
+ <java-symbol type="style" name="Animation.RecentApplications" />
+
+ <!-- ImfTest -->
+ <java-symbol type="layout" name="auto_complete_list" />
+
+ <!-- From SettingsProvider -->
+ <java-symbol type="raw" name="fallbackring" />
+
+ <!-- From Settings -->
+ <java-symbol type="array" name="config_mobile_hotspot_provision_app" />
+ <java-symbol type="bool" name="config_intrusiveNotificationLed" />
+ <java-symbol type="dimen" name="preference_fragment_padding_bottom" />
+ <java-symbol type="dimen" name="preference_fragment_padding_side" />
+ <java-symbol type="drawable" name="expander_ic_maximized" />
+ <java-symbol type="drawable" name="expander_ic_minimized" />
+ <java-symbol type="drawable" name="ic_menu_archive" />
+ <java-symbol type="drawable" name="ic_menu_goto" />
+ <java-symbol type="drawable" name="ic_settings_language" />
+ <java-symbol type="drawable" name="title_bar_medium" />
+ <java-symbol type="id" name="body" />
+ <java-symbol type="string" name="fast_scroll_alphabet" />
+ <java-symbol type="string" name="ssl_certificate" />
+
+ <!-- From Phone -->
+ <java-symbol type="bool" name="config_built_in_sip_phone" />
+
+ <!-- From TelephonyProvider -->
+ <java-symbol type="xml" name="apns" />
+
+ <!-- From ContactsProvider -->
+ <java-symbol type="array" name="common_nicknames" />
+ <java-symbol type="drawable" name="call_contact" />
+ <java-symbol type="drawable" name="create_contact" />
+ <java-symbol type="string" name="common_name_prefixes" />
+ <java-symbol type="string" name="common_last_name_prefixes" />
+ <java-symbol type="string" name="common_name_suffixes" />
+ <java-symbol type="string" name="common_name_conjunctions" />
+ <java-symbol type="string" name="dial_number_using" />
+ <java-symbol type="string" name="create_contact_using" />
+
+ <!-- From DownloadProvider -->
+ <java-symbol type="integer" name="config_MaxConcurrentDownloadsAllowed" />
+ <java-symbol type="integer" name="config_downloadDataDirSize" />
+ <java-symbol type="integer" name="config_downloadDataDirLowSpaceThreshold" />
+
+ <!-- From Contacts -->
+ <java-symbol type="drawable" name="quickcontact_badge_overlay_dark" />
+
+ <!-- From Browser -->
+ <java-symbol type="drawable" name="ic_menu_moreoverflow_normal_holo_dark" />
+ <java-symbol type="id" name="placeholder" />
+ <java-symbol type="string" name="ssl_certificate_is_valid" />
+
+ <!-- From Mms -->
+ <java-symbol type="drawable" name="ic_menu_play_clip" />
+
+ <!-- From Stk -->
+ <java-symbol type="bool" name="config_sf_slowBlur" />
+ <java-symbol type="drawable" name="ic_volume" />
+ <java-symbol type="drawable" name="stat_notify_sim_toolkit" />
+
+ <!-- From maps library -->
+ <java-symbol type="array" name="maps_starting_lat_lng" />
+ <java-symbol type="array" name="maps_starting_zoom" />
+ <java-symbol type="attr" name="mapViewStyle" />
+ <java-symbol type="attr" name="state_focused" />
+ <java-symbol type="attr" name="state_selected" />
+ <java-symbol type="attr" name="state_pressed" />
+ <java-symbol type="drawable" name="compass_arrow" />
+ <java-symbol type="drawable" name="compass_base" />
+ <java-symbol type="drawable" name="ic_maps_indicator_current_position_anim" />
+ <java-symbol type="drawable" name="loading_tile_android" />
+ <java-symbol type="drawable" name="maps_google_logo" />
+ <java-symbol type="drawable" name="no_tile_256" />
+ <java-symbol type="drawable" name="reticle" />
+
+ <!-- From PinyinIME(!!!) -->
+ <java-symbol type="string" name="inputMethod" />
+
+</resources>
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/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 1868d1c..785842f 100755
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -72,6 +72,8 @@
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;
@@ -433,7 +435,7 @@
assertEquals(srcPath, appInstallPath);
assertEquals(publicSrcPath, appInstallPath);
assertStartsWith("Native library should point to shared lib directory",
- dataDir.getPath(),
+ new File(APP_LIB_DIR_PREFIX, info.packageName).getPath(),
info.nativeLibraryDir);
assertDirOwnerGroupPerms(
"Native library directory should be owned by system:system and 0755",
diff --git a/docs/html/guide/google/play/publishing/multiple-apks.jd b/docs/html/guide/google/play/publishing/multiple-apks.jd
index e41817e..0619dfc 100644
--- a/docs/html/guide/google/play/publishing/multiple-apks.jd
+++ b/docs/html/guide/google/play/publishing/multiple-apks.jd
@@ -9,9 +9,7 @@
<ul>
<li>Simultaneously publish different APKs for different
device configurations</li>
- <li>Different APKs are distributed to different devices based on filters declared in the
-manifest file</li>
- <li>You should publish multiple APKs only when it's not possible or reasonable to
+ <li>You should publish multiple APKs only when it's not possible to
support all desired devices with a single APK</li>
</ul>
@@ -39,16 +37,17 @@
<li><a href="#TextureOptions">Supporting multiple GL textures</a></li>
<li><a href="#ScreenOptions">Supporting multiple screens</a></li>
<li><a href="#ApiLevelOptions">Supporting multiple API levels</a></li>
+ <li><a href="#CpuArchOptions">Supporting multiple CPU architectures</a></li>
</ol>
</li>
</ol>
<h2>See also</h2>
<ol>
+ <li><a href="{@docRoot}guide/google/play/expansion-files.html">APK Expansion Files</a></li>
<li><a href="{@docRoot}guide/google/play/filters.html">Filters on Google Play</a></li>
<li><a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a></li>
- <li><a href="{@docRoot}tools/extras/support-library.html">Compatibility
-Package</a></li>
+ <li><a href="{@docRoot}tools/extras/support-library.html">Support Library</a></li>
<li><a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">Android API Levels</a></li>
</ol>
@@ -76,14 +75,16 @@
you publish your application for as many devices as possible, Google Play allows you to
publish multiple APKs under the same application listing. Google Play then supplies each APK to
the appropriate devices based on configuration support you've declared in the manifest file of each
-APK.</p>
+APK. </p>
<p>By publishing your application with multiple APKs, you can:</p>
<ul>
<li>Support different OpenGL texture compression formats with each APK.</li>
- <li>Support different screen configurations with each APK.</li>
+ <li>Support different screen sizes and densities with each APK.</li>
<li>Support different platform versions with each APK.</li>
+ <li>Support different CPU architectures with each APK (such as for ARM, x86, and MIPS, when your
+ app uses the <a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK</a>).</li>
</ul>
<p>Currently, these are the only device characteristics that Google Play supports for publishing
@@ -91,7 +92,8 @@
<p class="note"><strong>Note:</strong> You should generally use multiple APKs to support
different device configurations <strong>only when your APK is too large</strong> (greater than
-50MB). Using a single APK to support different configurations is always the best practice,
+50MB) due to the alternative resources needed for different device configurations.
+Using a single APK to support different configurations is always the best practice,
because it makes the path for application updates simple and clear for users (and also makes
your life simpler by avoiding development and publishing complexity). Read the section below about
<a href="#SingleAPK">Using a Single APK Instead</a> to
@@ -283,14 +285,19 @@
</ul>
</div>
</li>
+
+ <li><strong>CPU architecture (ABI)</strong>
+ <p>This is based on the native libraries included in each APK (which are
+ determined by the architectures you declare in the {@code Application.mk}
+ file) when using the Android NDK.</p></li>
</ul>
<p>Other manifest elements that enable <a
href="{@docRoot}guide/google/play/filters.html">Google Play filters</a>—but are not
listed above—are still applied for each APK as usual. However, Google Play does not allow
-you to publish multiple APKs based on variations of them. Thus, you cannot publish
-multiple APKs if the above listed filters are the same for each APK (but the APKs differ based on
-other characteristics in the manifest file). For
+you to publish separate APKs based on variations of those device characteristics. Thus, you cannot
+publish multiple APKs if the above listed filters are the same for each APK (but the APKs differ
+based on other characteristics in the manifest or APK). For
example, you cannot provide different APKs that differ purely on the <a
href="{@docRoot}guide/topics/manifest/uses-configuration-element.html">{@code
<uses-configuration>}</a> characteristics.</p>
@@ -349,7 +356,8 @@
get an update when they receive a system update.</li>
<li>If you have one APK that's for API level 4 (and above) <em>and</em> small -
large screens, and another APK for API level 8 (and above) <em>and</em> large - xlarge screens, then
-the version codes <strong>must increase</strong>. In this case, the API level filter is used to
+the version codes <strong>must increase</strong> in correlation with the API levels.
+In this case, the API level filter is used to
distinguish each APK, but so is the screen size. Because the screen sizes overlap (both APKs
support large screens), the version codes must still be in order. This ensures that a large screen
device that receives a system update to API level 8 will receive an update for the second
@@ -360,6 +368,21 @@
levels. Because there is no overlap within the screen size filter, there are no devices that
could potentially move between these two APKs, so there's no need for the version codes to
increase from the lower API level to the higher API level.</li>
+ <li>If you have one APK that's for API level 4 (and above) <em>and</em> ARMv7 CPUs,
+and another APK for API level 8 (and above) <em>and</em> ARMv5TE CPUs,
+then the version codes <strong>must increase</strong> in correlation with the API levels.
+In this case, the API level filter is used to
+distinguish each APK, but so is the CPU architecture. Because an APK with ARMv5TE libraries is
+compatible with devices that have an ARMv7 CPU, the APKs overlap on this characteristic.
+As such, the version code for the APK that supports API level 8 and above must be higher.
+This ensures that a device with an ARMv7 CPU that receives a system update to API level 8
+will receive an update for the second APK that's designed for API level 8.
+However, because this kind of update results in the ARMv7 device using an APK that's not
+fully optimized for that device's CPU, you should provide an
+APK for both the ARMv5TE and the ARMv7 architecture at each API level in order to optimize
+the app performance on each CPU.
+<strong>Note:</strong> This applies <em>only</em> when comparing APKs with the ARMv5TE and
+ARMv7 libraries, and not when comparing other native libraries.</li>
</ul>
</li>
@@ -384,7 +407,12 @@
sizes small, normal, and large, while another APK supports sizes large and xlarge, there is an
overlap, because both APKs support large screens. If you do not resolve this, then devices that
qualify for both APKs (large screen devices in the example) will receive whichever APK has the
-highest version code.</li>
+highest version code.
+ <p class="note"><strong>Note:</strong> If you're creating separate APKs for different CPU
+ architectures, be aware that an APK for ARMv5TE will overlap with an APK for ARMv7. That is,
+ an APK designed for ARMv5TE is compatible with an ARMv7 device,
+but the reverse is not true (an APK with only the ARMv7 libraries is
+<em>not</em> compatible with an ARMv5TE device).</li>
</ul>
<p>When such conflicts occur, you will see a warning message, but you can still publish your
@@ -641,3 +669,17 @@
}
</pre>
+
+<h3 id="CpuArchOptions">Supporting multiple CPU architectures</h3>
+
+<p>When using the Android NDK, you can create a single APK that supports multiple CPU architectures
+by declaring each of the desired architectures with the {@code APP_ABI} variable in the
+<code>Application.mk</code> file.</p>
+
+<p>For example, here's an <code>Application.mk</code> file that declares support for three
+different CPU architectures:</p>
+
+<pre>
+APP_ABI := armeabi armeabi-v7a mips
+APP_PLATFORM := android-9
+</pre>
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/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/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index b5613f3..ea00ec8 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -1164,7 +1164,7 @@
/**
* Indicates if current platform supports use of SCO for off call use cases.
* Application wanted to use bluetooth SCO audio when the phone is not in call
- * must first call thsi method to make sure that the platform supports this
+ * must first call this method to make sure that the platform supports this
* feature.
* @return true if bluetooth SCO can be used for audio when not in call
* false otherwise
@@ -1300,6 +1300,19 @@
}
/**
+ * @hide
+ * Signals whether remote submix audio rerouting is enabled.
+ */
+ public void setRemoteSubmixOn(boolean on, int address) {
+ IAudioService service = getService();
+ try {
+ service.setRemoteSubmixOn(on, address);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Dead object in setRemoteSubmixOn", e);
+ }
+ }
+
+ /**
* Sets audio routing to the wired headset on or off.
*
* @param on set <var>true</var> to route audio to/from wired
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index aea8a88..e5c2a4d 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -151,6 +151,8 @@
private static final int MSG_SET_WIRED_DEVICE_CONNECTION_STATE = 21;
private static final int MSG_SET_A2DP_CONNECTION_STATE = 22;
// end of messages handled under wakelock
+ private static final int MSG_SET_RSX_CONNECTION_STATE = 23; // change remote submix connection
+ private static final int MSG_SET_FORCE_RSX_USE = 24; // force remote submix audio routing
// flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be
// persisted
@@ -2109,6 +2111,33 @@
}
};
+ /** see AudioManager.setRemoteSubmixOn(boolean on) */
+ public void setRemoteSubmixOn(boolean on, int address) {
+ sendMsg(mAudioHandler, MSG_SET_RSX_CONNECTION_STATE,
+ SENDMSG_REPLACE /* replace with QUEUE when multiple addresses are supported */,
+ on ? 1 : 0 /*arg1*/,
+ address /*arg2*/,
+ null/*obj*/, 0/*delay*/);
+
+ // Note that we are currently forcing use of remote submix as soon as corresponding device
+ // is made available
+ sendMsg(mAudioHandler, MSG_SET_FORCE_RSX_USE, SENDMSG_REPLACE,
+ AudioSystem.FOR_MEDIA,
+ on ? AudioSystem.FORCE_REMOTE_SUBMIX : AudioSystem.FORCE_NONE,
+ null/*obj*/, 0/*delay*/);
+ }
+
+ private void onSetRsxConnectionState(int available, int address) {
+ AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_IN_REMOTE_SUBMIX,
+ available == 1 ?
+ AudioSystem.DEVICE_STATE_AVAILABLE : AudioSystem.DEVICE_STATE_UNAVAILABLE,
+ String.valueOf(address) /*device_address*/);
+ AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_REMOTE_SUBMIX,
+ available == 1 ?
+ AudioSystem.DEVICE_STATE_AVAILABLE : AudioSystem.DEVICE_STATE_UNAVAILABLE,
+ String.valueOf(address) /*device_address*/);
+ }
+
///////////////////////////////////////////////////////////////////////////
// Internal methods
///////////////////////////////////////////////////////////////////////////
@@ -3072,6 +3101,7 @@
case MSG_SET_FORCE_USE:
case MSG_SET_FORCE_BT_A2DP_USE:
+ case MSG_SET_FORCE_RSX_USE:
setForceUse(msg.arg1, msg.arg2);
break;
@@ -3134,6 +3164,10 @@
onRegisterVolumeObserverForRcc(msg.arg1 /* rccId */,
(IRemoteVolumeObserver)msg.obj /* rvo */);
break;
+
+ case MSG_SET_RSX_CONNECTION_STATE:
+ onSetRsxConnectionState(msg.arg1/*available*/, msg.arg2/*address*/);
+ break;
}
}
}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index f3a8558..129e84f 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -214,6 +214,7 @@
public static final int DEVICE_OUT_REMOTE_SUBMIX = 0x8000;
public static final int DEVICE_OUT_DEFAULT = DEVICE_BIT_DEFAULT;
+
public static final int DEVICE_OUT_ALL = (DEVICE_OUT_EARPIECE |
DEVICE_OUT_SPEAKER |
DEVICE_OUT_WIRED_HEADSET |
@@ -352,7 +353,8 @@
public static final int FORCE_ANALOG_DOCK = 8;
public static final int FORCE_DIGITAL_DOCK = 9;
public static final int FORCE_NO_BT_A2DP = 10;
- private static final int NUM_FORCE_CONFIG = 11;
+ public static final int FORCE_REMOTE_SUBMIX = 11;
+ private static final int NUM_FORCE_CONFIG = 12;
public static final int FORCE_DEFAULT = FORCE_NONE;
// usage for setForceUse, must match AudioSystem::force_use
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 854eb3f..7ae61cd 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -108,6 +108,8 @@
boolean isBluetoothA2dpOn();
+ oneway void setRemoteSubmixOn(boolean on, int address);
+
int requestAudioFocus(int mainStreamType, int durationHint, IBinder cb, IAudioFocusDispatcher l,
String clientId, String callingPackageName);
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 2d1be02..48bea52 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -177,6 +177,12 @@
* is applied.
*/
public static final int VOICE_COMMUNICATION = 7;
+
+ /**
+ * @hide
+ * Audio source for remote submix.
+ */
+ public static final int REMOTE_SUBMIX_SOURCE = 8;
}
/**
@@ -291,7 +297,12 @@
* Gets the maximum value for audio sources.
* @see android.media.MediaRecorder.AudioSource
*/
- public static final int getAudioSourceMax() { return AudioSource.VOICE_COMMUNICATION; }
+ public static final int getAudioSourceMax() {
+ // FIXME disable selection of the remote submxi source selection once test code
+ // doesn't rely on it
+ return AudioSource.REMOTE_SUBMIX_SOURCE;
+ //return AudioSource.VOICE_COMMUNICATION;
+ }
/**
* Sets the video source to be used for recording. If this method is not
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index f859f41..6773482 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -22,6 +22,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.backup.BackupManager;
import android.content.BroadcastReceiver;
@@ -60,7 +61,7 @@
public class SettingsProvider extends ContentProvider {
private static final String TAG = "SettingsProvider";
- private static final boolean LOCAL_LOGV = false;
+ private static final boolean LOCAL_LOGV = true;
private static final String TABLE_SYSTEM = "system";
private static final String TABLE_SECURE = "secure";
@@ -621,24 +622,10 @@
if (args != null) {
int reqUser = args.getInt(Settings.CALL_METHOD_USER_KEY, callingUser);
if (reqUser != callingUser) {
- getContext().enforceCallingPermission(
- android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
- "Not permitted to access settings for other users");
- if (reqUser == UserHandle.USER_CURRENT) {
- try {
- reqUser = ActivityManagerNative.getDefault().getCurrentUser().id;
- } catch (RemoteException e) {
- // can't happen
- }
- if (LOCAL_LOGV) {
- Slog.v(TAG, " USER_CURRENT resolved to " + reqUser);
- }
- }
- if (reqUser < 0) {
- throw new IllegalArgumentException("Bad user handle " + reqUser);
- }
- callingUser = reqUser;
- if (LOCAL_LOGV) Slog.v(TAG, " fetching setting for user " + callingUser);
+ callingUser = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
+ Binder.getCallingUid(), reqUser, false, true,
+ "get/set setting for user", null);
+ if (LOCAL_LOGV) Slog.v(TAG, " access setting for user " + callingUser);
}
}
@@ -678,9 +665,6 @@
// the Settings.NameValueTable.VALUE static.
final String newValue = (args == null)
? null : args.getString(Settings.NameValueTable.VALUE);
- if (newValue == null) {
- throw new IllegalArgumentException("Bad value for " + method);
- }
final ContentValues values = new ContentValues();
values.put(Settings.NameValueTable.NAME, request);
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 22a97bd..44fb49a 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -19,6 +19,7 @@
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" />
+ <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<!-- Networking and telephony -->
<uses-permission android:name="android.permission.BLUETOOTH" />
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
new file mode 100644
index 0000000..528121e
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="16dp">
+
+ <ImageView
+ android:id="@+id/brightness_icon"
+ style="@style/SystemBarPanelSettingsIcon"
+ android:src="@drawable/ic_sysbar_brightness"
+ />
+ <com.android.systemui.statusbar.policy.ToggleSlider
+ android:id="@+id/brightness_slider"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:layout_marginRight="2dp"
+ systemui:text="@string/status_bar_settings_auto_brightness_label"
+ />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_time.xml b/packages/SystemUI/res/layout/quick_settings_tile_time.xml
index ab0c52d..3d7b095 100644
--- a/packages/SystemUI/res/layout/quick_settings_tile_time.xml
+++ b/packages/SystemUI/res/layout/quick_settings_tile_time.xml
@@ -32,4 +32,12 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>
+ <TextView
+ android:textAppearance="@style/TextAppearance.QuickSettings.Alarm"
+ android:id="@+id/alarm_textview"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:drawableLeft="@drawable/stat_sys_alarm"
+ />
</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 2bcf951..8fb703f 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -433,6 +433,10 @@
<string name="quick_settings_wifi_display_label">Wifi Display</string>
<!-- QuickSettings: Wifi display [CHAR LIMIT=NONE] -->
<string name="quick_settings_wifi_display_no_connection_label">No Wifi Display Connection</string>
+ <!-- QuickSettings: Brightness dialog title [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_brightness_dialog_title">Brightness</string>
+ <!-- QuickSettings: Brightness dialog auto brightness button [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_brightness_dialog_auto_brightness_label">AUTO</string>
<!-- Wifi display: Scan button text [CHAR LIMIT=15] -->
<string name="wifi_display_scan">Scan</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 34bd627..fa62cb6 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -92,6 +92,11 @@
<item name="android:textSize">14dp</item>
</style>
+ <style name="TextAppearance.QuickSettings.Alarm" parent="@style/TextAppearance.QuickSettings.TileView">
+ <item name="android:textSize">13dp</item>
+ <item name="android:textColor">#ff3a3b39</item>
+ </style>
+
<style name="Animation" />
<style name="Animation.ShirtPocketPanel">
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 f374c11..7056e03 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -17,11 +17,11 @@
package com.android.systemui.statusbar.phone;
import android.app.Dialog;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.CursorLoader;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.Loader;
@@ -32,11 +32,12 @@
import android.hardware.display.WifiDisplay;
import android.hardware.display.WifiDisplayStatus;
import android.net.Uri;
+import android.os.UserHandle;
import android.provider.ContactsContract;
-import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
@@ -44,290 +45,18 @@
import android.widget.ListView;
import android.widget.TextView;
-import java.util.ArrayList;
-import java.util.Comparator;
-
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.QuickSettingsModel.State;
import com.android.systemui.statusbar.policy.BatteryController;
-import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import com.android.systemui.statusbar.policy.BluetoothController;
+import com.android.systemui.statusbar.policy.BrightnessController;
import com.android.systemui.statusbar.policy.LocationController;
-import com.android.systemui.statusbar.policy.LocationController.LocationGpsStateChangeCallback;
import com.android.systemui.statusbar.policy.NetworkController;
-import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
+import com.android.systemui.statusbar.policy.ToggleSlider;
-class QuickSettingsModel implements BluetoothStateChangeCallback,
- NetworkSignalChangedCallback,
- BatteryStateChangeCallback,
- LocationGpsStateChangeCallback {
+import java.util.ArrayList;
+import java.util.Comparator;
- /** Represents the state of a given attribute. */
- static class State {
- int iconId;
- String label;
- boolean enabled;
- }
- static class BatteryState extends State {
- int batteryLevel;
- boolean pluggedIn;
- }
-
- /** The callback to update a given tile. */
- interface RefreshCallback {
- public void refreshView(QuickSettingsTileView view, State state);
- }
-
- private Context mContext;
-
- private QuickSettingsTileView mUserTile;
- private RefreshCallback mUserCallback;
- private State mUserState = new State();
-
- private QuickSettingsTileView mAirplaneModeTile;
- private RefreshCallback mAirplaneModeCallback;
- private State mAirplaneModeState = new State();
-
- private QuickSettingsTileView mWifiTile;
- private RefreshCallback mWifiCallback;
- private State mWifiState = new State();
-
- private QuickSettingsTileView mWifiDisplayTile;
- private RefreshCallback mWifiDisplayCallback;
- private State mWifiDisplayState = new State();
-
- private QuickSettingsTileView mRSSITile;
- private RefreshCallback mRSSICallback;
- private State mRSSIState = new State();
-
- private QuickSettingsTileView mBluetoothTile;
- private RefreshCallback mBluetoothCallback;
- private State mBluetoothState = new State();
-
- private QuickSettingsTileView mBatteryTile;
- private RefreshCallback mBatteryCallback;
- private BatteryState mBatteryState = new BatteryState();
-
- private QuickSettingsTileView mLocationTile;
- private RefreshCallback mLocationCallback;
- private State mLocationState = new State();
-
- public QuickSettingsModel(Context context) {
- mContext = context;
- }
-
- // User
- void addUserTile(QuickSettingsTileView view, RefreshCallback cb) {
- mUserTile = view;
- mUserCallback = cb;
- mUserCallback.refreshView(mUserTile, mUserState);
- }
- void setUserTileInfo(String name) {
- mUserState.label = name;
- mUserCallback.refreshView(mUserTile, mUserState);
- }
-
- // Airplane Mode
- void addAirplaneModeTile(QuickSettingsTileView view, RefreshCallback cb) {
- mAirplaneModeTile = view;
- mAirplaneModeTile.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mAirplaneModeState.enabled) {
- setAirplaneModeState(false);
- } else {
- setAirplaneModeState(true);
- }
- }
- });
- mAirplaneModeCallback = cb;
- mAirplaneModeCallback.refreshView(mAirplaneModeTile, mAirplaneModeState);
- }
- private void setAirplaneModeState(boolean enabled) {
- // 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,
- enabled ? 1 : 0);
-
- // TODO: Update the UI to reflect system setting
- // mCheckBoxPref.setChecked(enabled);
-
- // Post the intent
- Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- intent.putExtra("state", enabled);
- mContext.sendBroadcast(intent);
- }
- // NetworkSignalChanged callback
- @Override
- public void onAirplaneModeChanged(boolean enabled) {
- // TODO: If view is in awaiting state, disable
- Resources r = mContext.getResources();
- mAirplaneModeState.enabled = enabled;
- mAirplaneModeState.iconId = (enabled ?
- R.drawable.ic_qs_airplane_enabled :
- R.drawable.ic_qs_airplane_normal);
- mAirplaneModeCallback.refreshView(mAirplaneModeTile, mAirplaneModeState);
- }
-
- // Wifi
- void addWifiTile(QuickSettingsTileView view, RefreshCallback cb) {
- mWifiTile = view;
- mWifiCallback = cb;
- mWifiCallback.refreshView(mWifiTile, mWifiState);
- }
- // NetworkSignalChanged callback
- @Override
- public void onWifiSignalChanged(boolean enabled, String description) {
- // TODO: If view is in awaiting state, disable
- Resources r = mContext.getResources();
- // TODO: Check if wifi is enabled
- mWifiState.enabled = enabled;
- mWifiState.iconId = (enabled ?
- R.drawable.ic_qs_wifi_enabled :
- R.drawable.ic_qs_wifi_normal);
- mWifiState.label = (enabled ?
- description :
- r.getString(R.string.quick_settings_wifi_no_network));
- mWifiCallback.refreshView(mWifiTile, mWifiState);
- }
-
- // RSSI
- void addRSSITile(QuickSettingsTileView view, RefreshCallback cb) {
- mRSSITile = view;
- mRSSICallback = cb;
- mRSSICallback.refreshView(mRSSITile, mRSSIState);
- }
- private void setRSSIState(boolean enabled) {
- // TODO: Set RSSI enabled
- // TODO: Sets the view to be "awaiting" if not already awaiting
- }
- // NetworkSignalChanged callback
- @Override
- public void onMobileDataSignalChanged(boolean enabled, String description) {
- // TODO: If view is in awaiting state, disable
- Resources r = mContext.getResources();
- // TODO: Check if RSSI is enabled
- mRSSIState.enabled = enabled;
- mRSSIState.iconId = (enabled ?
- R.drawable.ic_qs_rssi_enabled :
- R.drawable.ic_qs_rssi_normal);
- mRSSIState.label = (enabled ?
- description :
- r.getString(R.string.quick_settings_rssi_emergency_only));
- mRSSICallback.refreshView(mRSSITile, mRSSIState);
- }
-
- // Bluetooth
- void addBluetoothTile(QuickSettingsTileView view, RefreshCallback cb) {
- mBluetoothTile = view;
- mBluetoothTile.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mBluetoothState.enabled) {
- setBluetoothState(false);
- } else {
- setBluetoothState(true);
- }
- }
- });
- mBluetoothCallback = cb;
-
- final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- onBluetoothStateChange(adapter.isEnabled());
- }
- private void setBluetoothState(boolean enabled) {
- // TODO: Sets the view to be "awaiting" if not already awaiting
- final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- if (adapter != null) {
- if (enabled) {
- adapter.enable();
- } else {
- adapter.disable();
- }
- }
- }
- // BluetoothController callback
- @Override
- public void onBluetoothStateChange(boolean on) {
- // TODO: If view is in awaiting state, disable
- Resources r = mContext.getResources();
- mBluetoothState.enabled = on;
- if (on) {
- mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_enabled;
- } else {
- mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_normal;
- }
- mBluetoothCallback.refreshView(mBluetoothTile, mBluetoothState);
- }
-
- // Battery
- void addBatteryTile(QuickSettingsTileView view, RefreshCallback cb) {
- mBatteryTile = view;
- mBatteryCallback = cb;
- mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
- }
- // BatteryController callback
- @Override
- public void onBatteryLevelChanged(int level, boolean pluggedIn) {
- mBatteryState.batteryLevel = level;
- mBatteryState.pluggedIn = pluggedIn;
- mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
- }
-
- // Location
- void addLocationTile(QuickSettingsTileView view, RefreshCallback cb) {
- mLocationTile = view;
- mLocationCallback = cb;
- mLocationCallback.refreshView(mLocationTile, mLocationState);
- disableLocationTile();
- }
- private void enableLocationTile() {
- mLocationTile.setVisibility(View.VISIBLE);
- }
- private void disableLocationTile() {
- mLocationTile.setVisibility(View.GONE);
- }
- // LocationController callback
- @Override
- public void onLocationGpsStateChanged(boolean inUse, String description) {
- if (inUse) {
- mLocationState.enabled = inUse;
- mLocationState.label = description;
- mLocationCallback.refreshView(mLocationTile, mLocationState);
- enableLocationTile();
- } else {
- disableLocationTile();
- }
- }
-
- // Wifi Display
- void addWifiDisplayTile(QuickSettingsTileView view, RefreshCallback cb) {
- mWifiDisplayTile = view;
- mWifiDisplayCallback = cb;
- }
- private void enableWifiDisplayTile() {
- mWifiDisplayTile.setVisibility(View.VISIBLE);
- }
- private void disableWifiDisplayTile() {
- mWifiDisplayTile.setVisibility(View.GONE);
- }
- public void onWifiDisplayStateChanged(WifiDisplayStatus status) {
- if (status.isEnabled()) {
- if (status.getActiveDisplay() != null) {
- mWifiDisplayState.label = status.getActiveDisplay().getDeviceName();
- } else {
- mWifiDisplayState.label = mContext.getString(
- R.string.quick_settings_wifi_display_no_connection_label);
- }
- mWifiDisplayCallback.refreshView(mWifiDisplayTile, mWifiDisplayState);
- enableWifiDisplayTile();
- } else {
- disableWifiDisplayTile();
- }
- }
-
-}
/**
*
@@ -342,6 +71,9 @@
private DisplayManager mDisplayManager;
private WifiDisplayStatus mWifiDisplayStatus;
private WifiDisplayListAdapter mWifiDisplayListAdapter;
+
+ private BrightnessController mBrightnessController;
+ private Dialog mBrightnessDialog;
private CursorLoader mUserInfoLoader;
@@ -430,6 +162,17 @@
queryForUserInformation();
}
+ private void startSettingsActivity(String action) {
+ Intent intent = new Intent(action);
+ startSettingsActivity(intent);
+ }
+ private void startSettingsActivity(Intent intent) {
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ mBar.collapseAllPanels(true);
+ mContext.startActivity(intent);
+
+ }
+
private void addUserTiles(ViewGroup parent, LayoutInflater inflater) {
QuickSettingsTileView userTile = (QuickSettingsTileView)
inflater.inflate(R.layout.quick_settings_tile, parent, false);
@@ -448,6 +191,25 @@
QuickSettingsTileView timeTile = (QuickSettingsTileView)
inflater.inflate(R.layout.quick_settings_tile, parent, false);
timeTile.setContent(R.layout.quick_settings_tile_time, inflater);
+ timeTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // TODO: Jump into the alarm application
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName(
+ "com.google.android.deskclock",
+ "com.android.deskclock.AlarmClock"));
+ startSettingsActivity(intent);
+ }
+ });
+ mModel.addTimeTile(timeTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView view, State alarmState) {
+ TextView tv = (TextView) view.findViewById(R.id.alarm_textview);
+ tv.setText(alarmState.label);
+ tv.setVisibility(alarmState.enabled ? View.VISIBLE : View.GONE);
+ }
+ });
parent.addView(timeTile);
mDynamicSpannedTiles.add(timeTile);
@@ -458,10 +220,7 @@
settingsTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
- mBar.collapseAllPanels(true);
+ startSettingsActivity(android.provider.Settings.ACTION_SETTINGS);
}
});
parent.addView(settingsTile);
@@ -476,10 +235,7 @@
wifiTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Intent intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
- mBar.collapseAllPanels(true);
+ startSettingsActivity(android.provider.Settings.ACTION_WIFI_SETTINGS);
}
});
mModel.addWifiTile(wifiTile, new QuickSettingsModel.RefreshCallback() {
@@ -499,10 +255,11 @@
rssiTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
- mBar.collapseAllPanels(true);
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName(
+ "com.android.settings",
+ "com.android.settings.Settings$DataUsageSummaryActivity"));
+ startSettingsActivity(intent);
}
});
mModel.addRSSITile(rssiTile, new QuickSettingsModel.RefreshCallback() {
@@ -522,10 +279,7 @@
batteryTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
- mBar.collapseAllPanels(true);
+ startSettingsActivity(Intent.ACTION_POWER_USAGE_SUMMARY);
}
});
mModel.addBatteryTile(batteryTile, new QuickSettingsModel.RefreshCallback() {
@@ -559,6 +313,12 @@
QuickSettingsTileView bluetoothTile = (QuickSettingsTileView)
inflater.inflate(R.layout.quick_settings_tile, parent, false);
bluetoothTile.setContent(R.layout.quick_settings_tile_bluetooth, inflater);
+ bluetoothTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ startSettingsActivity(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS);
+ }
+ });
mModel.addBluetoothTile(bluetoothTile, new QuickSettingsModel.RefreshCallback() {
@Override
public void refreshView(QuickSettingsTileView view, State state) {
@@ -575,10 +335,9 @@
brightnessTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Intent intent = new Intent(android.provider.Settings.ACTION_DISPLAY_SETTINGS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
+ // startSettingsActivity(android.provider.Settings.ACTION_DISPLAY_SETTINGS);
mBar.collapseAllPanels(true);
+ showBrightnessDialog();
}
});
parent.addView(brightnessTile);
@@ -592,11 +351,7 @@
locationTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Intent intent =
- new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
- mBar.collapseAllPanels(true);
+ startSettingsActivity(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
}
});
mModel.addLocationTile(locationTile, new QuickSettingsModel.RefreshCallback() {
@@ -604,6 +359,7 @@
public void refreshView(QuickSettingsTileView view, State state) {
TextView tv = (TextView) view.findViewById(R.id.location_textview);
tv.setText(state.label);
+ view.setVisibility(state.enabled ? View.VISIBLE : View.GONE);
}
});
parent.addView(locationTile);
@@ -615,8 +371,8 @@
wifiDisplayTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- showWifiDisplayDialog();
mBar.collapseAllPanels(true);
+ showWifiDisplayDialog();
}
});
mModel.addWifiDisplayTile(wifiDisplayTile, new QuickSettingsModel.RefreshCallback() {
@@ -624,6 +380,7 @@
public void refreshView(QuickSettingsTileView view, State state) {
TextView tv = (TextView) view.findViewById(R.id.wifi_display_textview);
tv.setText(state.label);
+ view.setVisibility(state.enabled ? View.VISIBLE : View.GONE);
}
});
parent.addView(wifiDisplayTile);
@@ -656,7 +413,32 @@
}
mContainerView.requestLayout();
}
+
+ private void showBrightnessDialog() {
+ if (mBrightnessDialog == null) {
+ mBrightnessDialog = new Dialog(mContext);
+ mBrightnessDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ mBrightnessDialog.setContentView(R.layout.quick_settings_brightness_dialog);
+ mBrightnessDialog.setCanceledOnTouchOutside(true);
+
+ mBrightnessController = new BrightnessController(mContext,
+ (ToggleSlider) mBrightnessDialog.findViewById(R.id.brightness_slider));
+ mBrightnessDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ mBrightnessController = null;
+ }
+ });
+
+ mBrightnessDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+ mBrightnessDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+ }
+ if (!mBrightnessDialog.isShowing()) {
+ mBrightnessDialog.show();
+ }
+ }
+ // Wifi Display
private void showWifiDisplayDialog() {
mDisplayManager.scanWifiDisplays();
updateWifiDisplayStatus();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
new file mode 100644
index 0000000..2318921
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
@@ -0,0 +1,320 @@
+/*
+ * 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.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.hardware.display.WifiDisplayStatus;
+import android.os.Handler;
+import android.provider.Settings;
+import android.view.View;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
+import com.android.systemui.statusbar.policy.LocationController.LocationGpsStateChangeCallback;
+import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
+
+
+class QuickSettingsModel implements BluetoothStateChangeCallback,
+ NetworkSignalChangedCallback,
+ BatteryStateChangeCallback,
+ LocationGpsStateChangeCallback {
+
+ /** Represents the state of a given attribute. */
+ static class State {
+ int iconId;
+ String label;
+ boolean enabled = false;
+ }
+ static class BatteryState extends State {
+ int batteryLevel;
+ boolean pluggedIn;
+ }
+
+ /** The callback to update a given tile. */
+ interface RefreshCallback {
+ public void refreshView(QuickSettingsTileView view, State state);
+ }
+
+ /** Broadcast receive to determine if there is an alarm set. */
+ private BroadcastReceiver mAlarmIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
+ onAlarmChanged(intent);
+ onNextAlarmChanged();
+ }
+ }
+ };
+
+ /** ContentObserver to determine the next alarm */
+ private class NextAlarmObserver extends ContentObserver {
+ public NextAlarmObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override public void onChange(boolean selfChange) {
+ onNextAlarmChanged();
+ }
+
+ public void startObserving() {
+ final ContentResolver cr = mContext.getContentResolver();
+ cr.registerContentObserver(
+ Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED), false, this);
+ }
+ }
+
+ private Context mContext;
+ private Handler mHandler;
+ private NextAlarmObserver mNextAlarmObserver;
+
+ private QuickSettingsTileView mUserTile;
+ private RefreshCallback mUserCallback;
+ private State mUserState = new State();
+
+ private QuickSettingsTileView mTimeTile;
+ private RefreshCallback mTimeAlarmCallback;
+ private State mTimeAlarmState = new State();
+
+ private QuickSettingsTileView mAirplaneModeTile;
+ private RefreshCallback mAirplaneModeCallback;
+ private State mAirplaneModeState = new State();
+
+ private QuickSettingsTileView mWifiTile;
+ private RefreshCallback mWifiCallback;
+ private State mWifiState = new State();
+
+ private QuickSettingsTileView mWifiDisplayTile;
+ private RefreshCallback mWifiDisplayCallback;
+ private State mWifiDisplayState = new State();
+
+ private QuickSettingsTileView mRSSITile;
+ private RefreshCallback mRSSICallback;
+ private State mRSSIState = new State();
+
+ private QuickSettingsTileView mBluetoothTile;
+ private RefreshCallback mBluetoothCallback;
+ private State mBluetoothState = new State();
+
+ private QuickSettingsTileView mBatteryTile;
+ private RefreshCallback mBatteryCallback;
+ private BatteryState mBatteryState = new BatteryState();
+
+ private QuickSettingsTileView mLocationTile;
+ private RefreshCallback mLocationCallback;
+ private State mLocationState = new State();
+
+ public QuickSettingsModel(Context context) {
+ mContext = context;
+ mHandler = new Handler();
+ mNextAlarmObserver = new NextAlarmObserver(mHandler);
+ mNextAlarmObserver.startObserving();
+
+ IntentFilter alarmIntentFilter = new IntentFilter();
+ alarmIntentFilter.addAction(Intent.ACTION_ALARM_CHANGED);
+ context.registerReceiver(mAlarmIntentReceiver, alarmIntentFilter);
+ }
+
+ // User
+ void addUserTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mUserTile = view;
+ mUserCallback = cb;
+ mUserCallback.refreshView(mUserTile, mUserState);
+ }
+ void setUserTileInfo(String name) {
+ mUserState.label = name;
+ mUserCallback.refreshView(mUserTile, mUserState);
+ }
+
+ // Time
+ void addTimeTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mTimeTile = view;
+ mTimeAlarmCallback = cb;
+ mTimeAlarmCallback.refreshView(view, mTimeAlarmState);
+ }
+ void onAlarmChanged(Intent intent) {
+ mTimeAlarmState.enabled = intent.getBooleanExtra("alarmSet", false);
+ System.out.println("ALARM ENABLED: " + mTimeAlarmState.enabled);
+ mTimeAlarmCallback.refreshView(mTimeTile, mTimeAlarmState);
+ }
+ void onNextAlarmChanged() {
+ mTimeAlarmState.label = Settings.System.getString(mContext.getContentResolver(),
+ Settings.System.NEXT_ALARM_FORMATTED);
+ System.out.println("ALARM LABEL: " + mTimeAlarmState.label);
+ mTimeAlarmCallback.refreshView(mTimeTile, mTimeAlarmState);
+ }
+
+ // Airplane Mode
+ void addAirplaneModeTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mAirplaneModeTile = view;
+ mAirplaneModeTile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mAirplaneModeState.enabled) {
+ setAirplaneModeState(false);
+ } else {
+ setAirplaneModeState(true);
+ }
+ }
+ });
+ mAirplaneModeCallback = cb;
+ mAirplaneModeCallback.refreshView(mAirplaneModeTile, mAirplaneModeState);
+ }
+ private void setAirplaneModeState(boolean enabled) {
+ // TODO: Sets the view to be "awaiting" if not already awaiting
+
+ // Change the system setting
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
+ enabled ? 1 : 0);
+
+ // Post the intent
+ Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ intent.putExtra("state", enabled);
+ mContext.sendBroadcast(intent);
+ }
+ // NetworkSignalChanged callback
+ @Override
+ public void onAirplaneModeChanged(boolean enabled) {
+ // TODO: If view is in awaiting state, disable
+ Resources r = mContext.getResources();
+ mAirplaneModeState.enabled = enabled;
+ mAirplaneModeState.iconId = (enabled ?
+ R.drawable.ic_qs_airplane_enabled :
+ R.drawable.ic_qs_airplane_normal);
+ mAirplaneModeCallback.refreshView(mAirplaneModeTile, mAirplaneModeState);
+ }
+
+ // Wifi
+ void addWifiTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mWifiTile = view;
+ mWifiCallback = cb;
+ mWifiCallback.refreshView(mWifiTile, mWifiState);
+ }
+ // NetworkSignalChanged callback
+ @Override
+ public void onWifiSignalChanged(boolean enabled, String description) {
+ // TODO: If view is in awaiting state, disable
+ Resources r = mContext.getResources();
+ // TODO: Check if wifi is enabled
+ mWifiState.enabled = enabled;
+ mWifiState.iconId = (enabled ?
+ R.drawable.ic_qs_wifi_enabled :
+ R.drawable.ic_qs_wifi_normal);
+ mWifiState.label = (enabled ?
+ description :
+ r.getString(R.string.quick_settings_wifi_no_network));
+ mWifiCallback.refreshView(mWifiTile, mWifiState);
+ }
+
+ // RSSI
+ void addRSSITile(QuickSettingsTileView view, RefreshCallback cb) {
+ mRSSITile = view;
+ mRSSICallback = cb;
+ mRSSICallback.refreshView(mRSSITile, mRSSIState);
+ }
+ // NetworkSignalChanged callback
+ @Override
+ public void onMobileDataSignalChanged(boolean enabled, String description) {
+ // TODO: If view is in awaiting state, disable
+ Resources r = mContext.getResources();
+ // TODO: Check if RSSI is enabled
+ mRSSIState.enabled = enabled;
+ mRSSIState.iconId = (enabled ?
+ R.drawable.ic_qs_rssi_enabled :
+ R.drawable.ic_qs_rssi_normal);
+ mRSSIState.label = (enabled ?
+ description :
+ r.getString(R.string.quick_settings_rssi_emergency_only));
+ mRSSICallback.refreshView(mRSSITile, mRSSIState);
+ }
+
+ // Bluetooth
+ void addBluetoothTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mBluetoothTile = view;
+ mBluetoothCallback = cb;
+
+ final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ onBluetoothStateChange(adapter.isEnabled());
+ }
+ // BluetoothController callback
+ @Override
+ public void onBluetoothStateChange(boolean on) {
+ // TODO: If view is in awaiting state, disable
+ Resources r = mContext.getResources();
+ mBluetoothState.enabled = on;
+ if (on) {
+ mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_enabled;
+ } else {
+ mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_normal;
+ }
+ mBluetoothCallback.refreshView(mBluetoothTile, mBluetoothState);
+ }
+
+ // Battery
+ void addBatteryTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mBatteryTile = view;
+ mBatteryCallback = cb;
+ mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
+ }
+ // BatteryController callback
+ @Override
+ public void onBatteryLevelChanged(int level, boolean pluggedIn) {
+ mBatteryState.batteryLevel = level;
+ mBatteryState.pluggedIn = pluggedIn;
+ mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
+ }
+
+ // Location
+ void addLocationTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mLocationTile = view;
+ mLocationCallback = cb;
+ mLocationCallback.refreshView(mLocationTile, mLocationState);
+ }
+ // LocationController callback
+ @Override
+ public void onLocationGpsStateChanged(boolean inUse, String description) {
+ mLocationState.enabled = inUse;
+ mLocationState.label = description;
+ mLocationCallback.refreshView(mLocationTile, mLocationState);
+ }
+
+ // Wifi Display
+ void addWifiDisplayTile(QuickSettingsTileView view, RefreshCallback cb) {
+ mWifiDisplayTile = view;
+ mWifiDisplayCallback = cb;
+ }
+ public void onWifiDisplayStateChanged(WifiDisplayStatus status) {
+ mWifiDisplayState.enabled = status.isEnabled();
+ if (status.getActiveDisplay() != null) {
+ mWifiDisplayState.label = status.getActiveDisplay().getDeviceName();
+ } else {
+ mWifiDisplayState.label = mContext.getString(
+ R.string.quick_settings_wifi_display_no_connection_label);
+ }
+ mWifiDisplayCallback.refreshView(mWifiDisplayTile, mWifiDisplayState);
+
+ }
+
+}
\ No newline at end of file
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/LocationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java
index 4bf03e7..f864d04 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java
@@ -127,6 +127,10 @@
n,
idOut,
UserHandle.USER_CURRENT);
+
+ for (LocationGpsStateChangeCallback cb : mChangeCallbacks) {
+ cb.onLocationGpsStateChanged(true, text);
+ }
} else {
mNotificationService.cancelNotificationWithTag(
mContext.getPackageName(), null,
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/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
index e170ec1..863f4f8 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
@@ -32,17 +32,17 @@
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Canvas;
+import android.graphics.Rect;
import android.os.UserManager;
-import android.telephony.TelephonyManager;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Slog;
import android.view.KeyEvent;
import android.view.LayoutInflater;
+import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.AnimationUtils;
-import android.widget.Button;
import android.widget.RemoteViews.OnClickHandler;
import android.widget.ViewFlipper;
@@ -51,7 +51,6 @@
import com.android.internal.widget.LockPatternUtils;
import java.io.File;
-import java.util.ArrayList;
import java.util.List;
public class KeyguardHostView extends KeyguardViewBase {
@@ -77,6 +76,8 @@
private KeyguardSecurityModel mSecurityModel;
+ private Rect mTempRect = new Rect();
+
public KeyguardHostView(Context context) {
this(context, null);
}
@@ -94,6 +95,17 @@
}
@Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ boolean result = super.dispatchTouchEvent(ev);
+ mTempRect.set(0, 0, 0, 0);
+ offsetRectIntoDescendantCoords(mSecurityViewContainer, mTempRect);
+ ev.offsetLocation(mTempRect.left, mTempRect.top);
+ result = mSecurityViewContainer.dispatchTouchEvent(ev) || result;
+ ev.offsetLocation(-mTempRect.left, -mTempRect.top);
+ return result;
+ }
+
+ @Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
mViewMediatorCallback.keyguardDoneDrawing();
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java
index 3a32b5b..6de40e4 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPatternView.java
@@ -22,6 +22,7 @@
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.Context;
+import android.graphics.Rect;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.SystemClock;
@@ -31,7 +32,7 @@
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
-import android.widget.LinearLayout;
+import android.widget.GridLayout;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternView;
@@ -40,7 +41,7 @@
import java.io.IOException;
import java.util.List;
-public class KeyguardPatternView extends LinearLayout implements KeyguardSecurityView {
+public class KeyguardPatternView extends GridLayout implements KeyguardSecurityView {
private static final String TAG = "SecurityPatternView";
private static final boolean DEBUG = false;
@@ -83,6 +84,7 @@
mLockPatternView.clearPattern();
}
};
+ private Rect mTempRect = new Rect();
enum FooterMode {
Normal,
@@ -156,13 +158,18 @@
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
- final boolean result = super.dispatchTouchEvent(ev);
+ boolean result = super.dispatchTouchEvent(ev);
// as long as the user is entering a pattern (i.e sending a touch event that was handled
// by this screen), keep poking the wake lock so that the screen will stay on.
final long elapsed = SystemClock.elapsedRealtime() - mLastPokeTime;
if (result && (elapsed > (UNLOCK_PATTERN_WAKE_INTERVAL_MS - 100))) {
mLastPokeTime = SystemClock.elapsedRealtime();
}
+ mTempRect.set(0, 0, 0, 0);
+ offsetRectIntoDescendantCoords(mLockPatternView, mTempRect);
+ ev.offsetLocation(mTempRect.left, mTempRect.top);
+ result = mLockPatternView.dispatchTouchEvent(ev) || result;
+ ev.offsetLocation(-mTempRect.left, -mTempRect.top);
return result;
}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java
new file mode 100644
index 0000000..911cfe0
--- /dev/null
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityViewFlipper.java
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+package com.android.internal.policy.impl.keyguard;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.ViewFlipper;
+
+/**
+ * Subclass of the current view flipper that allows us to overload dispatchTouchEvent() so
+ * we can emulate {@link WindowManager.LayoutParams#FLAG_SLIPPERY} within a view hierarchy.
+ *
+ */
+public class KeyguardSecurityViewFlipper extends ViewFlipper {
+ private Rect mTempRect = new Rect();
+
+ public KeyguardSecurityViewFlipper(Context context) {
+ this(context, null);
+ }
+
+ public KeyguardSecurityViewFlipper(Context context, AttributeSet attr) {
+ super(context, attr);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ boolean result = super.dispatchTouchEvent(ev);
+ mTempRect.set(0, 0, 0, 0);
+ for (int i = 0; i < getChildCount(); i++) {
+ View child = getChildAt(i);
+ if (child.getVisibility() == View.VISIBLE) {
+ offsetRectIntoDescendantCoords(child, mTempRect);
+ ev.offsetLocation(mTempRect.left, mTempRect.top);
+ result = child.dispatchTouchEvent(ev) || result;
+ ev.offsetLocation(-mTempRect.left, -mTempRect.top);
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java
index 66c7c10..c48e2d7 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java
@@ -73,9 +73,9 @@
private static final int MSG_PHONE_STATE_CHANGED = 306;
private static final int MSG_CLOCK_VISIBILITY_CHANGED = 307;
private static final int MSG_DEVICE_PROVISIONED = 308;
- protected static final int MSG_DPM_STATE_CHANGED = 309;
- protected static final int MSG_USER_SWITCHED = 310;
- protected static final int MSG_USER_REMOVED = 311;
+ private static final int MSG_DPM_STATE_CHANGED = 309;
+ private static final int MSG_USER_SWITCHED = 310;
+ private static final int MSG_USER_REMOVED = 311;
private static KeyguardUpdateMonitor sInstance;
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/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 62d410b..8301211 100644
--- a/services/java/com/android/server/accessibility/ScreenMagnifier.java
+++ b/services/java/com/android/server/accessibility/ScreenMagnifier.java
@@ -21,7 +21,10 @@
import android.animation.ObjectAnimator;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
@@ -121,15 +124,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;
@@ -144,10 +147,12 @@
private final MagnificationController mMagnificationController;
private final DisplayContentObserver mDisplayContentObserver;
+ private final ScreenStateObserver mScreenStateObserver;
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;
@@ -160,6 +165,7 @@
private EventStreamTransformation mNext;
private int mCurrentState;
+ private int mPreviousState;
private boolean mTranslationEnabledBeforePan;
private PointerCoords[] mTempPointerCoords;
@@ -185,6 +191,8 @@
mDisplayContentObserver = new DisplayContentObserver(mContext, mViewport,
mMagnificationController, mWindowManagerService, mDisplayProvider,
mLongAnimationDuration, mWindowAnimationScale);
+ mScreenStateObserver = new ScreenStateObserver(mContext, mViewport,
+ mMagnificationController);
mGestureDetector = new GestureDetector(context);
@@ -193,6 +201,7 @@
@Override
public void onMotionEvent(MotionEvent event, int policyFlags) {
+ mGestureDetector.onMotionEvent(event);
switch (mCurrentState) {
case STATE_DELEGATING: {
handleMotionEventStateDelegating(event, policyFlags);
@@ -203,18 +212,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
@@ -247,6 +253,7 @@
mViewport.setFrameShown(false, true);
mDisplayProvider.destroy();
mDisplayContentObserver.destroy();
+ mScreenStateObserver.destroy();
}
private void handleMotionEventStateDelegating(MotionEvent event, int policyFlags) {
@@ -326,20 +333,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;
}
@@ -347,7 +349,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;
@@ -366,6 +368,9 @@
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;
@@ -383,10 +388,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);
+ }
}
}
@@ -398,18 +408,20 @@
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);
+ if (!mScaling && scaleDelta > DETECT_SCALING_THRESHOLD) {
+ mScaling = true;
+ clearContextualState();
return true;
}
+ if (mScaling) {
+ performScale(detector);
+ }
mCurrPan = (float) MathUtils.dist(
mScaleGestureDetector.getFocusX(),
mScaleGestureDetector.getFocusY(),
@@ -418,18 +430,14 @@
if (DEBUG_GESTURE_DETECTOR) {
Slog.i(LOG_TAG, "panDelta: " + panDelta);
}
- if (panDelta > mScaledDetectPanningThreshold) {
- performPan(detector, true);
- clear();
- transitionToState(STATE_PANNING);
+ 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;
@@ -437,32 +445,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) {
- clear();
+ clearContextualState();
}
public void clear() {
+ clearContextualState();
+ mScaling = false;
+ mPanning = false;
+ }
+
+ private void clearContextualState() {
mCurrScaleFactor = 1.0f;
mPrevScaleFactor = 1.0f;
mPrevPan = 0;
@@ -474,7 +476,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());
@@ -491,11 +493,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;
@@ -513,7 +515,7 @@
mScaleFocusY = detector.getFocusY();
}
mMagnificationController.setScale(normalizedNewScale, mScaleFocusX,
- mScaleFocusY, animate);
+ mScaleFocusY, false);
}
}
@@ -528,7 +530,7 @@
}
case MotionEvent.ACTION_POINTER_DOWN: {
clear();
- transitionToState(STATE_SCALING);
+ transitionToState(STATE_MAGNIFIED_INTERACTION);
} break;
case MotionEvent.ACTION_MOVE: {
if (event.getPointerCount() != 1) {
@@ -625,14 +627,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();
@@ -791,6 +793,12 @@
DEFAULT_MAGNIFICATION_SCALE);
}
+ private static boolean isScreenMagnificationAutoUpdateEnabled(Context context) {
+ return (Settings.Secure.getInt(context.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE,
+ DEFAULT_SCREEN_MAGNIFICATION_AUTO_UPDATE) == 1);
+ }
+
private static final class MotionEventInfo {
private static final int MAX_POOL_SIZE = 10;
@@ -849,6 +857,54 @@
}
}
+ private static final class ScreenStateObserver extends BroadcastReceiver {
+
+ private static final int MESSAGE_ON_SCREEN_STATE_CHANGE = 1;
+
+ private final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message message) {
+ switch (message.what) {
+ case MESSAGE_ON_SCREEN_STATE_CHANGE: {
+ String action = (String) message.obj;
+ handleOnScreenStateChange(action);
+ } break;
+ }
+ }
+ };
+
+ private final Context mContext;
+ private final Viewport mViewport;
+ private final MagnificationController mMagnificationController;
+
+ public ScreenStateObserver(Context context, Viewport viewport,
+ MagnificationController magnificationController) {
+ mContext = context;
+ mViewport = viewport;
+ mMagnificationController = magnificationController;
+ mContext.registerReceiver(this, new IntentFilter(Intent.ACTION_SCREEN_OFF));
+ }
+
+ public void destroy() {
+ mContext.unregisterReceiver(this);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mHandler.obtainMessage(MESSAGE_ON_SCREEN_STATE_CHANGE,
+ intent.getAction()).sendToTarget();
+ }
+
+ private void handleOnScreenStateChange(String action) {
+ if (action.equals(Intent.ACTION_SCREEN_OFF)
+ && mMagnificationController.isMagnifying()
+ && isScreenMagnificationAutoUpdateEnabled(mContext)) {
+ mMagnificationController.reset(false);
+ mViewport.setFrameShown(false, false);
+ }
+ }
+ }
+
private static final class DisplayContentObserver {
private static final int MESSAGE_SHOW_VIEWPORT_FRAME = 1;
@@ -977,7 +1033,7 @@
switch (transition) {
case WindowManagerPolicy.TRANSIT_ENTER:
case WindowManagerPolicy.TRANSIT_SHOW: {
- if (!magnifying || !screenMagnificationAutoUpdateEnabled(mContext)) {
+ if (!magnifying || !isScreenMagnificationAutoUpdateEnabled(mContext)) {
break;
}
final int type = info.type;
@@ -1065,18 +1121,12 @@
private void resetMagnificationIfNeeded() {
if (mMagnificationController.isMagnifying()
- && screenMagnificationAutoUpdateEnabled(mContext)) {
+ && isScreenMagnificationAutoUpdateEnabled(mContext)) {
mMagnificationController.reset(true);
mViewport.setFrameShown(false, true);
}
}
- private boolean screenMagnificationAutoUpdateEnabled(Context context) {
- return (Settings.Secure.getInt(context.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE,
- DEFAULT_SCREEN_MAGNIFICATION_AUTO_UPDATE) == 1);
- }
-
private String windowTransitionToString(int transition) {
switch (transition) {
case WindowManagerPolicy.TRANSIT_UNSET: {
diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java
index 2975880..3bb95a8 100644
--- a/services/java/com/android/server/am/ActiveServices.java
+++ b/services/java/com/android/server/am/ActiveServices.java
@@ -1763,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()));
}
@@ -1873,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();
@@ -1891,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) {
@@ -2070,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 0b2d769..6da8403 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;
@@ -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;
@@ -3401,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();
@@ -3446,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)
@@ -3458,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 {
@@ -3523,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="
@@ -3533,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 {
@@ -3685,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) {
@@ -13688,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 {
@@ -13707,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)) {
@@ -13766,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 {
@@ -13783,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);
}
@@ -13864,6 +13876,9 @@
return true;
}
+ mWindowManager.startFreezingScreen(R.anim.screen_user_exit,
+ R.anim.screen_user_enter);
+
// If the user we are switching to is not currently started, then
// we need to start it now.
if (mStartedUsers.get(userId) == null) {
@@ -13877,6 +13892,8 @@
boolean haveActivities = mMainStack.switchUser(userId);
if (!haveActivities) {
startHomeActivityLocked(userId, mStartedUsers.get(userId));
+ } else {
+ mMainStack.addStartingUserLocked(mStartedUsers.get(userId));
}
}
@@ -13907,6 +13924,7 @@
android.Manifest.permission.RECEIVE_BOOT_COMPLETED,
false, false, MY_PID, Process.SYSTEM_UID, userId);
}
+ mWindowManager.stopFreezingScreen();
}
}
@@ -14018,7 +14036,7 @@
throw new SecurityException(msg);
}
synchronized (this) {
- return getUserManager().getUserInfo(mCurrentUserId);
+ return getUserManagerLocked().getUserInfo(mCurrentUserId);
}
}
@@ -14034,19 +14052,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/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/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/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 3329acb..4268ae0 100644
--- a/services/java/com/android/server/pm/Installer.java
+++ b/services/java/com/android/server/pm/Installer.java
@@ -359,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 4bb6e38..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;
}
@@ -9779,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/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/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java
index 7c7d4b1..8d2e2e8 100644
--- a/services/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -48,6 +48,7 @@
BlackFrame mExitingBlackFrame;
BlackFrame mEnteringBlackFrame;
int mWidth, mHeight;
+ int mExitAnimId, mEnterAnimId;
int mOriginalRotation;
int mOriginalWidth, mOriginalHeight;
@@ -188,9 +189,12 @@
}
public ScreenRotationAnimation(Context context, Display display, SurfaceSession session,
- boolean inTransaction, int originalWidth, int originalHeight, int originalRotation) {
+ boolean inTransaction, int originalWidth, int originalHeight, int originalRotation,
+ int exitAnim, int enterAnim) {
mContext = context;
mDisplay = display;
+ mExitAnimId = exitAnim;
+ mEnterAnimId = enterAnim;
// Screenshot does NOT include rotation!
if (originalRotation == Surface.ROTATION_90
@@ -375,58 +379,68 @@
+ finalWidth + " finalHeight=" + finalHeight
+ " origWidth=" + mOriginalWidth + " origHeight=" + mOriginalHeight);
- switch (delta) {
- case Surface.ROTATION_0:
- mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_0_exit);
- mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_0_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_0_frame);
- }
- break;
- case Surface.ROTATION_90:
- mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_plus_90_exit);
- mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_plus_90_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_plus_90_frame);
- }
- break;
- case Surface.ROTATION_180:
- mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_180_exit);
- mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_180_enter);
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_180_frame);
- break;
- case Surface.ROTATION_270:
- mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_minus_90_exit);
- mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_minus_90_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_minus_90_frame);
- }
- break;
+ final boolean customAnim;
+ if (mExitAnimId != 0 && mEnterAnimId != 0) {
+ customAnim = true;
+ mRotateExitAnimation = AnimationUtils.loadAnimation(mContext, mExitAnimId);
+ mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext, mEnterAnimId);
+ } else {
+ customAnim = false;
+ switch (delta) {
+ case Surface.ROTATION_0:
+ mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_0_exit);
+ mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_0_enter);
+ if (USE_CUSTOM_BLACK_FRAME) {
+ mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_0_frame);
+ }
+ break;
+ case Surface.ROTATION_90:
+ mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_plus_90_exit);
+ mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_plus_90_enter);
+ if (USE_CUSTOM_BLACK_FRAME) {
+ mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_plus_90_frame);
+ }
+ break;
+ case Surface.ROTATION_180:
+ mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_180_exit);
+ mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_180_enter);
+ if (USE_CUSTOM_BLACK_FRAME) {
+ mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_180_frame);
+ }
+ break;
+ case Surface.ROTATION_270:
+ mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_minus_90_exit);
+ mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_minus_90_enter);
+ if (USE_CUSTOM_BLACK_FRAME) {
+ mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
+ com.android.internal.R.anim.screen_rotate_minus_90_frame);
+ }
+ break;
+ }
}
- // Compute partial steps between original and final sizes. These
- // are used for the dimensions of the exiting and entering elements,
- // so they are never stretched too significantly.
- final int halfWidth = (finalWidth + mOriginalWidth) / 2;
- final int halfHeight = (finalHeight + mOriginalHeight) / 2;
-
// Initialize the animations. This is a hack, redefining what "parent"
// means to allow supplying the last and next size. In this definition
// "%p" is the original (let's call it "previous") size, and "%" is the
// screen's current/new size.
if (TWO_PHASE_ANIMATION && firstStart) {
+ // Compute partial steps between original and final sizes. These
+ // are used for the dimensions of the exiting and entering elements,
+ // so they are never stretched too significantly.
+ final int halfWidth = (finalWidth + mOriginalWidth) / 2;
+ final int halfHeight = (finalHeight + mOriginalHeight) / 2;
+
if (DEBUG_STATE) Slog.v(TAG, "Initializing start and finish animations");
mStartEnterAnimation.initialize(finalWidth, finalHeight,
halfWidth, halfHeight);
@@ -510,7 +524,7 @@
}
}
- if (mExitingBlackFrame == null) {
+ if (!customAnim && mExitingBlackFrame == null) {
if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
WindowManagerService.TAG,
">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
@@ -540,7 +554,7 @@
}
}
- if (false && mEnteringBlackFrame == null) {
+ if (customAnim && mEnteringBlackFrame == null) {
if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
WindowManagerService.TAG,
">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index cdca8bc..622ab63 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;
@@ -460,6 +461,7 @@
boolean mDisplayFrozen = false;
boolean mWaitingForConfig = false;
boolean mWindowsFreezingScreen = false;
+ boolean mClientFreezingScreen = false;
int mAppsFreezingScreen = 0;
int mLastWindowForcedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -503,8 +505,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 +2085,7 @@
long origId;
synchronized(mWindowMap) {
- if (mDefaultDisplay == null) {
+ if (!mDisplayReady) {
throw new IllegalStateException("Display has not been initialialized");
}
@@ -3916,7 +3916,7 @@
if (currentConfig.diff(mTempConfiguration) != 0) {
mWaitingForConfig = true;
getDefaultDisplayContent().layoutNeeded = true;
- startFreezingDisplayLocked(false);
+ startFreezingDisplayLocked(false, 0, 0);
config = new Configuration(mTempConfiguration);
}
}
@@ -4645,7 +4645,7 @@
wtoken.mAppAnimator.freezingScreen = true;
mAppsFreezingScreen++;
if (mAppsFreezingScreen == 1) {
- startFreezingDisplayLocked(false);
+ startFreezingDisplayLocked(false, 0, 0);
mH.removeMessages(H.APP_FREEZE_TIMEOUT);
mH.sendMessageDelayed(mH.obtainMessage(H.APP_FREEZE_TIMEOUT),
5000);
@@ -5155,6 +5155,49 @@
// -------------------------------------------------------------
@Override
+ public void startFreezingScreen(int exitAnim, int enterAnim) {
+ if (!checkCallingPermission(android.Manifest.permission.FREEZE_SCREEN,
+ "startFreezingScreen()")) {
+ throw new SecurityException("Requires FREEZE_SCREEN permission");
+ }
+
+ synchronized(mWindowMap) {
+ if (!mClientFreezingScreen) {
+ mClientFreezingScreen = true;
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ startFreezingDisplayLocked(false, exitAnim, enterAnim);
+ mH.removeMessages(H.CLIENT_FREEZE_TIMEOUT);
+ mH.sendMessageDelayed(mH.obtainMessage(H.CLIENT_FREEZE_TIMEOUT),
+ 5000);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void stopFreezingScreen() {
+ if (!checkCallingPermission(android.Manifest.permission.FREEZE_SCREEN,
+ "stopFreezingScreen()")) {
+ throw new SecurityException("Requires FREEZE_SCREEN permission");
+ }
+
+ synchronized(mWindowMap) {
+ if (mClientFreezingScreen) {
+ mClientFreezingScreen = false;
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ stopFreezingDisplayLocked();
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+ }
+
+ @Override
public void disableKeyguard(IBinder token, String tag) {
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
!= PackageManager.PERMISSION_GRANTED) {
@@ -5604,8 +5647,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 +5763,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();
@@ -5946,7 +5991,7 @@
mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT), 2000);
mWaitingForConfig = true;
getDefaultDisplayContent().layoutNeeded = true;
- startFreezingDisplayLocked(inTransaction);
+ startFreezingDisplayLocked(inTransaction, 0, 0);
// We need to update our screen size information to match the new
// rotation. Note that this is redundant with the later call to
@@ -6751,7 +6796,7 @@
}
boolean computeScreenConfigurationLocked(Configuration config) {
- if (mDefaultDisplay == null) {
+ if (!mDisplayReady) {
return false;
}
@@ -6785,13 +6830,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 +6998,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 +7145,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 {
@@ -7206,6 +7251,8 @@
public static final int DO_DISPLAY_REMOVED = 32;
public static final int DO_DISPLAY_CHANGED = 33;
+ public static final int CLIENT_FREEZE_TIMEOUT = 34;
+
public static final int ANIMATOR_WHAT_OFFSET = 100000;
public static final int SET_TRANSPARENT_REGION = ANIMATOR_WHAT_OFFSET + 1;
public static final int CLEAR_PENDING_ACTIONS = ANIMATOR_WHAT_OFFSET + 2;
@@ -7532,6 +7579,16 @@
break;
}
+ case CLIENT_FREEZE_TIMEOUT: {
+ synchronized (mWindowMap) {
+ if (mClientFreezingScreen) {
+ mClientFreezingScreen = false;
+ stopFreezingDisplayLocked();
+ }
+ }
+ break;
+ }
+
case SEND_NEW_CONFIGURATION: {
removeMessages(SEND_NEW_CONFIGURATION);
sendNewConfiguration();
@@ -7802,6 +7859,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 +7887,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 +7987,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;
@@ -7945,7 +8005,7 @@
if (configChanged) {
mWaitingForConfig = true;
- startFreezingDisplayLocked(false);
+ startFreezingDisplayLocked(false, 0, 0);
mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
}
@@ -8154,7 +8214,7 @@
return;
}
- if (mDefaultDisplay == null) {
+ if (!mDisplayReady) {
// Not yet initialized, nothing to do.
return;
}
@@ -8600,11 +8660,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");
@@ -9852,12 +9915,13 @@
return result;
}
- private void startFreezingDisplayLocked(boolean inTransaction) {
+ private void startFreezingDisplayLocked(boolean inTransaction,
+ int exitAnim, int enterAnim) {
if (mDisplayFrozen) {
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 +9953,13 @@
}
// 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(),
+ exitAnim, enterAnim);
}
}
@@ -9901,16 +9968,19 @@
return;
}
- if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen) {
+ if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen
+ || mClientFreezingScreen) {
if (DEBUG_ORIENTATION) Slog.d(TAG,
"stopFreezingDisplayLocked: Returning mWaitingForConfig=" + mWaitingForConfig
+ ", mAppsFreezingScreen=" + mAppsFreezingScreen
- + ", mWindowsFreezingScreen=" + mWindowsFreezingScreen);
+ + ", mWindowsFreezingScreen=" + mWindowsFreezingScreen
+ + ", mClientFreezingScreen=" + mClientFreezingScreen);
return;
}
mDisplayFrozen = false;
mH.removeMessages(H.APP_FREEZE_TIMEOUT);
+ mH.removeMessages(H.CLIENT_FREEZE_TIMEOUT);
if (PROFILE_ORIENTATION) {
Debug.stopMethodTracing();
}
@@ -10003,8 +10073,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 +10442,7 @@
}
}
pw.println();
- if (mDefaultDisplay != null) {
+ if (mDisplayReady) {
DisplayContentsIterator dCIterator = new DisplayContentsIterator();
while (dCIterator.hasNext()) {
dCIterator.next().dump(pw);
@@ -10431,9 +10501,10 @@
}
pw.print(" mTransactionSequence="); pw.println(mTransactionSequence);
pw.print(" mDisplayFrozen="); pw.print(mDisplayFrozen);
- pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen);
- pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen);
- pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig);
+ pw.print(" windows="); pw.print(mWindowsFreezingScreen);
+ pw.print(" client="); pw.print(mClientFreezingScreen);
+ pw.print(" apps="); pw.print(mAppsFreezingScreen);
+ pw.print(" waitingForConfig="); pw.println(mWaitingForConfig);
pw.print(" mRotation="); pw.print(mRotation);
pw.print(" mAltOrientation="); pw.println(mAltOrientation);
pw.print(" mLastWindowForcedOrientation="); pw.print(mLastWindowForcedOrientation);
@@ -10744,7 +10815,7 @@
}
}
- boolean REVERSE_ITERATOR = true;
+ final static boolean REVERSE_ITERATOR = true;
class AllWindowsIterator implements Iterator<WindowState> {
private DisplayContent mDisplayContent;
private DisplayContentsIterator mDisplayContentsIterator;
@@ -10804,9 +10875,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/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
index 5d64e8a..b8d21f3 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
@@ -107,6 +107,16 @@
}
@Override
+ public void startFreezingScreen(int exitAnim, int enterAnim) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void stopFreezingScreen() {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
public void disableKeyguard(IBinder arg0, String arg1) throws RemoteException {
// TODO Auto-generated method stub