summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityManagerNative.java22
-rw-r--r--core/java/android/app/IActivityManager.java2
-rwxr-xr-xcore/java/android/hardware/input/InputManager.java3
-rw-r--r--core/java/android/provider/Settings.java6
-rw-r--r--core/java/android/text/SpannableStringBuilder.java67
-rwxr-xr-xcore/java/android/view/InputDevice.java20
-rw-r--r--core/res/res/layout/action_mode_close_item.xml1
-rw-r--r--core/res/res/values-af/strings.xml2
-rw-r--r--core/res/res/values-am/strings.xml2
-rw-r--r--core/res/res/values-ar/strings.xml2
-rw-r--r--core/res/res/values-be/strings.xml2
-rw-r--r--core/res/res/values-bg/strings.xml2
-rw-r--r--core/res/res/values-ca/strings.xml2
-rw-r--r--core/res/res/values-cs/strings.xml2
-rw-r--r--core/res/res/values-da/strings.xml2
-rw-r--r--core/res/res/values-de/strings.xml2
-rw-r--r--core/res/res/values-el/strings.xml2
-rw-r--r--core/res/res/values-en-rGB/strings.xml2
-rw-r--r--core/res/res/values-es-rUS/strings.xml2
-rw-r--r--core/res/res/values-es/strings.xml2
-rw-r--r--core/res/res/values-et/strings.xml2
-rw-r--r--core/res/res/values-fa/strings.xml2
-rw-r--r--core/res/res/values-fi/strings.xml2
-rw-r--r--core/res/res/values-fr/strings.xml2
-rw-r--r--core/res/res/values-hi/strings.xml2
-rw-r--r--core/res/res/values-hr/strings.xml2
-rw-r--r--core/res/res/values-hu/strings.xml2
-rw-r--r--core/res/res/values-in/strings.xml2
-rw-r--r--core/res/res/values-it/strings.xml2
-rw-r--r--core/res/res/values-iw/strings.xml2
-rw-r--r--core/res/res/values-ja/strings.xml2
-rw-r--r--core/res/res/values-ko/strings.xml2
-rw-r--r--core/res/res/values-lt/strings.xml2
-rw-r--r--core/res/res/values-lv/strings.xml2
-rw-r--r--core/res/res/values-ms/strings.xml2
-rw-r--r--core/res/res/values-nb/strings.xml2
-rw-r--r--core/res/res/values-nl/strings.xml2
-rw-r--r--core/res/res/values-pl/strings.xml2
-rw-r--r--core/res/res/values-pt-rPT/strings.xml2
-rw-r--r--core/res/res/values-pt/strings.xml2
-rw-r--r--core/res/res/values-rm/strings.xml2
-rw-r--r--core/res/res/values-ro/strings.xml2
-rw-r--r--core/res/res/values-ru/strings.xml2
-rw-r--r--core/res/res/values-sk/strings.xml2
-rw-r--r--core/res/res/values-sl/strings.xml2
-rw-r--r--core/res/res/values-sr/strings.xml2
-rw-r--r--core/res/res/values-sv/strings.xml2
-rw-r--r--core/res/res/values-sw/strings.xml2
-rw-r--r--core/res/res/values-th/strings.xml2
-rw-r--r--core/res/res/values-tl/strings.xml2
-rw-r--r--core/res/res/values-tr/strings.xml2
-rw-r--r--core/res/res/values-uk/strings.xml2
-rw-r--r--core/res/res/values-vi/strings.xml2
-rw-r--r--core/res/res/values-zh-rCN/strings.xml2
-rw-r--r--core/res/res/values-zh-rTW/strings.xml2
-rw-r--r--core/res/res/values-zu/strings.xml2
-rw-r--r--docs/html/guide/topics/ui/accessibility/apps.jd14
-rw-r--r--include/androidfw/Input.h46
-rw-r--r--libs/androidfw/Input.cpp9
-rw-r--r--libs/storage/Android.mk4
-rw-r--r--obex/MODULE_LICENSE_BSD_LIKE0
-rw-r--r--obex/NOTICE29
-rw-r--r--services/input/EventHub.cpp67
-rw-r--r--services/input/EventHub.h4
-rw-r--r--services/input/InputReader.cpp25
-rw-r--r--services/input/InputReader.h9
-rw-r--r--services/input/tests/InputReader_test.cpp29
-rw-r--r--services/java/com/android/server/AlarmManagerService.java36
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java11
-rw-r--r--services/java/com/android/server/am/ActivityRecord.java3
-rw-r--r--services/jni/com_android_server_input_InputManagerService.cpp14
71 files changed, 413 insertions, 106 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 000abc5..a3fdf3e 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -867,6 +867,16 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
+ case GET_UID_FOR_INTENT_SENDER_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ IIntentSender r = IIntentSender.Stub.asInterface(
+ data.readStrongBinder());
+ int res = getUidForIntentSender(r);
+ reply.writeNoException();
+ reply.writeInt(res);
+ return true;
+ }
+
case SET_PROCESS_LIMIT_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
int max = data.readInt();
@@ -2714,6 +2724,18 @@ class ActivityManagerProxy implements IActivityManager
reply.recycle();
return res;
}
+ public int getUidForIntentSender(IIntentSender sender) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeStrongBinder(sender.asBinder());
+ mRemote.transact(GET_UID_FOR_INTENT_SENDER_TRANSACTION, data, reply, 0);
+ reply.readException();
+ int res = reply.readInt();
+ data.recycle();
+ reply.recycle();
+ return res;
+ }
public void setProcessLimit(int max) throws RemoteException
{
Parcel data = Parcel.obtain();
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 0f287c1..c71b186 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -175,6 +175,7 @@ public interface IActivityManager extends IInterface {
public boolean clearApplicationUserData(final String packageName,
final IPackageDataObserver observer, int userId) throws RemoteException;
public String getPackageForIntentSender(IIntentSender sender) throws RemoteException;
+ public int getUidForIntentSender(IIntentSender sender) throws RemoteException;
public void setProcessLimit(int max) throws RemoteException;
public int getProcessLimit() throws RemoteException;
@@ -531,6 +532,7 @@ public interface IActivityManager extends IInterface {
int START_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+89;
int BACKUP_AGENT_CREATED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+90;
int UNBIND_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+91;
+ int GET_UID_FOR_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+92;
int START_ACTIVITY_IN_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+94;
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index ba64035..5ead1f4 100755
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -39,12 +39,9 @@ import android.os.ServiceManager;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.util.Log;
-import android.view.Display;
-import android.view.IWindowManager;
import android.view.InputDevice;
import android.view.InputEvent;
import android.view.KeyCharacterMap;
-import android.view.WindowManagerPolicy;
import android.view.KeyCharacterMap.UnavailableException;
import java.util.ArrayList;
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 371e2a1..2aaf548 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -37,6 +37,7 @@ import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
@@ -2260,6 +2261,7 @@ public final class Settings {
private static ILockSettings sLockSettings = null;
+ private static boolean sIsSystemProcess;
private static final HashSet<String> MOVED_TO_LOCK_SETTINGS;
static {
MOVED_TO_LOCK_SETTINGS = new HashSet<String>(3);
@@ -2283,8 +2285,10 @@ public final class Settings {
if (sLockSettings == null) {
sLockSettings = ILockSettings.Stub.asInterface(
(IBinder) ServiceManager.getService("lock_settings"));
+ sIsSystemProcess = Process.myUid() == Process.SYSTEM_UID;
}
- if (sLockSettings != null && MOVED_TO_LOCK_SETTINGS.contains(name)) {
+ if (sLockSettings != null && !sIsSystemProcess
+ && MOVED_TO_LOCK_SETTINGS.contains(name)) {
try {
return sLockSettings.getString(name, "0", UserId.getCallingUserId());
} catch (RemoteException re) {
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index bb4b282..f7a7eb8 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -50,8 +50,6 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
public SpannableStringBuilder(CharSequence text, int start, int end) {
int srclen = end - start;
- if (srclen < 0) throw new StringIndexOutOfBoundsException();
-
int len = ArrayUtils.idealCharArraySize(srclen + 1);
mText = new char[len];
mGapStart = srclen;
@@ -155,7 +153,7 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
if (where == mGapStart)
return;
- boolean atEnd = (where == length());
+ boolean atend = (where == length());
if (where < mGapStart) {
int overlap = mGapStart - where;
@@ -181,7 +179,7 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
else if (start == where) {
int flag = (mSpanFlags[i] & START_MASK) >> START_SHIFT;
- if (flag == POINT || (atEnd && flag == PARAGRAPH))
+ if (flag == POINT || (atend && flag == PARAGRAPH))
start += mGapLength;
}
@@ -192,7 +190,7 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
else if (end == where) {
int flag = (mSpanFlags[i] & END_MASK);
- if (flag == POINT || (atEnd && flag == PARAGRAPH))
+ if (flag == POINT || (atend && flag == PARAGRAPH))
end += mGapLength;
}
@@ -399,7 +397,7 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
// Documentation from interface
public SpannableStringBuilder replace(final int start, final int end,
- CharSequence tb, int tbstart, int tbend) {
+ CharSequence tb, int tbstart, int tbend) {
int filtercount = mFilters.length;
for (int i = 0; i < filtercount; i++) {
CharSequence repl = mFilters[i].filter(tb, tbstart, tbend, this, start, end);
@@ -421,26 +419,53 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
TextWatcher[] textWatchers = getSpans(start, start + origLen, TextWatcher.class);
sendBeforeTextChanged(textWatchers, start, origLen, newLen);
- // Try to keep the cursor / selection at the same relative position during
- // a text replacement. If replaced or replacement text length is zero, this
- // is already taken care of.
- boolean adjustSelection = origLen != 0 && newLen != 0;
- int selstart = 0;
- int selend = 0;
- if (adjustSelection) {
- selstart = Selection.getSelectionStart(this);
- selend = Selection.getSelectionEnd(this);
- }
+ if (origLen == 0 || newLen == 0) {
+ change(start, end, tb, tbstart, tbend);
+ } else {
+ int selstart = Selection.getSelectionStart(this);
+ int selend = Selection.getSelectionEnd(this);
- checkRange("replace", start, end);
+ // XXX just make the span fixups in change() do the right thing
+ // instead of this madness!
+
+ checkRange("replace", start, end);
+ moveGapTo(end);
+
+ if (mGapLength < 2)
+ resizeFor(length() + 1);
- change(start, end, tb, tbstart, tbend);
+ for (int i = mSpanCount - 1; i >= 0; i--) {
+ if (mSpanStarts[i] == mGapStart)
+ mSpanStarts[i]++;
+
+ if (mSpanEnds[i] == mGapStart)
+ mSpanEnds[i]++;
+ }
+
+ mText[mGapStart] = ' ';
+ mGapStart++;
+ mGapLength--;
+
+ if (mGapLength < 1) {
+ new Exception("mGapLength < 1").printStackTrace();
+ }
- if (adjustSelection) {
+ change(start + 1, start + 1, tb, tbstart, tbend);
+ change(start, start + 1, "", 0, 0);
+ change(start + newLen, start + newLen + origLen, "", 0, 0);
+
+ /*
+ * Special case to keep the cursor in the same position
+ * if it was somewhere in the middle of the replaced region.
+ * If it was at the start or the end or crossing the whole
+ * replacement, it should already be where it belongs.
+ * TODO: Is there some more general mechanism that could
+ * accomplish this?
+ */
if (selstart > start && selstart < end) {
long off = selstart - start;
- off = off * newLen / origLen;
+ off = off * newLen / (end - start);
selstart = (int) off + start;
setSpan(false, Selection.SELECTION_START, selstart, selstart,
@@ -449,7 +474,7 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
if (selend > start && selend < end) {
long off = selend - start;
- off = off * newLen / origLen;
+ off = off * newLen / (end - start);
selend = (int) off + start;
setSpan(false, Selection.SELECTION_END, selend, selend, Spanned.SPAN_POINT_POINT);
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index 93a0185..6f8d09b 100755
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -41,6 +41,7 @@ import java.util.List;
public final class InputDevice implements Parcelable {
private int mId;
private String mName;
+ private String mDescriptor;
private int mSources;
private int mKeyboardType;
private String mKeyCharacterMapFile;
@@ -334,12 +335,24 @@ public final class InputDevice implements Parcelable {
* An input device descriptor uniquely identifies an input device. Its value
* is intended to be persistent across system restarts, and should not change even
* if the input device is disconnected, reconnected or reconfigured at any time.
+ * </p><p>
+ * It is possible for there to be multiple {@link InputDevice} instances that have the
+ * same input device descriptor. This might happen in situations where a single
+ * human input device registers multiple {@link InputDevice} instances (HID collections)
+ * that describe separate features of the device, such as a keyboard that also
+ * has a trackpad. Alternately, it may be that the input devices are simply
+ * indistinguishable, such as two keyboards made by the same manufacturer.
+ * </p><p>
+ * The input device descriptor returned by {@link #getDescriptor} should only bt
+ * used when an application needs to remember settings associated with a particular
+ * input device. For all other purposes when referring to a logical
+ * {@link InputDevice} instance at runtime use the id returned by {@link #getId()}.
* </p>
*
* @return The input device descriptor.
*/
public String getDescriptor() {
- return "PLACEHOLDER"; // TODO: implement for real
+ return mDescriptor;
}
/**
@@ -548,6 +561,7 @@ public final class InputDevice implements Parcelable {
private void readFromParcel(Parcel in) {
mId = in.readInt();
mName = in.readString();
+ mDescriptor = in.readString();
mSources = in.readInt();
mKeyboardType = in.readInt();
mKeyCharacterMapFile = in.readString();
@@ -566,6 +580,7 @@ public final class InputDevice implements Parcelable {
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mId);
out.writeString(mName);
+ out.writeString(mDescriptor);
out.writeInt(mSources);
out.writeInt(mKeyboardType);
out.writeString(mKeyCharacterMapFile);
@@ -592,7 +607,8 @@ public final class InputDevice implements Parcelable {
public String toString() {
StringBuilder description = new StringBuilder();
description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
-
+ description.append(" Descriptor: ").append(mDescriptor).append("\n");
+
description.append(" Keyboard Type: ");
switch (mKeyboardType) {
case KEYBOARD_TYPE_NONE:
diff --git a/core/res/res/layout/action_mode_close_item.xml b/core/res/res/layout/action_mode_close_item.xml
index ac5af70..8cd0cdd 100644
--- a/core/res/res/layout/action_mode_close_item.xml
+++ b/core/res/res/layout/action_mode_close_item.xml
@@ -19,6 +19,7 @@
android:focusable="true"
android:clickable="true"
android:paddingLeft="8dip"
+ android:contentDescription="@string/action_mode_done"
style="?android:attr/actionModeCloseButtonStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index d6073e3..e649904 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Stil"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Klank aan"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Sleep om te ontsluit."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Prop \'n kopfoon in om te hoor hoe wagwoordsleutels hardop gesê word."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punt."</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 2b98607..0203d82 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"ካሜራ"</string>
<string name="description_target_silent" msgid="893551287746522182">"ፀጥታ"</string>
<string name="description_target_soundon" msgid="30052466675500172">"ድምፅ አብራ"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"ላለመቆለፍ አንሸራት፡፡"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"የይለፍ ቃል ቁልፎች ሲነገሩ ለመስማት የጆሮ ማዳመጫ ሰካ።"</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ነጥብ."</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 9c3ef5e..f0800c0 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"الكاميرا"</string>
<string name="description_target_silent" msgid="893551287746522182">"صامت"</string>
<string name="description_target_soundon" msgid="30052466675500172">"تشغيل الصوت"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"مرر بسرعة لإلغاء التأمين."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"يمكنك توصيل سماعة رأس لسماع مفاتيح كلمة المرور عندما يتم نطقها."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"نقطة"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index dcb8f05..b286a25 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
<string name="description_target_silent" msgid="893551287746522182">"Ціхі рэжым"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Гук уключаны"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Прагартайце, каб разблакаваць."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Каб праслухаць паролi, падключыце гарнiтуру."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Кропка."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index cee54b4..81a75bd 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
<string name="description_target_silent" msgid="893551287746522182">"Тих режим"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Включване на звука"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Прокарайте пръст, за да отключите."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Включете слушалки, за да чуете изговарянето на клавишите за паролата."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Точка."</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index e360af1..365e63a 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Càmera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silenci"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Activa el so"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Llisca el dit per desbloquejar."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Connecta un auricular per escoltar les claus de la contrasenya en veu alta."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punt."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index ea206b0..d95feaa 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Fotoaparát"</string>
<string name="description_target_silent" msgid="893551287746522182">"Tichý"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Zapnout zvuk"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Odemknete posunutím prstu."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Chcete-li slyšet, které klávesy jste při zadávání hesla stiskli, připojte sluchátka."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Tečka."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 94c2999..3560e3d 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Lydløs"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Lyd slået til"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Glid hurtigt henover for at låse op."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Tilslut et headset for at høre tasterne blive læst højt ved angivelse af adgangskode."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punktum."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 82a60d2..66b87c0 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Lautlos"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Ton ein"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Zum Entsperren den Finger über den Bildschirm ziehen"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Schließen Sie ein Headset an, um das Passwort gesprochen zu hören."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punkt."</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index b9710e5..942a40a 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Φωτογραφική μηχανή"</string>
<string name="description_target_silent" msgid="893551287746522182">"Αθόρυβο"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Ενεργοποίηση ήχου"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Σύρετε για ξεκλείδωμα."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Συνδέστε ακουστικά για να ακούσετε τα πλήκτρα του κωδικού πρόσβασης να εκφωνούνται."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Τελεία."</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index c41f2be..fa767ff 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silent"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Sound on"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Swipe to unlock."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Plug in a headset to hear password keys spoken."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 19e8e25..5c7b782 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Cámara"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Sonido activado"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Desliza el dedo para desbloquear."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conecta un auricular para escuchar las contraseñas."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punto"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index c732ab9..e863aba 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Cámara"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silencio"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Sonido activado"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Desliza el dedo para desbloquear."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conecta un auricular para escuchar las contraseñas."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punto"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 890dd7b..5303a13 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kaamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Hääletu"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Heli on sees"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Avamiseks tõmmake sõrmega."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Paroolide kuulamiseks ühendage peakomplekt."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punkt."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index ce26f1e..92cb595 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"دوربین"</string>
<string name="description_target_silent" msgid="893551287746522182">"ساکت"</string>
<string name="description_target_soundon" msgid="30052466675500172">"صدا روشن"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"برای بازگشایی قفل، بلغزانید."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"برای شنیدن کلیدهای گذرواژه که با صدای بلند خوانده می‌شوند، هدست را وصل کنید."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"نقطه."</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 54e1a1b..e3db295 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Äänetön"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Ääni käytössä"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Poista lukitus liu\'uttamalla."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Liitä kuulokkeet kuullaksesi, mitä näppäimiä painat kirjoittaessasi salasanaa."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Piste."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index d4a6f5b..60eed61 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Appareil photo"</string>
<string name="description_target_silent" msgid="893551287746522182">"Mode silencieux"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Son activé"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Faites glisser votre doigt pour déverrouiller l\'appareil."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Branchez des écouteurs pour entendre l\'énoncé des touches lors de la saisie du mot de passe."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Point."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index d84915e..5120648 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"कैमरा"</string>
<string name="description_target_silent" msgid="893551287746522182">"मौन"</string>
<string name="description_target_soundon" msgid="30052466675500172">"ध्‍वनि चालू करें"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"अनलॉक करने के लिए स्‍वाइप करें."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"बोली गईं पासवर्ड कुंजियां सुनने के लिए हेडसेट प्‍लग इन करें."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"बिंदु."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index b0ebc8a..b00cbab 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Fotoaparat"</string>
<string name="description_target_silent" msgid="893551287746522182">"Bešumno"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Zvuk je uključen"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Prijeđite prstima da biste otključali."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Priključite slušalice kako biste čuli izgovaranje tipki zaporke."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Točka."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 5e3464d..25a8d2a 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Némítás"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Hang bekapcsolása"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"A feloldásához húzza végig az ujját."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Csatlakoztasson egy fülhallgatót, ha hallani szeretné a jelszó betűit felolvasva."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Pont."</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 4fb25c1..0fa59fc 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Senyap"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Suara hidup"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Gesek untuk membuka kunci."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Pasang headset untuk mendengar tombol sandi yang diucapkan."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Titik."</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 7f399be..fc9ab19 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Fotocamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silenzioso"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Audio attivato"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Fai scorrere per sbloccare."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Collega gli auricolari per ascoltare la pronuncia dei tasti premuti per la password."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punto."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index b03207d..c8d1d6b 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"מצלמה"</string>
<string name="description_target_silent" msgid="893551287746522182">"שקט"</string>
<string name="description_target_soundon" msgid="30052466675500172">"הקול פועל"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"החלק לביטול נעילה."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"חבר אוזניות כדי לשמוע הקראה של מפתחות סיסמה."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"נקודה."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 526535f..5d3e1c6 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"カメラ"</string>
<string name="description_target_silent" msgid="893551287746522182">"マナーモード"</string>
<string name="description_target_soundon" msgid="30052466675500172">"サウンドON"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"ロック解除するにはスワイプします。"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"パスワードのキーが音声出力されるのでヘッドセットを接続してください。"</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ドット。"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index b38b988..6be9465 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"카메라"</string>
<string name="description_target_silent" msgid="893551287746522182">"무음"</string>
<string name="description_target_soundon" msgid="30052466675500172">"사운드 켜기"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"스와이프하여 잠급니다."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"비밀번호 키를 음성으로 들으려면 헤드셋을 연결하세요."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"점"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 4d67940..da81e3e 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Vaizdo kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Begarsis"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Garsas įjungtas"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Perbraukite pirštu, kad atrakintumėte."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Prijunkite ausines, kad išgirstumėte sakomus slaptažodžio klavišus."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Taškas."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 12a0e58..5489714 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Klusums"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Skaņa ieslēgta"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Velciet ar pirkstu, lai atbloķētu."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Pievienojiet austiņas, lai dzirdētu paroles taustiņu nosaukumus."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punkts."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f725896..da9ca41 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Senyap"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Bunyi dihidupkan"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Leret untuk membuka kunci."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Pasangkan set kepala untuk mendengar kekunci kata laluan disebutkan."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Titik."</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 8bc9dab..28fc1a8 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Stille"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Lyd på"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Sveip for å låse opp."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Koble til hodetelefoner for å høre opplesing av bokstavene i passordet."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punktum."</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 61f08e0..51e62e8 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Stil"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Geluid aan"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Vegen om te ontgrendelen"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Sluit een headset aan om wachtwoordtoetsen te laten voorlezen."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Stip."</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 77f8adc..ee10502 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Aparat"</string>
<string name="description_target_silent" msgid="893551287746522182">"Wyciszenie"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Włącz dźwięk"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Przesuń, aby odblokować."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Podłącz zestaw słuchawkowy, aby wysłuchać znaków hasła wypowiadanych na głos."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Kropka"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 2a3e2b9..290ae19 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Câmara"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Som ativado"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Deslizar rapidamente para desbloquear."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Ligue os auscultadores com microfone integrado para ouvir as teclas da palavra-passe."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Ponto."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 88b7a57..09fe685 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Câmera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Som ativado"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Deslize para desbloquear."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conecte um fone de ouvido para ouvir as teclas da senha."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Ponto final."</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 75c5c7e..f4bc105 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -1834,6 +1834,8 @@
<skip />
<!-- no translation found for description_target_soundon (30052466675500172) -->
<skip />
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<!-- no translation found for description_target_unlock_tablet (3833195335629795055) -->
<skip />
<!-- no translation found for keyboard_headset_required_to_hear_password (7011927352267668657) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 5409290..9dee72d 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Cameră foto"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silenţios"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Sunet activat"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Glisaţi pentru a debloca."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Conectaţi un set căşti-microfon pentru a auzi tastele apăsate când introduceţi parola."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punct."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 9d8e4a6..97391bf 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
<string name="description_target_silent" msgid="893551287746522182">"Без звука"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Включить звук"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Проведите по экрану, чтобы разблокировать устройство."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Подключите гарнитуру, чтобы услышать пароль."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Точка"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index ca80f6b..c7c7b4f 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Fotoaparát"</string>
<string name="description_target_silent" msgid="893551287746522182">"Tichý"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Zapnúť zvuk"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Posunom odomknúť."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Ak si chcete vypočuť vyslovené klávesy hesla, pripojte náhlavnú súpravu."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Bodka."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index e664d9c..4dc425b 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Fotoaparat"</string>
<string name="description_target_silent" msgid="893551287746522182">"Tiho"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Vklopljen zvok"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Povlecite, če želite odkleniti."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Priključite slušalke, če želite slišati izgovorjene tipke gesla."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Pika."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 4a3839b..da7a0f2 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
<string name="description_target_silent" msgid="893551287746522182">"Нечујно"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Укључи звук"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Превуците да бисте откључали."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Прикључите слушалице да бисте чули изговорене тастере за лозинку."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Тачка."</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 7ba32ce..1c916f9 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Tyst"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Ljud på"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Lås upp genom att dra."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Anslut mikrofonlurar om du vill att lösenordet ska läsas upp."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punkt."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 1744095..6b64163 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Kimya"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Sauti imewashwa"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Pitisha ili kufungua."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Chomeka kifaa cha sauti ili kusikiliza vibonye vya nenosiri vikizungumzwa."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nukta."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 32281b5..88fc3b6 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"กล้องถ่ายรูป"</string>
<string name="description_target_silent" msgid="893551287746522182">"ปิดเสียง"</string>
<string name="description_target_soundon" msgid="30052466675500172">"เปิดเสียง"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"กวาดเพื่อปลดล็อก"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"เสียบชุดหูฟังเพื่อฟังเสียงเมื่อพิมพ์รหัสผ่าน"</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"เครื่องหมายจุด"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index fd88fc1..2addf86 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Tahimik"</string>
<string name="description_target_soundon" msgid="30052466675500172">"I-on ang tunog"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Mag-swipe upang i-unlock."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Mag-plug in ng isang headset upang marinig ang mga password key na binabanggit."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dot."</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 251e47c..7c01fa3 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Sessiz"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Ses açık"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Kilidi açmak için kaydırın."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Şifre tuşlarının sesli okunmasını dinlemek için mikrofonlu kulaklık takın."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nokta."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 9054295..4b3fb11 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
<string name="description_target_silent" msgid="893551287746522182">"Без звуку"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Увімкнути звук"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Гортайте, щоб розблокувати."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Підключіть гарнітуру, щоб прослухати відтворені вголос символи пароля."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Крапка."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 609452d..faa0092 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Máy ảnh"</string>
<string name="description_target_silent" msgid="893551287746522182">"Im lặng"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Bật âm thanh"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Trượt để mở khóa."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Cắm tai nghe để nghe các khóa mật khẩu được đọc."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Dấu chấm."</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 5a9cadc..9418e38 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"相机"</string>
<string name="description_target_silent" msgid="893551287746522182">"静音"</string>
<string name="description_target_soundon" msgid="30052466675500172">"打开声音"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"滑动解锁。"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"需要插入耳机才能听到密码的按键声。"</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"点。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index aa8eda1..57d3f7e 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"相機"</string>
<string name="description_target_silent" msgid="893551287746522182">"靜音"</string>
<string name="description_target_soundon" msgid="30052466675500172">"開啟音效"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"滑動即可解鎖。"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"連接耳機即可聽取系統朗讀密碼按鍵。"</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"點。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 200bbea..6fe919d 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1230,6 +1230,8 @@
<string name="description_target_camera" msgid="969071997552486814">"Ikhamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Thulile"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Umsindo uvuliwe"</string>
+ <!-- no translation found for description_target_search (3091587249776033139) -->
+ <skip />
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Swayipha ukuze uvule."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Plaka ku-headset ukuze uzwe okhiye bephasiwedi ezindlebeni zakho bezwakala kakhulu."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Icashazi."</string>
diff --git a/docs/html/guide/topics/ui/accessibility/apps.jd b/docs/html/guide/topics/ui/accessibility/apps.jd
index ff34be6..dc91638 100644
--- a/docs/html/guide/topics/ui/accessibility/apps.jd
+++ b/docs/html/guide/topics/ui/accessibility/apps.jd
@@ -111,7 +111,7 @@ English language interface:</p>
<p>By including the description, speech-based accessibility services can announce "Add note" when a
user moves focus to this button or hovers over it.</p>
-<p class="note">Note: For {@link android.widget.EditText} fields, provide an
+<p class="note"><strong>Note:</strong> For {@link android.widget.EditText} fields, provide an
<a href="{@docRoot}reference/android/widget/TextView.html#attr_android:hint">android:hint</a>
attribute to help users understand what content is expected.</p>
@@ -119,8 +119,10 @@ attribute to help users understand what content is expected.</p>
<p>Focus navigation allows users with disabilities to step through user interface controls using a
directional controller. Directional controllers can be physical, such as a clickable trackball,
-directional pad (D-Pad) or arrow keys, tab key navigation with an attached keyboard or a software
-application that provides an on-screen directional control.</p>
+directional pad (D-pad) or arrow keys, tab key navigation with an attached keyboard or a software
+application, such as the
+<a href="https://play.google.com/store/apps/details?id=com.googlecode.eyesfree.inputmethod.latin">
+Eyes-Free Keyboard</a>, that provides an on-screen directional control.</p>
<p>A directional controller is a primary means of navigation for many users.
Verify that all user interface (UI) controls in your application are accessible
@@ -566,5 +568,7 @@ option is not available.</p>
<p>As part of your accessibility testing, you can test navigation of your application using focus,
even if your test devices does not have a directional controller. The <a
href="{@docRoot}guide/developing/tools/emulator.html">Android Emulator</a> provides a
-simulated directional controller that you can easily use to test navigation. You can also use the
-arrow keys and Enter key on your keyboard with the Emulator to simulate use of a D-pad.</p>
+simulated directional controller that you can easily use to test navigation. You can also use a
+software-based directional controller, such as the one provided by the
+<a href="https://play.google.com/store/apps/details?id=com.googlecode.eyesfree.inputmethod.latin">
+Eyes-Free Keyboard</a> to simulate use of a D-pad.</p>
diff --git a/include/androidfw/Input.h b/include/androidfw/Input.h
index a4ebd95..f8cbdde 100644
--- a/include/androidfw/Input.h
+++ b/include/androidfw/Input.h
@@ -811,6 +811,31 @@ private:
VelocityTracker mVelocityTracker;
};
+/*
+ * Identifies a device.
+ */
+struct InputDeviceIdentifier {
+ inline InputDeviceIdentifier() :
+ bus(0), vendor(0), product(0), version(0) {
+ }
+
+ // Information provided by the kernel.
+ String8 name;
+ String8 location;
+ String8 uniqueId;
+ uint16_t bus;
+ uint16_t vendor;
+ uint16_t product;
+ uint16_t version;
+
+ // A composite input device descriptor string that uniquely identifies the device
+ // even across reboots or reconnections. The value of this field is used by
+ // upper layers of the input system to associate settings with individual devices.
+ // It is hashed from whatever kernel provided information is available.
+ // Ideally, the way this value is computed should not change between Android releases
+ // because that would invalidate persistent settings that rely on it.
+ String8 descriptor;
+};
/*
* Describes the characteristics and capabilities of an input device.
@@ -830,10 +855,11 @@ public:
float fuzz;
};
- void initialize(int32_t id, const String8& name);
+ void initialize(int32_t id, const String8& name, const String8& descriptor);
inline int32_t getId() const { return mId; }
inline const String8 getName() const { return mName; }
+ inline const String8 getDescriptor() const { return mDescriptor; }
inline uint32_t getSources() const { return mSources; }
const MotionRange* getMotionRange(int32_t axis, uint32_t source) const;
@@ -856,6 +882,7 @@ public:
private:
int32_t mId;
String8 mName;
+ String8 mDescriptor;
uint32_t mSources;
int32_t mKeyboardType;
String8 mKeyCharacterMapFile;
@@ -863,23 +890,6 @@ private:
Vector<MotionRange> mMotionRanges;
};
-/*
- * Identifies a device.
- */
-struct InputDeviceIdentifier {
- inline InputDeviceIdentifier() :
- bus(0), vendor(0), product(0), version(0) {
- }
-
- String8 name;
- String8 location;
- String8 uniqueId;
- uint16_t bus;
- uint16_t vendor;
- uint16_t product;
- uint16_t version;
-};
-
/* Types of input device configuration files. */
enum InputDeviceConfigurationFileType {
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0, /* .idc file */
diff --git a/libs/androidfw/Input.cpp b/libs/androidfw/Input.cpp
index da57839..2e4b26f 100644
--- a/libs/androidfw/Input.cpp
+++ b/libs/androidfw/Input.cpp
@@ -1226,21 +1226,24 @@ void VelocityControl::move(nsecs_t eventTime, float* deltaX, float* deltaY) {
// --- InputDeviceInfo ---
InputDeviceInfo::InputDeviceInfo() {
- initialize(-1, String8("uninitialized device info"));
+ initialize(-1, String8("uninitialized device info"), String8("unknown"));
}
InputDeviceInfo::InputDeviceInfo(const InputDeviceInfo& other) :
- mId(other.mId), mName(other.mName), mSources(other.mSources),
+ mId(other.mId), mName(other.mName), mDescriptor(other.mDescriptor),
+ mSources(other.mSources),
mKeyboardType(other.mKeyboardType),
+ mKeyCharacterMapFile(other.mKeyCharacterMapFile),
mMotionRanges(other.mMotionRanges) {
}
InputDeviceInfo::~InputDeviceInfo() {
}
-void InputDeviceInfo::initialize(int32_t id, const String8& name) {
+void InputDeviceInfo::initialize(int32_t id, const String8& name, const String8& descriptor) {
mId = id;
mName = name;
+ mDescriptor = descriptor;
mSources = 0;
mKeyboardType = AINPUT_KEYBOARD_TYPE_NONE;
mMotionRanges.clear();
diff --git a/libs/storage/Android.mk b/libs/storage/Android.mk
index b42c34f..7a9dd6c 100644
--- a/libs/storage/Android.mk
+++ b/libs/storage/Android.mk
@@ -7,10 +7,6 @@ LOCAL_SRC_FILES:= \
IObbActionListener.cpp \
IMountService.cpp
-LOCAL_STATIC_LIBRARIES := \
- libutils \
- libbinder
-
LOCAL_MODULE:= libstorage
include $(BUILD_STATIC_LIBRARY)
diff --git a/obex/MODULE_LICENSE_BSD_LIKE b/obex/MODULE_LICENSE_BSD_LIKE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/obex/MODULE_LICENSE_BSD_LIKE
diff --git a/obex/NOTICE b/obex/NOTICE
new file mode 100644
index 0000000..92e8e59
--- /dev/null
+++ b/obex/NOTICE
@@ -0,0 +1,29 @@
+Copyright (c) 2008-2009, Motorola, Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+- Neither the name of the Motorola, Inc. nor the names of its contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp
index 1b74aa6..665d711 100644
--- a/services/input/EventHub.cpp
+++ b/services/input/EventHub.cpp
@@ -40,6 +40,7 @@
#include <androidfw/KeyCharacterMap.h>
#include <androidfw/VirtualKeyMap.h>
+#include <sha1.h>
#include <string.h>
#include <stdint.h>
#include <dirent.h>
@@ -78,6 +79,20 @@ static inline const char* toString(bool value) {
return value ? "true" : "false";
}
+static String8 sha1(const String8& in) {
+ SHA1_CTX ctx;
+ SHA1Init(&ctx);
+ SHA1Update(&ctx, reinterpret_cast<const u_char*>(in.string()), in.size());
+ u_char digest[SHA1_DIGEST_LENGTH];
+ SHA1Final(digest, &ctx);
+
+ String8 out;
+ for (size_t i = 0; i < SHA1_DIGEST_LENGTH; i++) {
+ out.appendFormat("%02x", digest[i]);
+ }
+ return out;
+}
+
// --- Global Functions ---
uint32_t getAbsAxisUsage(int32_t axis, uint32_t deviceClasses) {
@@ -209,11 +224,11 @@ EventHub::~EventHub(void) {
release_wake_lock(WAKE_LOCK_ID);
}
-String8 EventHub::getDeviceName(int32_t deviceId) const {
+InputDeviceIdentifier EventHub::getDeviceIdentifier(int32_t deviceId) const {
AutoMutex _l(mLock);
Device* device = getDeviceLocked(deviceId);
- if (device == NULL) return String8();
- return device->identifier.name;
+ if (device == NULL) return InputDeviceIdentifier();
+ return device->identifier;
}
uint32_t EventHub::getDeviceClasses(int32_t deviceId) const {
@@ -893,6 +908,30 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
identifier.uniqueId.setTo(buffer);
}
+ // Compute a device descriptor that uniquely identifies the device.
+ // The descriptor is assumed to be a stable identifier. Its value should not
+ // change between reboots, reconnections, firmware updates or new releases of Android.
+ // Ideally, we also want the descriptor to be short and relatively opaque.
+ String8 rawDescriptor;
+ rawDescriptor.appendFormat(":%04x:%04x:", identifier.vendor, identifier.product);
+ if (!identifier.uniqueId.isEmpty()) {
+ rawDescriptor.append("uniqueId:");
+ rawDescriptor.append(identifier.uniqueId);
+ } if (identifier.vendor == 0 && identifier.product == 0) {
+ // If we don't know the vendor and product id, then the device is probably
+ // built-in so we need to rely on other information to uniquely identify
+ // the input device. Usually we try to avoid relying on the device name or
+ // location but for built-in input device, they are unlikely to ever change.
+ if (!identifier.name.isEmpty()) {
+ rawDescriptor.append("name:");
+ rawDescriptor.append(identifier.name);
+ } else if (!identifier.location.isEmpty()) {
+ rawDescriptor.append("location:");
+ rawDescriptor.append(identifier.location);
+ }
+ }
+ identifier.descriptor = sha1(rawDescriptor);
+
// Make file descriptor non-blocking for use with poll().
if (fcntl(fd, F_SETFL, O_NONBLOCK)) {
ALOGE("Error %d making device file descriptor non-blocking.", errno);
@@ -904,19 +943,18 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {
int32_t deviceId = mNextDeviceId++;
Device* device = new Device(fd, deviceId, String8(devicePath), identifier);
-#if 0
- ALOGI("add device %d: %s\n", deviceId, devicePath);
- ALOGI(" bus: %04x\n"
- " vendor %04x\n"
- " product %04x\n"
- " version %04x\n",
+ ALOGV("add device %d: %s\n", deviceId, devicePath);
+ ALOGV(" bus: %04x\n"
+ " vendor %04x\n"
+ " product %04x\n"
+ " version %04x\n",
identifier.bus, identifier.vendor, identifier.product, identifier.version);
- ALOGI(" name: \"%s\"\n", identifier.name.string());
- ALOGI(" location: \"%s\"\n", identifier.location.string());
- ALOGI(" unique id: \"%s\"\n", identifier.uniqueId.string());
- ALOGI(" driver: v%d.%d.%d\n",
+ ALOGV(" name: \"%s\"\n", identifier.name.string());
+ ALOGV(" location: \"%s\"\n", identifier.location.string());
+ ALOGV(" unique id: \"%s\"\n", identifier.uniqueId.string());
+ ALOGV(" descriptor: \"%s\" (%s)\n", identifier.descriptor.string(), rawDescriptor.string());
+ ALOGV(" driver: v%d.%d.%d\n",
driverVersion >> 16, (driverVersion >> 8) & 0xff, driverVersion & 0xff);
-#endif
// Load the configuration file for the device.
loadConfigurationLocked(device);
@@ -1303,6 +1341,7 @@ void EventHub::dump(String8& dump) {
}
dump.appendFormat(INDENT3 "Classes: 0x%08x\n", device->classes);
dump.appendFormat(INDENT3 "Path: %s\n", device->path.string());
+ dump.appendFormat(INDENT3 "Descriptor: %s\n", device->identifier.descriptor.string());
dump.appendFormat(INDENT3 "Location: %s\n", device->identifier.location.string());
dump.appendFormat(INDENT3 "UniqueId: %s\n", device->identifier.uniqueId.string());
dump.appendFormat(INDENT3 "Identifier: bus=0x%04x, vendor=0x%04x, "
diff --git a/services/input/EventHub.h b/services/input/EventHub.h
index 4eb47c6..bd21a3d 100644
--- a/services/input/EventHub.h
+++ b/services/input/EventHub.h
@@ -151,7 +151,7 @@ public:
virtual uint32_t getDeviceClasses(int32_t deviceId) const = 0;
- virtual String8 getDeviceName(int32_t deviceId) const = 0;
+ virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const = 0;
virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const = 0;
@@ -230,7 +230,7 @@ public:
virtual uint32_t getDeviceClasses(int32_t deviceId) const;
- virtual String8 getDeviceName(int32_t deviceId) const;
+ virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const;
virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const;
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp
index eccce29..ddd870d 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -344,18 +344,19 @@ void InputReader::processEventsLocked(const RawEvent* rawEvents, size_t count) {
}
void InputReader::addDeviceLocked(nsecs_t when, int32_t deviceId) {
- String8 name = mEventHub->getDeviceName(deviceId);
+ InputDeviceIdentifier identifier = mEventHub->getDeviceIdentifier(deviceId);
uint32_t classes = mEventHub->getDeviceClasses(deviceId);
- InputDevice* device = createDeviceLocked(deviceId, name, classes);
+ InputDevice* device = createDeviceLocked(deviceId, identifier, classes);
device->configure(when, &mConfig, 0);
device->reset(when);
if (device->isIgnored()) {
- ALOGI("Device added: id=%d, name='%s' (ignored non-input device)", deviceId, name.string());
+ ALOGI("Device added: id=%d, name='%s' (ignored non-input device)", deviceId,
+ identifier.name.string());
} else {
- ALOGI("Device added: id=%d, name='%s', sources=0x%08x", deviceId, name.string(),
- device->getSources());
+ ALOGI("Device added: id=%d, name='%s', sources=0x%08x", deviceId,
+ identifier.name.string(), device->getSources());
}
ssize_t deviceIndex = mDevices.indexOfKey(deviceId);
@@ -392,8 +393,8 @@ void InputReader::removeDeviceLocked(nsecs_t when, int32_t deviceId) {
}
InputDevice* InputReader::createDeviceLocked(int32_t deviceId,
- const String8& name, uint32_t classes) {
- InputDevice* device = new InputDevice(&mContext, deviceId, name, classes);
+ const InputDeviceIdentifier& identifier, uint32_t classes) {
+ InputDevice* device = new InputDevice(&mContext, deviceId, identifier, classes);
// External devices.
if (classes & INPUT_DEVICE_CLASS_EXTERNAL) {
@@ -851,9 +852,9 @@ bool InputReaderThread::threadLoop() {
// --- InputDevice ---
-InputDevice::InputDevice(InputReaderContext* context, int32_t id, const String8& name,
- uint32_t classes) :
- mContext(context), mId(id), mName(name), mClasses(classes),
+InputDevice::InputDevice(InputReaderContext* context, int32_t id,
+ const InputDeviceIdentifier& identifier, uint32_t classes) :
+ mContext(context), mId(id), mIdentifier(identifier), mClasses(classes),
mSources(0), mIsExternal(false), mDropUntilNextSync(false) {
}
@@ -961,7 +962,7 @@ void InputDevice::process(const RawEvent* rawEvents, size_t count) {
#endif
}
} else if (rawEvent->type == EV_SYN && rawEvent->scanCode == SYN_DROPPED) {
- ALOGI("Detected input event buffer overrun for device %s.", mName.string());
+ ALOGI("Detected input event buffer overrun for device %s.", getName().string());
mDropUntilNextSync = true;
reset(rawEvent->when);
} else {
@@ -982,7 +983,7 @@ void InputDevice::timeoutExpired(nsecs_t when) {
}
void InputDevice::getDeviceInfo(InputDeviceInfo* outDeviceInfo) {
- outDeviceInfo->initialize(mId, mName);
+ outDeviceInfo->initialize(mId, mIdentifier.name, mIdentifier.descriptor);
size_t numMappers = mMappers.size();
for (size_t i = 0; i < numMappers; i++) {
diff --git a/services/input/InputReader.h b/services/input/InputReader.h
index 9bbe49c..8520a75 100644
--- a/services/input/InputReader.h
+++ b/services/input/InputReader.h
@@ -338,7 +338,7 @@ public:
protected:
// These members are protected so they can be instrumented by test cases.
virtual InputDevice* createDeviceLocked(int32_t deviceId,
- const String8& name, uint32_t classes);
+ const InputDeviceIdentifier& identifier, uint32_t classes);
class ContextImpl : public InputReaderContext {
InputReader* mReader;
@@ -432,12 +432,13 @@ private:
/* Represents the state of a single input device. */
class InputDevice {
public:
- InputDevice(InputReaderContext* context, int32_t id, const String8& name, uint32_t classes);
+ InputDevice(InputReaderContext* context, int32_t id,
+ const InputDeviceIdentifier& identifier, uint32_t classes);
~InputDevice();
inline InputReaderContext* getContext() { return mContext; }
inline int32_t getId() { return mId; }
- inline const String8& getName() { return mName; }
+ inline const String8& getName() { return mIdentifier.name; }
inline uint32_t getClasses() { return mClasses; }
inline uint32_t getSources() { return mSources; }
@@ -486,7 +487,7 @@ public:
private:
InputReaderContext* mContext;
int32_t mId;
- String8 mName;
+ InputDeviceIdentifier mIdentifier;
uint32_t mClasses;
Vector<InputMapper*> mMappers;
diff --git a/services/input/tests/InputReader_test.cpp b/services/input/tests/InputReader_test.cpp
index 08efe7d..2cccf9f 100644
--- a/services/input/tests/InputReader_test.cpp
+++ b/services/input/tests/InputReader_test.cpp
@@ -274,7 +274,7 @@ class FakeEventHub : public EventHubInterface {
};
struct Device {
- String8 name;
+ InputDeviceIdentifier identifier;
uint32_t classes;
PropertyMap configuration;
KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
@@ -287,8 +287,8 @@ class FakeEventHub : public EventHubInterface {
KeyedVector<int32_t, bool> leds;
Vector<VirtualKeyDefinition> virtualKeys;
- Device(const String8& name, uint32_t classes) :
- name(name), classes(classes) {
+ Device(uint32_t classes) :
+ classes(classes) {
}
};
@@ -307,7 +307,8 @@ public:
FakeEventHub() { }
void addDevice(int32_t deviceId, const String8& name, uint32_t classes) {
- Device* device = new Device(name, classes);
+ Device* device = new Device(classes);
+ device->identifier.name = name;
mDevices.add(deviceId, device);
enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0, 0, 0);
@@ -433,9 +434,9 @@ private:
return device ? device->classes : 0;
}
- virtual String8 getDeviceName(int32_t deviceId) const {
+ virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
Device* device = getDevice(deviceId);
- return device ? device->name : String8("unknown");
+ return device ? device->identifier : InputDeviceIdentifier();
}
virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
@@ -857,18 +858,20 @@ public:
}
InputDevice* newDevice(int32_t deviceId, const String8& name, uint32_t classes) {
- return new InputDevice(&mContext, deviceId, name, classes);
+ InputDeviceIdentifier identifier;
+ identifier.name = name;
+ return new InputDevice(&mContext, deviceId, identifier, classes);
}
protected:
virtual InputDevice* createDeviceLocked(int32_t deviceId,
- const String8& name, uint32_t classes) {
+ const InputDeviceIdentifier& identifier, uint32_t classes) {
if (mNextDevice) {
InputDevice* device = mNextDevice;
mNextDevice = NULL;
return device;
}
- return InputReader::createDeviceLocked(deviceId, name, classes);
+ return InputReader::createDeviceLocked(deviceId, identifier, classes);
}
friend class InputReaderTest;
@@ -1231,7 +1234,9 @@ protected:
mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
- mDevice = new InputDevice(mFakeContext, DEVICE_ID, String8(DEVICE_NAME), DEVICE_CLASSES);
+ InputDeviceIdentifier identifier;
+ identifier.name = DEVICE_NAME;
+ mDevice = new InputDevice(mFakeContext, DEVICE_ID, identifier, DEVICE_CLASSES);
}
virtual void TearDown() {
@@ -1411,7 +1416,9 @@ protected:
mFakePolicy = new FakeInputReaderPolicy();
mFakeListener = new FakeInputListener();
mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
- mDevice = new InputDevice(mFakeContext, DEVICE_ID, String8(DEVICE_NAME), DEVICE_CLASSES);
+ InputDeviceIdentifier identifier;
+ identifier.name = DEVICE_NAME;
+ mDevice = new InputDevice(mFakeContext, DEVICE_ID, identifier, DEVICE_CLASSES);
mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
}
diff --git a/services/java/com/android/server/AlarmManagerService.java b/services/java/com/android/server/AlarmManagerService.java
index 0574405..32ac8e1 100644
--- a/services/java/com/android/server/AlarmManagerService.java
+++ b/services/java/com/android/server/AlarmManagerService.java
@@ -34,9 +34,9 @@ import android.os.Message;
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.SystemProperties;
+import android.os.WorkSource;
import android.text.TextUtils;
import android.text.format.Time;
-import android.util.EventLog;
import android.util.Slog;
import android.util.TimeUtils;
@@ -50,6 +50,7 @@ import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.Map;
import java.util.TimeZone;
@@ -89,6 +90,7 @@ class AlarmManagerService extends IAlarmManager.Stub {
private int mDescriptor;
private int mBroadcastRefCount = 0;
private PowerManager.WakeLock mWakeLock;
+ private LinkedList<PendingIntent> mInFlight = new LinkedList<PendingIntent>();
private final AlarmThread mWaitThread = new AlarmThread();
private final AlarmHandler mHandler = new AlarmHandler();
private ClockReceiver mClockReceiver;
@@ -668,10 +670,12 @@ class AlarmManagerService extends IAlarmManager.Stub {
Intent.EXTRA_ALARM_COUNT, alarm.count),
mResultReceiver, mHandler);
- // we have an active broadcast so stay awake.
+ // we have an active broadcast so stay awake.
if (mBroadcastRefCount == 0) {
+ setWakelockWorkSource(alarm.operation);
mWakeLock.acquire();
}
+ mInFlight.add(alarm.operation);
mBroadcastRefCount++;
BroadcastStats bs = getStatsLocked(alarm.operation);
@@ -700,7 +704,22 @@ class AlarmManagerService extends IAlarmManager.Stub {
}
}
}
-
+
+ void setWakelockWorkSource(PendingIntent pi) {
+ try {
+ final int uid = ActivityManagerNative.getDefault()
+ .getUidForIntentSender(pi.getTarget());
+ if (uid >= 0) {
+ mWakeLock.setWorkSource(new WorkSource(uid));
+ return;
+ }
+ } catch (Exception e) {
+ }
+
+ // Something went wrong; fall back to attributing the lock to the OS
+ mWakeLock.setWorkSource(null);
+ }
+
private class AlarmHandler extends Handler {
public static final int ALARM_EVENT = 1;
public static final int MINUTE_CHANGE_EVENT = 2;
@@ -876,9 +895,20 @@ class AlarmManagerService extends IAlarmManager.Stub {
fs.count++;
}
}
+ mInFlight.removeFirst();
mBroadcastRefCount--;
if (mBroadcastRefCount == 0) {
mWakeLock.release();
+ } else {
+ // the next of our alarms is now in flight. reattribute the wakelock.
+ final PendingIntent nowInFlight = mInFlight.peekFirst();
+ if (nowInFlight != null) {
+ setWakelockWorkSource(nowInFlight);
+ } else {
+ // should never happen
+ Slog.e(TAG, "Alarm wakelock still held but sent queue empty");
+ mWakeLock.setWorkSource(null);
+ }
}
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 2da827e..80e59cd 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -4444,6 +4444,17 @@ public final class ActivityManagerService extends ActivityManagerNative
return null;
}
+ public int getUidForIntentSender(IIntentSender sender) {
+ if (sender instanceof PendingIntentRecord) {
+ try {
+ PendingIntentRecord res = (PendingIntentRecord)sender;
+ return res.uid;
+ } catch (ClassCastException e) {
+ }
+ }
+ return -1;
+ }
+
public boolean isIntentSenderTargetedToPackage(IIntentSender pendingResult) {
if (!(pendingResult instanceof PendingIntentRecord)) {
return false;
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index d60ff2b..a098f18 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -16,6 +16,7 @@
package com.android.server.am;
+import com.android.internal.app.ResolverActivity;
import com.android.server.AttributeCache;
import com.android.server.am.ActivityStack.ActivityState;
@@ -382,7 +383,7 @@ final class ActivityRecord {
_intent.getData() == null &&
_intent.getType() == null &&
(intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
- !"android".equals(realActivity.getClassName())) {
+ !ResolverActivity.class.getName().equals(realActivity.getClassName())) {
// This sure looks like a home activity!
// Note the last check is so we don't count the resolver
// activity as being home... really, we don't care about
diff --git a/services/jni/com_android_server_input_InputManagerService.cpp b/services/jni/com_android_server_input_InputManagerService.cpp
index 22795bf..c57402f 100644
--- a/services/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/jni/com_android_server_input_InputManagerService.cpp
@@ -95,6 +95,7 @@ static struct {
jfieldID mId;
jfieldID mName;
+ jfieldID mDescriptor;
jfieldID mSources;
jfieldID mKeyboardType;
jfieldID mKeyCharacterMapFile;
@@ -1169,12 +1170,17 @@ static jobject nativeGetInputDevice(JNIEnv* env,
}
jobject deviceObj = env->NewObject(gInputDeviceClassInfo.clazz, gInputDeviceClassInfo.ctor);
- if (! deviceObj) {
+ if (!deviceObj) {
return NULL;
}
jstring deviceNameObj = env->NewStringUTF(deviceInfo.getName().string());
- if (! deviceNameObj) {
+ if (!deviceNameObj) {
+ return NULL;
+ }
+
+ jstring deviceDescriptorObj = env->NewStringUTF(deviceInfo.getDescriptor().string());
+ if (!deviceDescriptorObj) {
return NULL;
}
@@ -1185,6 +1191,7 @@ static jobject nativeGetInputDevice(JNIEnv* env,
env->SetIntField(deviceObj, gInputDeviceClassInfo.mId, deviceInfo.getId());
env->SetObjectField(deviceObj, gInputDeviceClassInfo.mName, deviceNameObj);
+ env->SetObjectField(deviceObj, gInputDeviceClassInfo.mDescriptor, deviceDescriptorObj);
env->SetIntField(deviceObj, gInputDeviceClassInfo.mSources, deviceInfo.getSources());
env->SetIntField(deviceObj, gInputDeviceClassInfo.mKeyboardType, deviceInfo.getKeyboardType());
env->SetObjectField(deviceObj, gInputDeviceClassInfo.mKeyCharacterMapFile, fileStr);
@@ -1445,6 +1452,9 @@ int register_android_server_InputManager(JNIEnv* env) {
GET_FIELD_ID(gInputDeviceClassInfo.mName, gInputDeviceClassInfo.clazz,
"mName", "Ljava/lang/String;");
+ GET_FIELD_ID(gInputDeviceClassInfo.mDescriptor, gInputDeviceClassInfo.clazz,
+ "mDescriptor", "Ljava/lang/String;");
+
GET_FIELD_ID(gInputDeviceClassInfo.mSources, gInputDeviceClassInfo.clazz,
"mSources", "I");