diff options
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"); |