Merge "Fix DocumentsUI error-reporting code for handling copy errors."
diff --git a/Android.mk b/Android.mk
index 40da134..e84b683 100644
--- a/Android.mk
+++ b/Android.mk
@@ -160,6 +160,7 @@
core/java/android/hardware/fingerprint/IFingerprintDaemon.aidl \
core/java/android/hardware/fingerprint/IFingerprintDaemonCallback.aidl \
core/java/android/hardware/fingerprint/IFingerprintService.aidl \
+ core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl \
core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl \
core/java/android/hardware/hdmi/IHdmiControlCallback.aidl \
core/java/android/hardware/hdmi/IHdmiControlService.aidl \
diff --git a/api/current.txt b/api/current.txt
index e9c5727..b296672 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -9663,12 +9663,14 @@
method public int diff(android.content.res.Configuration);
method public boolean equals(android.content.res.Configuration);
method public int getLayoutDirection();
+ method public android.util.LocaleList getLocales();
method public boolean isLayoutSizeAtLeast(int);
method public boolean isScreenRound();
method public static boolean needNewResources(int, int);
method public void readFromParcel(android.os.Parcel);
method public void setLayoutDirection(java.util.Locale);
method public void setLocale(java.util.Locale);
+ method public void setLocales(android.util.LocaleList);
method public void setTo(android.content.res.Configuration);
method public void setToDefaults();
method public int updateFrom(android.content.res.Configuration);
@@ -9742,7 +9744,7 @@
field public int hardKeyboardHidden;
field public int keyboard;
field public int keyboardHidden;
- field public java.util.Locale locale;
+ field public deprecated java.util.Locale locale;
field public int mcc;
field public int mnc;
field public int navigation;
@@ -18164,6 +18166,7 @@
method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(int);
method public android.mtp.MtpObjectInfo.Builder setKeywords(java.lang.String);
method public android.mtp.MtpObjectInfo.Builder setName(java.lang.String);
+ method public android.mtp.MtpObjectInfo.Builder setObjectHandle(int);
method public android.mtp.MtpObjectInfo.Builder setParent(int);
method public android.mtp.MtpObjectInfo.Builder setProtectionStatus(int);
method public android.mtp.MtpObjectInfo.Builder setSequenceNumber(int);
@@ -34200,11 +34203,15 @@
public final class LocaleList {
ctor public LocaleList();
+ ctor public LocaleList(java.util.Locale);
ctor public LocaleList(java.util.Locale[]);
+ method public static android.util.LocaleList forLanguageTags(java.lang.String);
method public java.util.Locale get(int);
+ method public static android.util.LocaleList getEmptyLocaleList();
method public java.util.Locale getPrimary();
method public boolean isEmpty();
method public int size();
+ method public java.lang.String toLanguageTags();
}
public final class Log {
diff --git a/api/system-current.txt b/api/system-current.txt
index e234970..7cc66cf 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -10000,12 +10000,14 @@
method public int diff(android.content.res.Configuration);
method public boolean equals(android.content.res.Configuration);
method public int getLayoutDirection();
+ method public android.util.LocaleList getLocales();
method public boolean isLayoutSizeAtLeast(int);
method public boolean isScreenRound();
method public static boolean needNewResources(int, int);
method public void readFromParcel(android.os.Parcel);
method public void setLayoutDirection(java.util.Locale);
method public void setLocale(java.util.Locale);
+ method public void setLocales(android.util.LocaleList);
method public void setTo(android.content.res.Configuration);
method public void setToDefaults();
method public int updateFrom(android.content.res.Configuration);
@@ -10079,7 +10081,7 @@
field public int hardKeyboardHidden;
field public int keyboard;
field public int keyboardHidden;
- field public java.util.Locale locale;
+ field public deprecated java.util.Locale locale;
field public int mcc;
field public int mnc;
field public int navigation;
@@ -19676,6 +19678,7 @@
method public android.mtp.MtpObjectInfo.Builder setImagePixWidth(int);
method public android.mtp.MtpObjectInfo.Builder setKeywords(java.lang.String);
method public android.mtp.MtpObjectInfo.Builder setName(java.lang.String);
+ method public android.mtp.MtpObjectInfo.Builder setObjectHandle(int);
method public android.mtp.MtpObjectInfo.Builder setParent(int);
method public android.mtp.MtpObjectInfo.Builder setProtectionStatus(int);
method public android.mtp.MtpObjectInfo.Builder setSequenceNumber(int);
@@ -36494,11 +36497,15 @@
public final class LocaleList {
ctor public LocaleList();
+ ctor public LocaleList(java.util.Locale);
ctor public LocaleList(java.util.Locale[]);
+ method public static android.util.LocaleList forLanguageTags(java.lang.String);
method public java.util.Locale get(int);
+ method public static android.util.LocaleList getEmptyLocaleList();
method public java.util.Locale getPrimary();
method public boolean isEmpty();
method public int size();
+ method public java.lang.String toLanguageTags();
}
public final class Log {
diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java
index 5b88c8e..16f825d 100644
--- a/core/java/android/animation/AnimatorSet.java
+++ b/core/java/android/animation/AnimatorSet.java
@@ -408,15 +408,18 @@
/**
* Returns true if any of the child animations of this AnimatorSet have been started and have
- * not yet ended.
- * @return Whether this AnimatorSet has been started and has not yet ended.
+ * not yet ended. Child animations will not be started until the AnimatorSet has gone past
+ * its initial delay set through {@link #setStartDelay(long)}.
+ *
+ * @return Whether this AnimatorSet has gone past the initial delay, and at least one child
+ * animation has been started and not yet ended.
*/
@Override
public boolean isRunning() {
int size = mNodes.size();
for (int i = 0; i < size; i++) {
Node node = mNodes.get(i);
- if (node != mRootNode && node.mAnimation.isRunning()) {
+ if (node != mRootNode && node.mAnimation.isStarted()) {
return true;
}
}
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 3b026d2..132ffef 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -2196,6 +2196,7 @@
fragment.mTag = tag;
fragment.mInLayout = true;
fragment.mFragmentManager = this;
+ fragment.mHost = mHost;
fragment.onInflate(mHost.getContext(), attrs, fragment.mSavedFragmentState);
addFragment(fragment, true);
} else if (fragment.mInLayout) {
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 1605b3e..3187984 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -154,6 +154,7 @@
* @param displayId display Id.
* @param overrideConfiguration override configurations.
* @param compatInfo the compatibility info. Must not be null.
+ * @param classLoader the class loader for the resource package
*/
Resources getTopLevelResources(String resDir, String[] splitResDirs,
String[] overlayDirs, String[] libDirs, int displayId,
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 6feb860..914945b 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -531,12 +531,14 @@
/**
* String retrieved from the seinfo tag found in selinux policy. This value
- * is useful in setting an SELinux security context on the process as well
- * as its data directory.
+ * can be overridden with a value set through the mac_permissions.xml policy
+ * construct. This value is useful in setting an SELinux security context on
+ * the process as well as its data directory. The String default is being used
+ * here to represent a catchall label when no policy matches.
*
* {@hide}
*/
- public String seinfo;
+ public String seinfo = "default";
/**
* Paths to all shared libraries this application is linked against. This
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index fd60476..3ecbaa0 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -22,11 +22,13 @@
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
+import android.annotation.Nullable;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
+import android.util.LocaleList;
import android.view.View;
import java.io.IOException;
@@ -36,7 +38,7 @@
/**
* This class describes all device configuration information that can
* impact the resources the application retrieves. This includes both
- * user-specified configuration options (locale and scaling) as well
+ * user-specified configuration options (locale list and scaling) as well
* as device configurations (such as input modes, screen size and screen orientation).
* <p>You can acquire this object from {@link Resources}, using {@link
* Resources#getConfiguration}. Thus, from an activity, you can get it by chaining the request
@@ -78,8 +80,13 @@
* Current user preference for the locale, corresponding to
* <a href="{@docRoot}guide/topics/resources/providing-resources.html#LocaleQualifier">locale</a>
* resource qualifier.
+ *
+ * @deprecated Do not set or read this directly. Use {@link #getLocales()} and
+ * {@link #setLocales(LocaleList)}.
*/
- public Locale locale;
+ @Deprecated public Locale locale;
+
+ private LocaleList mLocaleList;
/**
* Locale should persist on setting. This is hidden because it is really
@@ -648,6 +655,15 @@
setTo(o);
}
+ /* This brings mLocaleList in sync with locale in case a user of the older API who doesn't know
+ * about setLocales() has changed locale directly. */
+ private void fixUpLocaleList() {
+ if ((locale == null && !mLocaleList.isEmpty()) ||
+ (locale != null && !locale.equals(mLocaleList.getPrimary()))) {
+ mLocaleList = new LocaleList(locale);
+ }
+ }
+
public void setTo(Configuration o) {
fontScale = o.fontScale;
mcc = o.mcc;
@@ -655,6 +671,8 @@
if (o.locale != null) {
locale = (Locale) o.locale.clone();
}
+ o.fixUpLocaleList();
+ mLocaleList = o.mLocaleList;
userSetLocale = o.userSetLocale;
touchscreen = o.touchscreen;
keyboard = o.keyboard;
@@ -692,11 +710,12 @@
} else {
sb.append("?mnc");
}
- if (locale != null) {
+ fixUpLocaleList();
+ if (!mLocaleList.isEmpty()) {
sb.append(" ");
- sb.append(locale);
+ sb.append(mLocaleList);
} else {
- sb.append(" ?locale");
+ sb.append(" ?localeList");
}
int layoutDir = (screenLayout&SCREENLAYOUT_LAYOUTDIR_MASK);
switch (layoutDir) {
@@ -819,6 +838,7 @@
public void setToDefaults() {
fontScale = 1;
mcc = mnc = 0;
+ mLocaleList = LocaleList.getEmptyLocaleList();
locale = null;
userSetLocale = false;
touchscreen = TOUCHSCREEN_UNDEFINED;
@@ -864,16 +884,20 @@
changed |= ActivityInfo.CONFIG_MNC;
mnc = delta.mnc;
}
- if (delta.locale != null
- && (locale == null || !locale.equals(delta.locale))) {
+ fixUpLocaleList();
+ delta.fixUpLocaleList();
+ if (!delta.mLocaleList.isEmpty() && !mLocaleList.equals(delta.mLocaleList)) {
changed |= ActivityInfo.CONFIG_LOCALE;
- locale = delta.locale != null
- ? (Locale) delta.locale.clone() : null;
- // If locale has changed, then layout direction is also changed ...
- changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION;
- // ... and we need to update the layout direction (represented by the first
- // 2 most significant bits in screenLayout).
- setLayoutDirection(locale);
+ mLocaleList = delta.mLocaleList;
+ // delta.locale can't be null, since delta.mLocaleList is not empty.
+ if (!delta.locale.equals(locale)) {
+ locale = (Locale) delta.locale.clone();
+ // If locale has changed, then layout direction is also changed ...
+ changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION;
+ // ... and we need to update the layout direction (represented by the first
+ // 2 most significant bits in screenLayout).
+ setLayoutDirection(locale);
+ }
}
final int deltaScreenLayoutDir = delta.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK;
if (deltaScreenLayoutDir != SCREENLAYOUT_LAYOUTDIR_UNDEFINED &&
@@ -1023,8 +1047,9 @@
if (delta.mnc != 0 && mnc != delta.mnc) {
changed |= ActivityInfo.CONFIG_MNC;
}
- if (delta.locale != null
- && (locale == null || !locale.equals(delta.locale))) {
+ fixUpLocaleList();
+ delta.fixUpLocaleList();
+ if (!mLocaleList.equals(delta.mLocaleList)) {
changed |= ActivityInfo.CONFIG_LOCALE;
changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION;
}
@@ -1146,14 +1171,15 @@
dest.writeFloat(fontScale);
dest.writeInt(mcc);
dest.writeInt(mnc);
- if (locale == null) {
- dest.writeInt(0);
- } else {
- dest.writeInt(1);
- dest.writeString(locale.getLanguage());
- dest.writeString(locale.getCountry());
- dest.writeString(locale.getVariant());
+
+ fixUpLocaleList();
+ final int localeListSize = mLocaleList.size();
+ dest.writeInt(localeListSize);
+ for (int i = 0; i < localeListSize; ++i) {
+ final Locale l = mLocaleList.get(i);
+ dest.writeString(l.toLanguageTag());
}
+
if(userSetLocale) {
dest.writeInt(1);
} else {
@@ -1182,10 +1208,15 @@
fontScale = source.readFloat();
mcc = source.readInt();
mnc = source.readInt();
- if (source.readInt() != 0) {
- locale = new Locale(source.readString(), source.readString(),
- source.readString());
+
+ final int localeListSize = source.readInt();
+ final Locale[] localeArray = new Locale[localeListSize];
+ for (int i = 0; i < localeListSize; ++i) {
+ localeArray[i] = Locale.forLanguageTag(source.readString());
}
+ mLocaleList = new LocaleList(localeArray);
+ locale = mLocaleList.getPrimary();
+
userSetLocale = (source.readInt()==1);
touchscreen = source.readInt();
keyboard = source.readInt();
@@ -1234,18 +1265,33 @@
if (n != 0) return n;
n = this.mnc - that.mnc;
if (n != 0) return n;
- if (this.locale == null) {
- if (that.locale != null) return 1;
- } else if (that.locale == null) {
+
+ fixUpLocaleList();
+ that.fixUpLocaleList();
+ // for backward compatibility, we consider an empty locale list to be greater
+ // than any non-empty locale list.
+ if (this.mLocaleList.isEmpty()) {
+ if (!that.mLocaleList.isEmpty()) return 1;
+ } else if (that.mLocaleList.isEmpty()) {
return -1;
} else {
- n = this.locale.getLanguage().compareTo(that.locale.getLanguage());
- if (n != 0) return n;
- n = this.locale.getCountry().compareTo(that.locale.getCountry());
- if (n != 0) return n;
- n = this.locale.getVariant().compareTo(that.locale.getVariant());
+ final int minSize = Math.min(this.mLocaleList.size(), that.mLocaleList.size());
+ for (int i = 0; i < minSize; ++i) {
+ final Locale thisLocale = this.mLocaleList.get(i);
+ final Locale thatLocale = that.mLocaleList.get(i);
+ n = thisLocale.getLanguage().compareTo(thatLocale.getLanguage());
+ if (n != 0) return n;
+ n = thisLocale.getCountry().compareTo(thatLocale.getCountry());
+ if (n != 0) return n;
+ n = thisLocale.getVariant().compareTo(thatLocale.getVariant());
+ if (n != 0) return n;
+ n = thisLocale.toLanguageTag().compareTo(thatLocale.toLanguageTag());
+ if (n != 0) return n;
+ }
+ n = this.mLocaleList.size() - that.mLocaleList.size();
if (n != 0) return n;
}
+
n = this.touchscreen - that.touchscreen;
if (n != 0) return n;
n = this.keyboard - that.keyboard;
@@ -1288,13 +1334,13 @@
}
return false;
}
-
+
public int hashCode() {
int result = 17;
result = 31 * result + Float.floatToIntBits(fontScale);
result = 31 * result + mcc;
result = 31 * result + mnc;
- result = 31 * result + (locale != null ? locale.hashCode() : 0);
+ result = 31 * result + mLocaleList.hashCode();
result = 31 * result + touchscreen;
result = 31 * result + keyboard;
result = 31 * result + keyboardHidden;
@@ -1312,14 +1358,47 @@
}
/**
- * Set the locale. This is the preferred way for setting up the locale (instead of using the
- * direct accessor). This will also set the layout direction according to the locale.
+ * Get the locale list. This is the preferred way for getting the locales (instead of using
+ * the direct accessor to {@link #locale}, which would only provide the primary locale).
+ *
+ * @return The locale list.
+ */
+ public LocaleList getLocales() {
+ fixUpLocaleList();
+ return mLocaleList;
+ }
+
+ /**
+ * Set the locale list. This is the preferred way for setting up the locales (instead of using
+ * the direct accessor or {@link #setLocale(Locale)}). This will also set the layout direction
+ * according to the first locale in the list.
+ *
+ * Note that the layout direction will always come from the first locale in the locale list,
+ * even if the locale is not supported by the resources (the resources may only support
+ * another locale further down the list which has a different direction).
+ *
+ * @param locales The locale list. If null, an empty LocaleList will be assigned.
+ */
+ public void setLocales(@Nullable LocaleList locales) {
+ mLocaleList = locales == null ? LocaleList.getEmptyLocaleList() : locales;
+ locale = mLocaleList.getPrimary();
+ setLayoutDirection(locale);
+ }
+
+ /**
+ * Set the locale list to a list of just one locale. This will also set the layout direction
+ * according to the locale.
+ *
+ * Note that after this is run, calling <code>.equals()</code> on the input locale and the
+ * {@link #locale} attribute would return <code>true</code> if they are not null, but there is
+ * no guarantee that they would be the same object.
+ *
+ * See also the note about layout direction in {@link #setLocales(LocaleList)}.
*
* @param loc The locale. Can be null.
*/
- public void setLocale(Locale loc) {
- locale = loc;
- setLayoutDirection(locale);
+ public void setLocale(@Nullable Locale loc) {
+ setLocales(new LocaleList(loc));
}
/**
@@ -1335,19 +1414,19 @@
}
/**
- * Set the layout direction from the Locale.
+ * Set the layout direction from a Locale.
*
- * @param locale The Locale. If null will set the layout direction to
+ * @param loc The Locale. If null will set the layout direction to
* {@link View#LAYOUT_DIRECTION_LTR}. If not null will set it to the layout direction
* corresponding to the Locale.
*
* @see View#LAYOUT_DIRECTION_LTR
* @see View#LAYOUT_DIRECTION_RTL
*/
- public void setLayoutDirection(Locale locale) {
+ public void setLayoutDirection(Locale loc) {
// There is a "1" difference between the configuration values for
// layout direction and View constants for layout direction, just add "1".
- final int layoutDirection = 1 + TextUtils.getLayoutDirectionFromLocale(locale);
+ final int layoutDirection = 1 + TextUtils.getLayoutDirectionFromLocale(loc);
screenLayout = (screenLayout&~SCREENLAYOUT_LAYOUTDIR_MASK)|
(layoutDirection << SCREENLAYOUT_LAYOUTDIR_SHIFT);
}
@@ -1370,21 +1449,21 @@
*
* @hide
*/
- public static String localeToResourceQualifier(Locale locale) {
+ public static String localeToResourceQualifier(Locale loc) {
StringBuilder sb = new StringBuilder();
- boolean l = (locale.getLanguage().length() != 0);
- boolean c = (locale.getCountry().length() != 0);
- boolean s = (locale.getScript().length() != 0);
- boolean v = (locale.getVariant().length() != 0);
-
+ boolean l = (loc.getLanguage().length() != 0);
+ boolean c = (loc.getCountry().length() != 0);
+ boolean s = (loc.getScript().length() != 0);
+ boolean v = (loc.getVariant().length() != 0);
+ // TODO: take script and extensions into account
if (l) {
- sb.append(locale.getLanguage());
+ sb.append(loc.getLanguage());
if (c) {
- sb.append("-r").append(locale.getCountry());
+ sb.append("-r").append(loc.getCountry());
if (s) {
- sb.append("-s").append(locale.getScript());
+ sb.append("-s").append(loc.getScript());
if (v) {
- sb.append("-v").append(locale.getVariant());
+ sb.append("-v").append(loc.getVariant());
}
}
}
@@ -1409,6 +1488,7 @@
}
}
+ // TODO: send the whole locale list
if (config.locale != null && !config.locale.getLanguage().isEmpty()) {
parts.add(localeToResourceQualifier(config.locale));
}
@@ -1646,8 +1726,10 @@
delta.mnc = change.mnc;
}
- if ((base.locale == null && change.locale != null) ||
- (base.locale != null && !base.locale.equals(change.locale))) {
+ base.fixUpLocaleList();
+ change.fixUpLocaleList();
+ if (!base.mLocaleList.equals(change.mLocaleList)) {
+ delta.mLocaleList = change.mLocaleList;
delta.locale = change.locale;
}
@@ -1724,7 +1806,7 @@
private static final String XML_ATTR_FONT_SCALE = "fs";
private static final String XML_ATTR_MCC = "mcc";
private static final String XML_ATTR_MNC = "mnc";
- private static final String XML_ATTR_LOCALE = "locale";
+ private static final String XML_ATTR_LOCALES = "locales";
private static final String XML_ATTR_TOUCHSCREEN = "touch";
private static final String XML_ATTR_KEYBOARD = "key";
private static final String XML_ATTR_KEYBOARD_HIDDEN = "keyHid";
@@ -1754,10 +1836,9 @@
configOut.mcc = XmlUtils.readIntAttribute(parser, XML_ATTR_MCC, 0);
configOut.mnc = XmlUtils.readIntAttribute(parser, XML_ATTR_MNC, 0);
- final String localeStr = XmlUtils.readStringAttribute(parser, XML_ATTR_LOCALE);
- if (localeStr != null) {
- configOut.locale = Locale.forLanguageTag(localeStr);
- }
+ final String localesStr = XmlUtils.readStringAttribute(parser, XML_ATTR_LOCALES);
+ configOut.mLocaleList = LocaleList.forLanguageTags(localesStr);
+ configOut.locale = configOut.mLocaleList.getPrimary();
configOut.touchscreen = XmlUtils.readIntAttribute(parser, XML_ATTR_TOUCHSCREEN,
TOUCHSCREEN_UNDEFINED);
@@ -1807,8 +1888,9 @@
if (config.mnc != 0) {
XmlUtils.writeIntAttribute(xml, XML_ATTR_MNC, config.mnc);
}
- if (config.locale != null) {
- XmlUtils.writeStringAttribute(xml, XML_ATTR_LOCALE, config.locale.toLanguageTag());
+ config.fixUpLocaleList();
+ if (!config.mLocaleList.isEmpty()) {
+ XmlUtils.writeStringAttribute(xml, XML_ATTR_LOCALES, config.mLocaleList.toLanguageTags());
}
if (config.touchscreen != TOUCHSCREEN_UNDEFINED) {
XmlUtils.writeIntAttribute(xml, XML_ATTR_TOUCHSCREEN, config.touchscreen);
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 7cff11b..1f23c0a 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -392,6 +392,18 @@
};
/**
+ * @hide
+ */
+ public static abstract class LockoutResetCallback {
+
+ /**
+ * Called when lockout period expired and clients are allowed to listen for fingerprint
+ * again.
+ */
+ public void onLockoutReset() { }
+ };
+
+ /**
* Request authentication of a crypto object. This call warms up the fingerprint hardware
* and starts scanning for a fingerprint. It terminates when
* {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)} or
@@ -680,10 +692,37 @@
try {
mService.resetTimeout(token);
} catch (RemoteException e) {
- Log.v(TAG, "Remote exception in getAuthenticatorId(): ", e);
+ Log.v(TAG, "Remote exception in resetTimeout(): ", e);
}
} else {
- Log.w(TAG, "getAuthenticatorId(): Service not connected!");
+ Log.w(TAG, "resetTimeout(): Service not connected!");
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public void addLockoutResetCallback(final LockoutResetCallback callback) {
+ if (mService != null) {
+ try {
+ mService.addLockoutResetCallback(
+ new IFingerprintServiceLockoutResetCallback.Stub() {
+
+ @Override
+ public void onLockoutReset(long deviceId) throws RemoteException {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onLockoutReset();
+ }
+ });
+ }
+ });
+ } catch (RemoteException e) {
+ Log.v(TAG, "Remote exception in addLockoutResetCallback(): ", e);
+ }
+ } else {
+ Log.w(TAG, "addLockoutResetCallback(): Service not connected!");
}
}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 3356354..690a751 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -17,6 +17,7 @@
import android.os.Bundle;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback;
import android.hardware.fingerprint.Fingerprint;
import java.util.List;
@@ -71,4 +72,7 @@
// Reset the timeout when user authenticates with strong auth (e.g. PIN, pattern or password)
void resetTimeout(in byte [] cryptoToken);
+
+ // Add a callback which gets notified when the fingerprint lockout period expired.
+ void addLockoutResetCallback(IFingerprintServiceLockoutResetCallback callback);
}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl b/core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl
new file mode 100644
index 0000000..c9a5d59
--- /dev/null
+++ b/core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.fingerprint;
+
+import android.hardware.fingerprint.Fingerprint;
+import android.os.Bundle;
+import android.os.UserHandle;
+
+/**
+ * Callback when lockout period expired and clients are allowed to authenticate again.
+ * @hide
+ */
+oneway interface IFingerprintServiceLockoutResetCallback {
+ void onLockoutReset(long deviceId);
+}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 4ad9d6d..bad94fc 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -468,6 +468,7 @@
* @param which one of STATS_SINCE_CHARGED, STATS_SINCE_UNPLUGGED, or STATS_CURRENT.
* @see BatteryStats#getCpuSpeedSteps()
*/
+ @Deprecated
public abstract long getTimeAtCpuSpeed(int step, int which);
public static abstract class Sensor {
diff --git a/core/java/android/util/LocaleList.java b/core/java/android/util/LocaleList.java
index 017735a..afae9ac 100644
--- a/core/java/android/util/LocaleList.java
+++ b/core/java/android/util/LocaleList.java
@@ -23,8 +23,8 @@
// TODO: We don't except too many LocaleLists to exist at the same time, and
// we need access to the data at native level, so we should pass the data
-// down to the native level, create a mapt of every list seen there, take a
-// pointer back, and just keep that pointed in the Java-level object, so
+// down to the native level, create a map of every list seen there, take a
+// pointer back, and just keep that pointer in the Java-level object, so
// things could be copied very quickly.
/**
@@ -34,6 +34,7 @@
public final class LocaleList {
private final Locale[] mList;
private static final Locale[] sEmptyList = new Locale[0];
+ private static final LocaleList sEmptyLocaleList = new LocaleList();
public Locale get(int location) {
return location < mList.length ? mList[location] : null;
@@ -51,6 +52,60 @@
return mList.length;
}
+ @Override
+ public boolean equals(Object other) {
+ if (other == this)
+ return true;
+ if (!(other instanceof LocaleList))
+ return false;
+ final Locale[] otherList = ((LocaleList) other).mList;
+ if (mList.length != otherList.length)
+ return false;
+ for (int i = 0; i < mList.length; ++i) {
+ if (!mList[i].equals(otherList[i]))
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 1;
+ for (int i = 0; i < mList.length; ++i) {
+ result = 31 * result + mList[i].hashCode();
+ }
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ for (int i = 0; i < mList.length; ++i) {
+ sb.append(mList[i]);
+ if (i < mList.length - 1) {
+ sb.append(',');
+ }
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+
+ public String toLanguageTags() {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < mList.length; ++i) {
+ sb.append(mList[i].toLanguageTag());
+ if (i < mList.length - 1) {
+ sb.append(',');
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * It is almost always better to call {@link #getEmptyLocaleList()} instead which returns
+ * a pre-constructed empty locale list.
+ */
public LocaleList() {
mList = sEmptyList;
}
@@ -59,6 +114,19 @@
* @throws NullPointerException if any of the input locales is <code>null</code>.
* @throws IllegalArgumentException if any of the input locales repeat.
*/
+ public LocaleList(@Nullable Locale locale) {
+ if (locale == null) {
+ mList = sEmptyList;
+ } else {
+ mList = new Locale[1];
+ mList[0] = (Locale) locale.clone();
+ }
+ }
+
+ /**
+ * @throws NullPointerException if any of the input locales is <code>null</code>.
+ * @throws IllegalArgumentException if any of the input locales repeat.
+ */
public LocaleList(@Nullable Locale[] list) {
if (list == null || list.length == 0) {
mList = sEmptyList;
@@ -79,4 +147,21 @@
mList = localeList;
}
}
+
+ public static LocaleList getEmptyLocaleList() {
+ return sEmptyLocaleList;
+ }
+
+ public static LocaleList forLanguageTags(@Nullable String list) {
+ if (list == null || list.equals("")) {
+ return getEmptyLocaleList();
+ } else {
+ final String[] tags = list.split(",");
+ final Locale[] localeArray = new Locale[tags.length];
+ for (int i = 0; i < localeArray.length; ++i) {
+ localeArray[i] = Locale.forLanguageTag(tags[i]);
+ }
+ return new LocaleList(localeArray);
+ }
+ }
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index f86adfe..33c51ff 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -97,21 +97,21 @@
* @param launchTaskBehind True if the token is been launched from behind.
* @param taskBounds Bounds to use when creating a new Task with the input task Id if
* the task doesn't exist yet.
- * @return The configuration of the task if it was newly created. null otherwise.
+ * @param configuration Configuration that is being used with this task.
*/
- Configuration addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
+ void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int userId,
int configChanges, boolean voiceInteraction, boolean launchTaskBehind,
- in Rect taskBounds);
+ in Rect taskBounds, in Configuration configuration);
/**
*
* @param token The token we are adding to the input task Id.
* @param taskId The Id of the task we are adding the token to.
* @param taskBounds Bounds to use when creating a new Task with the input task Id if
* the task doesn't exist yet.
- * @return The configuration of the task if it was newly created. null otherwise.
+ * @param config Configuration that is being used with this task.
*/
- Configuration setAppTask(IBinder token, int taskId, in Rect taskBounds);
+ void setAppTask(IBinder token, int taskId, in Rect taskBounds, in Configuration config);
void setAppOrientation(IApplicationToken token, int requestedOrientation);
int getAppOrientation(IApplicationToken token);
void setFocusedApp(IBinder token, boolean moveFocusNow);
diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java
index f178c8c..4f4d3e0 100644
--- a/core/java/com/android/internal/os/BatteryStatsHelper.java
+++ b/core/java/com/android/internal/os/BatteryStatsHelper.java
@@ -338,7 +338,7 @@
}
if (mCpuPowerCalculator == null) {
- mCpuPowerCalculator = new CpuPowerCalculator(mPowerProfile);
+ mCpuPowerCalculator = new CpuPowerCalculator();
}
mCpuPowerCalculator.reset();
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index a3ef612..d62f7a6 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -23,54 +23,14 @@
private static final String TAG = "CpuPowerCalculator";
private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
- private final double[] mPowerCpuNormal;
-
- /**
- * Reusable array for calculations.
- */
- private final long[] mSpeedStepTimes;
-
- public CpuPowerCalculator(PowerProfile profile) {
- final int speedSteps = profile.getNumSpeedSteps();
- mPowerCpuNormal = new double[speedSteps];
- mSpeedStepTimes = new long[speedSteps];
- for (int p = 0; p < speedSteps; p++) {
- mPowerCpuNormal[p] = profile.getAveragePower(PowerProfile.POWER_CPU_ACTIVE, p);
- }
- }
-
@Override
public void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
long rawUptimeUs, int statsType) {
- final int speedSteps = mSpeedStepTimes.length;
-
- long totalTimeAtSpeeds = 0;
- for (int step = 0; step < speedSteps; step++) {
- mSpeedStepTimes[step] = u.getTimeAtCpuSpeed(step, statsType);
- totalTimeAtSpeeds += mSpeedStepTimes[step];
- }
- totalTimeAtSpeeds = Math.max(totalTimeAtSpeeds, 1);
-
app.cpuTimeMs = (u.getUserCpuTimeUs(statsType) + u.getSystemCpuTimeUs(statsType)) / 1000;
- if (DEBUG && app.cpuTimeMs != 0) {
- Log.d(TAG, "UID " + u.getUid() + ": CPU time " + app.cpuTimeMs + " ms");
- }
-
- double cpuPowerMaMs = 0;
- for (int step = 0; step < speedSteps; step++) {
- final double ratio = (double) mSpeedStepTimes[step] / totalTimeAtSpeeds;
- final double cpuSpeedStepPower = ratio * app.cpuTimeMs * mPowerCpuNormal[step];
- if (DEBUG && ratio != 0) {
- Log.d(TAG, "UID " + u.getUid() + ": CPU step #"
- + step + " ratio=" + BatteryStatsHelper.makemAh(ratio) + " power="
- + BatteryStatsHelper.makemAh(cpuSpeedStepPower / (60 * 60 * 1000)));
- }
- cpuPowerMaMs += cpuSpeedStepPower;
- }
-
- if (DEBUG && cpuPowerMaMs != 0) {
- Log.d(TAG, "UID " + u.getUid() + ": cpu total power="
- + BatteryStatsHelper.makemAh(cpuPowerMaMs / (60 * 60 * 1000)));
+ app.cpuPowerMah = (double) u.getCpuPowerMaUs(statsType) / (60.0 * 60.0 * 1000.0 * 1000.0);
+ if (DEBUG && (app.cpuTimeMs != 0 || app.cpuPowerMah != 0)) {
+ Log.d(TAG, "UID " + u.getUid() + ": CPU time=" + app.cpuTimeMs + " ms power="
+ + BatteryStatsHelper.makemAh(app.cpuPowerMah));
}
// Keep track of the package with highest drain.
@@ -108,8 +68,5 @@
// Statistics may not have been gathered yet.
app.cpuTimeMs = app.cpuFgTimeMs;
}
-
- // Convert the CPU power to mAh
- app.cpuPowerMah = cpuPowerMaMs / (60 * 60 * 1000);
}
}
diff --git a/core/java/com/android/internal/widget/AbsActionBarView.java b/core/java/com/android/internal/widget/AbsActionBarView.java
index 35eeca7..582c4f1 100644
--- a/core/java/com/android/internal/widget/AbsActionBarView.java
+++ b/core/java/com/android/internal/widget/AbsActionBarView.java
@@ -19,6 +19,7 @@
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
+import android.view.MotionEvent;
import android.widget.ActionMenuPresenter;
import android.widget.ActionMenuView;
@@ -53,6 +54,9 @@
protected Animator mVisibilityAnim;
+ private boolean mEatingTouch;
+ private boolean mEatingHover;
+
public AbsActionBarView(Context context) {
this(context, null);
}
@@ -97,6 +101,57 @@
}
}
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ // ActionBarViews always eat touch events, but should still respect the touch event dispatch
+ // contract. If the normal View implementation doesn't want the events, we'll just silently
+ // eat the rest of the gesture without reporting the events to the default implementation
+ // since that's what it expects.
+
+ final int action = ev.getActionMasked();
+ if (action == MotionEvent.ACTION_DOWN) {
+ mEatingTouch = false;
+ }
+
+ if (!mEatingTouch) {
+ final boolean handled = super.onTouchEvent(ev);
+ if (action == MotionEvent.ACTION_DOWN && !handled) {
+ mEatingTouch = true;
+ }
+ }
+
+ if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+ mEatingTouch = false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean onHoverEvent(MotionEvent ev) {
+ // Same deal as onTouchEvent() above. Eat all hover events, but still
+ // respect the touch event dispatch contract.
+
+ final int action = ev.getActionMasked();
+ if (action == MotionEvent.ACTION_HOVER_ENTER) {
+ mEatingHover = false;
+ }
+
+ if (!mEatingHover) {
+ final boolean handled = super.onHoverEvent(ev);
+ if (action == MotionEvent.ACTION_HOVER_ENTER && !handled) {
+ mEatingHover = true;
+ }
+ }
+
+ if (action == MotionEvent.ACTION_HOVER_EXIT
+ || action == MotionEvent.ACTION_CANCEL) {
+ mEatingHover = false;
+ }
+
+ return true;
+ }
+
/**
* Sets whether the bar should be split right now, no questions asked.
* @param split true if the bar should split
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 073a2ad..051845f 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -1178,7 +1178,7 @@
* @param userId either an explicit user id or {@link android.os.UserHandle#USER_ALL}
*/
public void requireCredentialEntry(int userId) {
- requireStrongAuth(StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST, userId);
+ requireStrongAuth(StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_REQUEST, userId);
}
/**
@@ -1260,7 +1260,7 @@
value = { STRONG_AUTH_NOT_REQUIRED,
STRONG_AUTH_REQUIRED_AFTER_BOOT,
STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW,
- SOME_AUTH_REQUIRED_AFTER_USER_REQUEST})
+ STRONG_AUTH_REQUIRED_AFTER_USER_REQUEST})
@Retention(RetentionPolicy.SOURCE)
public @interface StrongAuthFlags {}
@@ -1275,14 +1275,14 @@
public static final int STRONG_AUTH_REQUIRED_AFTER_BOOT = 0x1;
/**
- * Strong authentication is required because a device admin has requested it.
+ * Strong authentication is required because a device admin has temporarily requested it.
*/
public static final int STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW = 0x2;
/**
- * Some authentication is required because the user has temporarily disabled trust.
+ * Strong authentication is required because the user has temporarily requested it.
*/
- public static final int SOME_AUTH_REQUIRED_AFTER_USER_REQUEST = 0x4;
+ public static final int STRONG_AUTH_REQUIRED_AFTER_USER_REQUEST = 0x4;
/**
* Strong authentication is required because the user has been locked out after too many
@@ -1291,7 +1291,6 @@
public static final int STRONG_AUTH_REQUIRED_AFTER_LOCKOUT = 0x8;
public static final int DEFAULT = STRONG_AUTH_REQUIRED_AFTER_BOOT;
- private static final int ALLOWING_FINGERPRINT = SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
final SparseIntArray mStrongAuthRequiredForUser = new SparseIntArray();
@@ -1333,7 +1332,7 @@
* current strong authentication requirements.
*/
public boolean isFingerprintAllowedForUser(int userId) {
- return (getStrongAuthForUser(userId) & ~ALLOWING_FINGERPRINT) == 0;
+ return getStrongAuthForUser(userId) == STRONG_AUTH_NOT_REQUIRED;
}
/**
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 414cbb4..aef70be 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -83,6 +83,14 @@
pid_t pid;
int status;
+ // It's necessary to save and restore the errno during this function.
+ // Since errno is stored per thread, changing it here modifies the errno
+ // on the thread on which this signal handler executes. If a signal occurs
+ // between a call and an errno check, it's possible to get the errno set
+ // here.
+ // See b/23572286 for extra information.
+ int saved_errno = errno;
+
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
// Log process-death status that we care about. In general it is
// not safe to call LOG(...) from a signal handler because of
@@ -118,6 +126,8 @@
if (pid < 0 && errno != ECHILD) {
ALOGW("Zygote SIGCHLD error in waitpid: %s", strerror(errno));
}
+
+ errno = saved_errno;
}
// Configures the SIGCHLD handler for the zygote process. This is configured
diff --git a/core/res/res/values-af-watch/strings.xml b/core/res/res/values-af-watch/strings.xml
index 9dc98a1..ee43129 100644
--- a/core/res/res/values-af-watch/strings.xml
+++ b/core/res/res/values-af-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Program <xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensors"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"verkry toegang tot jou kontakte"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"verkry toegang tot hierdie horlosie se ligging"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"verkry toegang tot jou kalender"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"stuur en bekyk SMS-boodskappe"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"verkry toegang tot foto\'s, media en lêers op jou horlosie"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"neem oudio op"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"neem foto\'s en neem video op"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"maak en bestuur foonoproepe"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"verkry toegang tot sensordata oor jou lewenstekens"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"wees die statusbalk"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"verkry toegang tot liggaamsensors (soos hartklopmonitors)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"verkry toegang tot presiese ligging (GPS- en netwerkgegrond)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"verkry toegang tot benaderde ligging (netwerkgegrond)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"stuur bevele na die SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"verkry volle netwerktoegang"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"bestuur profiel- en toesteleienaars"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"verander WiMAX-status"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"ontvang Android Straal-oordragstatus"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"roeteer media-uitvoer"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"lees installeersessies"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"versoek installeerpakkette"</string>
</resources>
diff --git a/core/res/res/values-am-watch/strings.xml b/core/res/res/values-am-watch/strings.xml
index ebe6ae0..ee6ed57 100644
--- a/core/res/res/values-am-watch/strings.xml
+++ b/core/res/res/values-am-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g> መተግበሪያ ከ<xliff:g id="NUMBER_1">%2$d</xliff:g>።"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"አነፍናፊዎች"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"የእርስዎ እውቂያዎች ላይ ይድረሱባቸው"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"የዚህን ሰዓት መገኛ አካባቢ ይድረሱባቸው"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"የእርስዎን ቀን መቁጠሪያ ይድረሱበት"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"የኤስኤምኤስ መልዕክቶችን ይላኩና ይመልከቱ"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"በእርስዎ ሰዓት ላይ ፎቶዎችን፣ ሚዲያ እና ፋይሎችን ይድረሱባቸው"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ኦዲዮ ይቅዱ"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ስዕሎች ያንሱ እና ቪዲዮ ይቅረጹ"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"የስልክ ጥሪዎች ያድርጉ እና ያስተዳድሩ"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"ስለአስፈላጊ ምልክቶችዎ ያሉ የዳሳሽ ውሂብ ይድረሱ"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"የሁነታ አሞሌ ይሁን"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"የሰውነት ዳሳሾችን ይድረሱባቸው (እንደ የልብ ምት መከታተያዎች)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"ትክክለኛ አካባቢ ይድረሱበት (በጂ ፒ ኤስ እና አውታረ መረብ ላይ የተመሠረተ)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"ግምታዊ አካባቢን ይድረሱበት (በአውታረ መረብ ላይ የተመሰረተ)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"ወደ ሲሙ ትዕዛዞችን ላክ"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ሙሉ የአውታረ መረብ መዳረሻ"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"የመገለጫ እና የመሣሪያ ባለቤቶችን ያስተዳድሩ"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"የWiMAX ሁኔታ ይለውጡ"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"የAndroid Beam ሽግግር ሁኔታን ይቀበሉ"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"የሚዲያ ውፅአት መንገድ"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"የመጫን ክፍለ ጊዜዎችን አንብብ"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"የጭነት ጥቅሎችን ጠይቅ"</string>
</resources>
diff --git a/core/res/res/values-ar-watch/strings.xml b/core/res/res/values-ar-watch/strings.xml
index 374b665..af6a164 100644
--- a/core/res/res/values-ar-watch/strings.xml
+++ b/core/res/res/values-ar-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"التطبيق <xliff:g id="NUMBER_0">%1$d</xliff:g> من <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"أجهزة الاستشعار"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"الوصول إلى جهات الاتصال التابعة لك"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"الوصول إلى موقع هذه الساعة"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"الوصول إلى تقويمك"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"إرسال رسائل قصيرة SMS وعرضها"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"الوصول إلى الصور والوسائط والملفات على ساعتك"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"تسجيل الصوت"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"التقاط صور وتسجيل فيديو"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"إجراء مكالمات هاتفية وإدارتها"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"الوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"العمل كشريط للحالة"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"الوصول إلى أجهزة استشعار الجسم (مثل شاشات معدل ضربات القلب)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"الوصول إلى الموقع الدقيق (استنادًا إلى نظام تحديد المواقع العالمي \"GPS\" والشبكة)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"الوصول إلى الموقع التقريبي (استنادًا إلى الشبكة)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"إرسال أوامر إلى شريحة SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"حق الوصول بالكامل إلى الشبكة"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"إدارة المالكين لكل من الملف الشخصي والجهاز"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"تغيير حالة WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"تلقي حالة نقل شعاع Android"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"توجيه إخراج الوسائط"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"قراءة جلسات التثبيت"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"طلب حزم التثبيت"</string>
</resources>
diff --git a/core/res/res/values-az-rAZ-watch/strings.xml b/core/res/res/values-az-rAZ-watch/strings.xml
index cdc6a3d..5a84880 100644
--- a/core/res/res/values-az-rAZ-watch/strings.xml
+++ b/core/res/res/values-az-rAZ-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Tətbiq <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensorlar"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"kontaktlarınıza daxil olun"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"bu saatın məkanına giriş"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"təqvimə daxil olun"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"göndərin və SMS mesajlarına baxın"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"Saatınızda foto, media və fayllara daxil olun"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"səsi qeydə alın"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"şəkil çəkin və video yazın"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"telefon zəngləri edin və onları idarə edin"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"Həyati əlamətlər haqqında sensor dataya daxil olun"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"status paneli edin"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"bədən sensorlarına (ürək döyüntüsü monitorları kimi) giriş"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"dəqiq məkana (GPS və şəbəkə əsasında) giriş"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"təxmini məkana (şəbəkə əsaslı) giriş"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"əmrləri SIM\'ə göndərin"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"tam şəbəkə girişi var"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"profil və cihaz sahiblərini idarə edin"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX vəziyyətini dəyişin"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam transfer statusunu əldə edin"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"media çıxışını yönləndirin"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"quraşdırma sessiyalarını oxuyun"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"paketləri quraşdırma sorğusu"</string>
</resources>
diff --git a/core/res/res/values-bg-watch/strings.xml b/core/res/res/values-bg-watch/strings.xml
index a31f8d8..5eb2a02 100644
--- a/core/res/res/values-bg-watch/strings.xml
+++ b/core/res/res/values-bg-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Прилож. <xliff:g id="NUMBER_0">%1$d</xliff:g> от <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Сензори"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"достъп до контактите ви"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"достъп до местоположението на този часовник"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"достъп до календара ви"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"изпращане и преглед на SMS съобщения"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"достъп до снимките, мултимедията и файловете на часовника ви"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"записване на звук"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"правене на снимки и записване на видеоклипове"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"извършване и управление на телефонни обаждания"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"достъп до сензорните данни за жизнените ви показатели"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"изпълняване на ролята на лента на състоянието"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"достъп до сензорите за тяло (например пулсомери)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"достъп до точното местоположение (въз основа на GPS и мрежата)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"достъп до приблизителното местоположение (въз основа на мрежата)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"изпращане на команди до SIM картата"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"пълен достъп до мрежата"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"управление на собствениците на потребителските профили и устройствата"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"промяна на състоянието на WiMAX мрежата"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"получаване на състоянието на прехвърлянията чрез Android Лъч"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"маршрутизиране на извеждането на мултимедия"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"четене на сесии за инсталиране"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"заявка на пакети за инсталиране"</string>
</resources>
diff --git a/core/res/res/values-bn-rBD-watch/strings.xml b/core/res/res/values-bn-rBD-watch/strings.xml
index 4ce6091..4ef2d6ea 100644
--- a/core/res/res/values-bn-rBD-watch/strings.xml
+++ b/core/res/res/values-bn-rBD-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g>টির মধ্যে <xliff:g id="NUMBER_0">%1$d</xliff:g>টি অ্যাপ্লিকেশান"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"সেন্সরগুলি"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"আপনার পরিচিতিগুলিতে অ্যাক্সেস করুন"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"এই ঘড়ির অবস্থানে অ্যাক্সেস করুন"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"আপনার ক্যালেন্ডারে অ্যাক্সেস করুন"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS বার্তাগুলি পাঠান এবং দেখুন"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"আপনার দেখা ফটো, মিডিয়া এবং ফাইলগুলিতে অ্যাক্সেস করুন"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"অডিও রেকর্ড করুন"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ছবি তুলুন এবং ভিডিও রেকর্ড করুন"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ফোন কলগুলি করুন এবং পরিচালনা করুন"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"আপনার গুরুত্বপূর্ণ লক্ষণ এবং শারীরিক ক্রিয়াকলাপের সম্পর্কে তথ্য অ্যাক্সেস করুন"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"স্থিতি দন্ডে থাকুন"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"শরীরের সেন্সর (হার্ট রেট মনিটারের মত) অ্যাক্সেস করুন"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"সুনির্দিষ্ট অবস্থান (GPS এবং নেটওয়ার্ক-ভিত্তিক) অ্যাক্সেস করুন"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"আনুমানিক অবস্থান (নেটওয়ার্ক-ভিত্তিক) অ্যাক্সেস করুন"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM এ আদেশগুলি পাঠান"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"সম্পূর্ণ নেটওয়ার্ক অ্যাক্সেস রয়েছে"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"প্রোফাইল এবং ডিভাইস মালিকদের পরিচালনা করুন"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX এর স্থিতি পরিবর্তন করুন"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android বীম স্থানান্তর স্থিতি গ্রহণ করুন"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"মিডিয়া আউটপুট রুট করুন"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ইনস্টল সেশন পড়ুন"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"প্যাকেজগুলি ইনস্টল করার অনুরোধ"</string>
</resources>
diff --git a/core/res/res/values-ca-watch/strings.xml b/core/res/res/values-ca-watch/strings.xml
index 8f626e5..b01ca63 100644
--- a/core/res/res/values-ca-watch/strings.xml
+++ b/core/res/res/values-ca-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplicació <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensors"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"accedir als contactes"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"accedir a la ubicació del rellotge"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"accedir al calendari"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"enviar i llegir missatges SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"accedir a les fotos, el contingut multimèdia i els fitxers del rellotge"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"enregistrar àudio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"fer fotos i enregistrar vídeos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"fer i gestionar trucades telefòniques"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"accedir a les dades del sensor sobre els signes vitals"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ser la barra d\'estat"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"accedir als sensors corporals (com ara monitors de freqüència cardíaca)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"accedir a la ubicació precisa (basada en el GPS i la xarxa)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"accedir a la ubicació aproximada (basada en la xarxa)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"enviar ordres a la SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"tenir accés complet a la xarxa"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"gestionar els propietaris del perfil i del dispositiu"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"canviar l\'estat de WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"rebre l\'estat de la transferència d\'Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"indicar la ruta de sortida del contingut multimèdia"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"llegir les sessions d\'instal·lació"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"sol·licitar els paquets d\'instal·lació"</string>
</resources>
diff --git a/core/res/res/values-cs-watch/strings.xml b/core/res/res/values-cs-watch/strings.xml
index 34f8864..229e1eb 100644
--- a/core/res/res/values-cs-watch/strings.xml
+++ b/core/res/res/values-cs-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplikace <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Senzory"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"přístup ke kontaktům"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"přístup k poloze těchto hodinek"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"přístup ke kalendáři"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"odesílání a zobrazení zpráv SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"přístup k fotkám, médiím a souborům v hodinkách"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"nahrávání zvuku"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"pořizování fotografií a nahrávání videa"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"uskutečňování a správa telefonních hovorů"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"přístup k údajům senzorů vašich životních funkcí"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"vydávání se za stavový řádek"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"přístup k tělesným senzorům (jako jsou snímače tepu)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"přístup k přesné poloze (pomocí GPS a sítě)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"přístup k přibližné poloze (pomocí sítě)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"odesílání příkazů do SIM karty"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"úplný přístup k síti"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"správa vlastníků profilu a zařízení"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"změna stavu připojení WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"příjem stavu přenosů Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"směrování výstupu médií"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"čtení instalačních relací"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"žádost o instalaci balíčků"</string>
</resources>
diff --git a/core/res/res/values-da-watch/strings.xml b/core/res/res/values-da-watch/strings.xml
index efc4cf2..094a50f 100644
--- a/core/res/res/values-da-watch/strings.xml
+++ b/core/res/res/values-da-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> af <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensorer"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"få adgang til dine kontaktpersoner"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"få adgang til dette urs placering"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"få adgang til din kalender"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"sende og se sms-beskeder"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"få adgang til billeder, medier og filer på dit ur"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"optage lyd"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"tage billeder og optage video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"foretage og administrere telefonopkald"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"få adgang til sensordata om dine livstegn"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"være statusbjælken"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"få adgang til kropssensorer (f.eks. pulsmålere)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"få adgang til nøjagtig placering (baseret på GPS og netværk)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"få adgang til omtrentlig placering (netværksbaseret)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"sende kommandoer til SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"få fuld netværksadgang"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"administrere profil- og enhedsejere"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"skifte WiMAX-tilstand"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"modtage status for Android Beam-overførsler"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"videreføre medieoutput"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"læse installationssessioner"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"anmode om installation af pakker"</string>
</resources>
diff --git a/core/res/res/values-de-watch/strings.xml b/core/res/res/values-de-watch/strings.xml
index 99b3336..6f5941b 100644
--- a/core/res/res/values-de-watch/strings.xml
+++ b/core/res/res/values-de-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> von <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensoren"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"auf Kontakte zugreifen"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"auf den Standort dieser Smartwatch zugreifen"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"auf den Kalender zugreifen"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS senden und abrufen"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"auf Fotos, Medien und Dateien auf Ihrer Smartwatch zugreifen"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"Audio aufnehmen"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"Bilder und Videos aufnehmen"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"Telefonanrufe tätigen und verwalten"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"auf Sensordaten zu Ihren Vitaldaten zugreifen"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"Statusleiste darstellen"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"auf Körpersensoren wie beispielsweise Herzfrequenzmesser zugreifen"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"auf genauen Standort zugreifen (GPS- und netzwerkbasiert)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"auf den ungefähren Standort zugreifen (netzwerkbasiert)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"Befehle an die SIM senden"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"auf alle Netzwerke zugreifen"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"Profilinhaber und Geräteeigentümer verwalten"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX-Status ändern"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Status von Android Beam-Übertragungen erhalten"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"Medienausgabe umleiten"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"Installationssitzungen lesen"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"Installation von Paketen anfordern"</string>
</resources>
diff --git a/core/res/res/values-el-watch/strings.xml b/core/res/res/values-el-watch/strings.xml
index c159d6f..8081013 100644
--- a/core/res/res/values-el-watch/strings.xml
+++ b/core/res/res/values-el-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Εφαρμογή <xliff:g id="NUMBER_0">%1$d</xliff:g> από <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Αισθητήρες"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"πρόσβαση στις επαφές σας"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"πρόσβαση στην τοποθεσία αυτού του ρολογιού"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"πρόσβαση στο ημερολόγιό σας"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"αποστολή και προβολή μηνυμάτων SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"πρόσβαση στις φωτογραφίες, τα πολυμέσα και τα αρχεία στο ρολόι σας"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"εγγραφή ήχου"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"λήψη φωτογραφιών και εγγραφή βίντεο"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"πραγματοποίηση και διαχείριση τηλεφωνικών κλήσεων"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ορισμός ως γραμμής κατάστασης"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"πρόσβαση στους αισθητήρες λειτουργιών (π.χ. παρακολούθηση καρδιακού παλμού)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"πρόσβαση στην ακριβή τοποθεσία (με βάση το GPS και το δίκτυο)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"πρόσβαση στην τοποθεσία κατά προσέγγιση (με βάση το δίκτυο)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"στέλνει εντολές στην κάρτα SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"πλήρης πρόσβαση στο δίκτυο"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"διαχείριση προφίλ και κατόχων συσκευής"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"αλλαγή κατάστασης WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"λήψη κατάστασης μεταφοράς Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"δρομολόγηση εξόδου μέσων"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ανάγνωση περιόδων σύνδεσης εγκατάστασης"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"αίτημα εγκατάστασης πακέτων."</string>
</resources>
diff --git a/core/res/res/values-en-rAU-watch/strings.xml b/core/res/res/values-en-rAU-watch/strings.xml
index 6102d4e4..30357ce 100644
--- a/core/res/res/values-en-rAU-watch/strings.xml
+++ b/core/res/res/values-en-rAU-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensors"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"access your contacts"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"access this watch\'s location"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"access your calendar"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"send and view SMS messages"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"access photos, media and files on your watch"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"record audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"take pictures and record videos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"make and manage phone calls"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"access sensor data about your vital signs"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"be the status bar"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"access body sensors (like heart rate monitors)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"access precise location (GPS and network-based)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"access approximate location (network-based)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"send commands to the SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"have full network access"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"manage profile and device owners"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"change WiMAX state"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"receive Android Beam transfer status"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"route media output"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"read install sessions"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"request install packages"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 28d8eb4..ea33448 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -223,7 +223,7 @@
<string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
- <string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android system"</string>
<string name="user_owner_label" msgid="2804351898001038951">"Personal"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"Work"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
diff --git a/core/res/res/values-en-rGB-watch/strings.xml b/core/res/res/values-en-rGB-watch/strings.xml
index 6102d4e4..30357ce 100644
--- a/core/res/res/values-en-rGB-watch/strings.xml
+++ b/core/res/res/values-en-rGB-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensors"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"access your contacts"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"access this watch\'s location"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"access your calendar"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"send and view SMS messages"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"access photos, media and files on your watch"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"record audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"take pictures and record videos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"make and manage phone calls"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"access sensor data about your vital signs"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"be the status bar"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"access body sensors (like heart rate monitors)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"access precise location (GPS and network-based)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"access approximate location (network-based)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"send commands to the SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"have full network access"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"manage profile and device owners"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"change WiMAX state"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"receive Android Beam transfer status"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"route media output"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"read install sessions"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"request install packages"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 28d8eb4..ea33448 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -223,7 +223,7 @@
<string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
- <string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android system"</string>
<string name="user_owner_label" msgid="2804351898001038951">"Personal"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"Work"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
diff --git a/core/res/res/values-en-rIN-watch/strings.xml b/core/res/res/values-en-rIN-watch/strings.xml
index 6102d4e4..30357ce 100644
--- a/core/res/res/values-en-rIN-watch/strings.xml
+++ b/core/res/res/values-en-rIN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensors"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"access your contacts"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"access this watch\'s location"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"access your calendar"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"send and view SMS messages"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"access photos, media and files on your watch"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"record audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"take pictures and record videos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"make and manage phone calls"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"access sensor data about your vital signs"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"be the status bar"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"access body sensors (like heart rate monitors)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"access precise location (GPS and network-based)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"access approximate location (network-based)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"send commands to the SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"have full network access"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"manage profile and device owners"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"change WiMAX state"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"receive Android Beam transfer status"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"route media output"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"read install sessions"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"request install packages"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 28d8eb4..ea33448 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -223,7 +223,7 @@
<string name="global_action_lockdown" msgid="8751542514724332873">"Lock now"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
- <string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
+ <string name="android_system_label" msgid="6577375335728551336">"Android system"</string>
<string name="user_owner_label" msgid="2804351898001038951">"Personal"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"Work"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
diff --git a/core/res/res/values-es-rUS-watch/strings.xml b/core/res/res/values-es-rUS-watch/strings.xml
index 76664ef..703cb32 100644
--- a/core/res/res/values-es-rUS-watch/strings.xml
+++ b/core/res/res/values-es-rUS-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensores"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"acceder a los contactos"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"acceder a la ubicación de este reloj"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"acceder al calendario"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"enviar y ver mensajes SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"acceder a las fotos, el contenido multimedia y los archivos del reloj"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"grabar audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"tomar fotografías y grabar videos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"realizar y administrar llamadas telefónicas"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"acceder a los datos del sensor acerca de tus signos vitales"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"aparecer en la barra de estado"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"acceder a los sensores corporales (como los monitores de frecuencia cardíaca)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"acceder a la ubicación precisa (según el GPS y la red)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"acceder a la ubicación aproximada (según la red)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"enviar comandos a la tarjeta SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"permitir acceso completo a la red"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"administrar perfiles de propietarios y propietario del dispositivo"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"cambiar estado de WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"recibir estado de transferencias de Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"dirigir salida de medios"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"leer sesiones de instalación"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"solicitar la instalación de paquetes"</string>
</resources>
diff --git a/core/res/res/values-es-watch/strings.xml b/core/res/res/values-es-watch/strings.xml
index 002bfce..7eedf0c 100644
--- a/core/res/res/values-es-watch/strings.xml
+++ b/core/res/res/values-es-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensores"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"acceder a tus contactos"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"acceder a la ubicación de este reloj"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"acceder a tu calendario"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"enviar y ver mensajes SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"acceder a fotos, contenido multimedia y archivos en el reloj"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"grabar audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"hacer fotos y grabar vídeos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"hacer y administrar llamadas de teléfono"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"acceder a datos del sensor sobre tus constantes vitales"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"aparecer en la barra de estado"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"acceder a sensores corporales (como monitores de frecuencia cardíaca)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"acceder a tu ubicación precisa (basada en red y GPS)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"acceder a tu ubicación aproximada (basada en red)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"enviar comandos a la tarjeta SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"tener acceso completo a la red"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"administrar propietarios del perfil y del dispositivo"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"cambiar estado de WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"recibir estado de transferencias de Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"dirigir salida de medio"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"consultar sesiones de instalación"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"solicitar instalación de paquetes"</string>
</resources>
diff --git a/core/res/res/values-et-rEE-watch/strings.xml b/core/res/res/values-et-rEE-watch/strings.xml
index a1d29a8..c554e38 100644
--- a/core/res/res/values-et-rEE-watch/strings.xml
+++ b/core/res/res/values-et-rEE-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Rakendus <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Andurid"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"juurdepääs kontaktidele"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"juurdepääs selle kella asukohale"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"juurdepääs kalendrile"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS-sõnumite saatmine ja vaatamine"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"juurdepääs teie kellas olevatele fotodele, meediale ja failidele"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"heli salvestamine"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"pildistamine ja video salvestamine"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"helistamine ja telefonikõnede haldamine"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"juurdepääs anduri andmetele teie eluliste näitajate kohta"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"olekuribana kuvamine"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"juurdepääs kehaanduritele (nt pulsilugeja)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"juurdepääs täpsele asukohale (GPS-i ja võrgupõhine)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"juurdepääs ligikaudsele asukohale (võrgupõhine)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM-kaardile käskluste saatmine"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"täielik juurdepääs võrgule"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"profiilide ja seadmeomanike haldamine"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX-i oleku muutmine"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beami ülekande oleku vastuvõtmine"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"meediaväljundi marsruutimine"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"installiseansside lugemine"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"installipakettide taotlemine"</string>
</resources>
diff --git a/core/res/res/values-eu-rES-watch/strings.xml b/core/res/res/values-eu-rES-watch/strings.xml
index aa67602..011105e 100644
--- a/core/res/res/values-eu-rES-watch/strings.xml
+++ b/core/res/res/values-eu-rES-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g> aplikaz."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sentsoreak"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"Atzitu kontaktuak"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"Atzitu erlojuaren kokapena"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"Atzitu egutegia"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"Bidali eta ikusi SMS mezuak"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"Atzitu erlojuko argazkiak, multimedia-elementuak eta fitxategiak"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"Grabatu audioa"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"Atera argazkiak eta grabatu bideoak"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"Egin eta kudeatu telefono-deiak"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"Atzitu bizi-konstanteei buruzko sentsore-datuak"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"Bihurtu egoera-barra"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"Atzitu gorputzaren sentsoreak (adibidez, bihotz-erritmoaren monitoreak)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"Atzitu kokapen zehatza (GPS sisteman eta sarean oinarrituta)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"Atzitu gutxi gorabeherako kokapena (sarean oinarrituta)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"Bidali aginduak SIM txartelera"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"Izan sarerako sarbide osoa"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"Kudeatu profilen eta gailuen jabeak"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"Aldatu WiMAX egoera"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Jaso Android Beam transferentzien egoera"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"Bideratu multimedia-irteera"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"Irakurri instalazio-saioak"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"Eskatu instalazio-paketeak"</string>
</resources>
diff --git a/core/res/res/values-fa-watch/strings.xml b/core/res/res/values-fa-watch/strings.xml
index 243ccad..5fe8359 100644
--- a/core/res/res/values-fa-watch/strings.xml
+++ b/core/res/res/values-fa-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"برنامه <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"حسگرها"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"دسترسی به مخاطبین شما"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"دسترسی به مکان این ساعت"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"دسترسی به تقویم شما"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"ارسال و مشاهده پیامکها"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"دسترسی به عکس، رسانه و فایلهای روی ساعتتان"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ضبط صدا"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"عکس گرفتن و فیلمبرداری"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"برقراری و مدیریت تماسهای تلفنی"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"دسترسی به دادههای حسگر در رابطه با علائم حیاتی شما"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"نوار وضعیت باشد"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"دسترسی به حسگرهای بدن (مانند مانیتورهای ضربان قلب)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"دسترسی به مکان دقیق (مبتنی بر GPS و شبکه)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"دسترسی به مکان تقریبی (مبتنی بر شبکه)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"ارسال فرمانها به سیم کارت"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"داشتن دسترسی کامل به شبکه"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"مدیریت نمایه و مالکان دستگاه"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"تغییر وضعیت WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"دریافت وضعیت انتقال پرتوی Android"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"تعیین مسیر خروجی رسانه"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"خواندن جلسات نصب"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"درخواست نصب بستهبندی"</string>
</resources>
diff --git a/core/res/res/values-fi-watch/strings.xml b/core/res/res/values-fi-watch/strings.xml
index abe5ebb..662e0ab 100644
--- a/core/res/res/values-fi-watch/strings.xml
+++ b/core/res/res/values-fi-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Sovellus <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Anturit"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"käyttää yhteystietoja"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"käyttää tämän kellon sijaintia"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"käyttää kalenteria"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"lähettää ja tarkastella tekstiviestejä"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"käyttää kellosi kuvia, mediaa ja tiedostoja"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"tallentaa ääntä"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ottaa kuvia ja videoita"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"soittaa ja hallinnoida puheluita"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"käyttää anturitietoja elintoiminnoistasi"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"sijaita tilapalkissa"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"käyttää kehon antureita (kuten sykemittareita)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"käyttää tarkkaa sijaintia (GPS- ja verkkopohjainen)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"käyttää likimääräistä sijaintia (verkkopohjainen)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"lähettää komentoja SIM-kortille"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"saada täydet verkon käyttöoikeudet"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"hallinnoida laitteen ja profiilien omistajia"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"vaihtaa WiMAX-verkon tilaa"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"vastaanottaa Android Beam -siirron tilatietoja"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"reitittää mediaa"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"lukea asennusistuntoja"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"pyytää pakettien asennusta"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA-watch/strings.xml b/core/res/res/values-fr-rCA-watch/strings.xml
index 197b18a..8f2e683 100644
--- a/core/res/res/values-fr-rCA-watch/strings.xml
+++ b/core/res/res/values-fr-rCA-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Appli <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Capteurs"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"accéder à vos contacts"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"accéder à la position de cette montre"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"accéder à votre agenda"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"envoyer et afficher des messages texte"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"accéder à des photos, à des contenus multimédias et à des fichiers sur votre montre"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"enregistrer des fichiers audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"prendre des photos et filmer des vidéos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"faire et gérer des appels téléphoniques"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"accéder aux données des capteurs sur vos signes vitaux"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"faire office de barre d\'état"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"accéder aux capteurs corporels (comme les moniteurs de fréquence cardiaque)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"accéder à votre position précise (GPS et réseau)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"accéder à votre position approximative (réseau)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"envoyer des commandes à la carte SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"bénéficier d\'un accès complet au réseau"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"gérer les propriétaires des profils et de l\'appareil"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"modifier l\'état du WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"recevoir des données sur l\'état du transfert Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"diriger la sortie multimédia"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"accéder aux sessions d\'installation"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"demander l\'installation de paquets"</string>
</resources>
diff --git a/core/res/res/values-fr-watch/strings.xml b/core/res/res/values-fr-watch/strings.xml
index b853188..21bf8a6 100644
--- a/core/res/res/values-fr-watch/strings.xml
+++ b/core/res/res/values-fr-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Appli <xliff:g id="NUMBER_0">%1$d</xliff:g> sur <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Capteurs"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"accéder à vos contacts"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"accéder à la position de cette montre"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"accéder à votre agenda"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"envoyer et consulter des SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"accéder à des photos, à des contenus multimédias et à des fichiers sur votre montres"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"enregistrer des fichiers audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"prendre des photos et enregistrer des vidéos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"effectuer et gérer des appels téléphoniques"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"accéder aux données des capteurs relatives à vos signes vitaux"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"remplacer la barre d\'état"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"accéder aux capteurs corporels (tels que les cardiofréquencemètres)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"accéder à votre position précise (GPS et réseau)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"accéder à votre position approximative (selon le réseau)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"envoyer des commandes à la carte SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"bénéficier d\'un accès complet au réseau"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"gérer les propriétaires des profils et de l\'appareil"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"modifier l\'état du WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"recevoir des informations sur l\'état du transfert Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"diriger la sortie multimédia"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"accéder aux sessions d\'installation"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"demander l\'installation de packages"</string>
</resources>
diff --git a/core/res/res/values-gl-rES-watch/strings.xml b/core/res/res/values-gl-rES-watch/strings.xml
index 002bfce..95d6400 100644
--- a/core/res/res/values-gl-rES-watch/strings.xml
+++ b/core/res/res/values-gl-rES-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensores"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"acceder aos contactos"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"acceder á localización deste reloxo"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"acceder ao calendario"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"envíar e consultar mensaxes de SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"acceder ás fotos, ao contido multimedia e aos ficheiros do teu reloxo"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"gravar audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"tirar fotos e gravar vídeos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"facer e xestionar chamadas telefónicas"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"acceder aos datos do sensor sobre as túas constantes vitais"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"actuar como a barra de estado"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"acceder a sensores do corpo (como monitores de ritmo cardíaco)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"acceder á localización precisa (baseada no GPS e na rede)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"acceder á localización aproximada (baseada na rede)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"enviar comandos á SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ter acceso completo á rede"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"xestionar propietarios do perfil e do dispositivo"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"cambiar estado de WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"recibir o estado das transferencias de Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"dirixir saída multimedia"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ler sesións de instalación"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"solicitar instalación de paquetes"</string>
</resources>
diff --git a/core/res/res/values-gu-rIN-watch/strings.xml b/core/res/res/values-gu-rIN-watch/strings.xml
index f607966..af1b068 100644
--- a/core/res/res/values-gu-rIN-watch/strings.xml
+++ b/core/res/res/values-gu-rIN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g> માંથી <xliff:g id="NUMBER_0">%1$d</xliff:g> એપ્લિકેશન."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"સેન્સર્સ"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"તમારા સંપર્કોને ઍક્સેસ કરો"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"આ ઘડિયાળના સ્થાનને ઍક્સેસ કરો"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"તમારા કેલેન્ડરને ઍક્સેસ કરો"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS સંદેશા મોકલો અને જુઓ"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"તમારી ઘડિયાળ પર ફોટા, મીડિયા અને ફાઇલો ઍક્સેસ કરો"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ઑડિઓ રેકોર્ડ કરો"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ચિત્રો લો અને વિડિઓ રેકોર્ડ કરો"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ફોન કૉલ્સ કરો તથા સંચાલિત કરો"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"તમારા મહત્વપૂર્ણ ચિહ્નો વિશે સેન્સર ડેટા ઍક્સેસ કરો"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"સ્થિતિ બાર થાઓ"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"બૉડી સેન્સર્સ ઍક્સેસ કરો (જેમ કે હાર્ટ રેટ મૉનિટર્સ)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"નિશ્ચિત સ્થાન ઍક્સેસ કરો (GPS અને નેટવર્ક-આધારિત)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"અંદાજિત સ્થાન (નેટવર્ક-આધારિત)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM ને આદેશો મોકલો"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"પૂર્ણ નેટવર્ક ઍક્સેસ મેળવો"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"પ્રોફાઇલ અને ઉપકરણ માલિકોને સંચાલિત કરો"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX સ્થિતિ બદલો"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android બીમ ટ્રાન્સફર સ્થિતિ પ્રાપ્ત કરો"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"મીડિયા આઉટપુટ રૂટ કરો"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ઇન્સ્ટોલ સત્રો વાંચો"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"પૅકેજેસ ઇન્સ્ટોલ કરવાની વિનંતી કરો"</string>
</resources>
diff --git a/core/res/res/values-hi-watch/strings.xml b/core/res/res/values-hi-watch/strings.xml
index ead4d60..afed795 100644
--- a/core/res/res/values-hi-watch/strings.xml
+++ b/core/res/res/values-hi-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g> में से <xliff:g id="NUMBER_0">%1$d</xliff:g> ऐप."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"संवेदक"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"अपने संपर्कों को ऐक्सेस करें"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"इस घड़ी के स्थान को ऐक्सेस करें"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"अपने कैलेंडर को ऐक्सेस करें"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS संदेश भेजें और देखें"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"अपनी घड़ी पर फ़ोटो, मीडिया और फ़ाइलें ऐक्सेस करें"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ऑडियो रिकॉर्ड करें"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"चित्र लें और वीडियो रिकॉर्ड करें"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"फ़ोन कॉल करें और प्रबंधित करें"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"अपने महत्वपूर्ण संकेतों के बारे में सेंसर डेटा को ऐक्सेस करें"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"स्थिति बार होने दें"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"शरीर संवेदक ऐक्सेस करें (जैसे हृदय गति मॉनीटर)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"सटीक स्थान ऐक्सेस करें (GPS और नेटवर्क-आधारित)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"अनुमानित स्थान ऐक्सेस करें (नेटवर्क-आधारित)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM पर आदेश भेजें"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"पूर्ण नेटवर्क ऐक्सेस पाएं"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"प्रोफ़ाइल और डिवाइस स्वामियों को प्रबंधित करें"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX स्थिति बदलें"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam ट्रांसफर स्थिति प्राप्त करें"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"मीडिया आउटपुट को रूट करें"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"इंस्टॉल सत्रों को पढ़ें"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"पैकेज इंस्टॉल करने का अनुरोध करें"</string>
</resources>
diff --git a/core/res/res/values-hr-watch/strings.xml b/core/res/res/values-hr-watch/strings.xml
index 7e65f07..dda3cb2 100644
--- a/core/res/res/values-hr-watch/strings.xml
+++ b/core/res/res/values-hr-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplikacija <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Senzori"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"pristupati vašim kontaktima"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"pristupati lokaciji ovog sata"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"pristupati kalendaru"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"slati i pregledavati SMS poruke"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"pristupati fotografijama, medijima i datotekama na vašem satu"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"snimati zvuk"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"snimati fotografije i videozapise"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"uspostavljati telefonske pozive i upravljati njima"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"pristupati podacima senzora o vašim vitalnim znakovima"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"biti traka statusa"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"pristupati biometrijskim senzorima (kao što su monitori otkucaja srca)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"pristupati preciznoj lokaciji (na temelju GPS-a i mreža)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"pristupati približnoj lokaciji (na temelju mreža)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"slati naredbe SIM-u"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"imati puni mrežni pristup"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"upravljati vlasnicima profila i uređaja"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"promijeniti stanje WiMAX-a"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"primati status prijenosa Android Beama"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"usmjeravati medijski izlaz"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"čitati sesije instaliranja"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"zahtijevati instaliranje paketa"</string>
</resources>
diff --git a/core/res/res/values-hu-watch/strings.xml b/core/res/res/values-hu-watch/strings.xml
index aa72468..7c45326 100644
--- a/core/res/res/values-hu-watch/strings.xml
+++ b/core/res/res/values-hu-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>. alkalmazás"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Érzékelők"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"hozzáférés a névjegyekhez"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"hozzáférés ennek az órának a helyadataihoz"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"hozzáférés a naptárhoz"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS-ek küldése és megtekintése"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"hozzáférés az órán lévő fotókhoz, médiatartalmakhoz és fájlokhoz"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"hanganyag rögzítése"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"fotók és videók készítése"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"telefonhívások kezdeményezése és kezelése"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"hozzáférés az érzékelők által mért, életjelekkel kapcsolatos adatokhoz"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"az állapotsor szerepének átvétele"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"hozzáférés a testérzékelőkhöz (például pulzusmérők)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"hozzáférés a pontos (GPS- és hálózatalapú) helyadatokhoz"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"hozzáférés a hozzávetőleges (hálózatalapú) helyadatokhoz"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"parancsok küldése a SIM kártyára"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"teljes hálózati hozzáférés"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"profil és eszköztulajdonosok kezelése"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX-állapot módosítása"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"android Beam-átviteli állapot fogadása"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"médiafájlok kimenetének irányítása"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"telepítési munkamenetek olvasása"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"telepítőcsomagok kérése"</string>
</resources>
diff --git a/core/res/res/values-hy-rAM-watch/strings.xml b/core/res/res/values-hy-rAM-watch/strings.xml
index 28617cb..9bff6ad 100644
--- a/core/res/res/values-hy-rAM-watch/strings.xml
+++ b/core/res/res/values-hy-rAM-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Հավելված <xliff:g id="NUMBER_0">%1$d</xliff:g>՝ <xliff:g id="NUMBER_1">%2$d</xliff:g>-ից:"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Սենսորներ"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"օգտագործել ձեր կոնտակտները"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"օգտագործել այս ժամացույցի տեղադրությունը"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"օգտագործել ձեր օրացույցը"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"ուղարկել և դիտել SMS հաղորդագրությունները"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"օգտագործել լուսանկարները, մեդիա ֆայլերը և ձեր ժամացույցում պահվող այլ ֆայլերը"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ձայնագրել"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"լուսանկարել և տեսագրել"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"կատարել հեռախոսազանգեր և կառավարել դրանք"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"օգտագործել ձեր հիմնական ֆիզիոլոգիական ցուցանիշների վերաբերյալ սենսորի տվյալները"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"լինել կարգավիճակի գոտի"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"օգտագործել մարմնի սենսորները (օրինակ` սրտի կծկումների հաճախականության չափիչ)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"օգտագործել ճշգրիտ տեղադրությունը (GPS և ցանցային)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"օգտագործել մոտավոր տեղադրությունը (ցանցային)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"ուղարկել հրամաններ SIM քարտին"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ունենալ ամբողջական ցանցային մուտք"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"կառավարել պրոֆիլները և սարքի սեփականատերերին"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"փոխել WiMAX-ի կարգավիճակը"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"ստանալ Android Beam-ով փոխանցման կարգավիճակը"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"երթուղել մեդիա արտածումը"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"կարդալ տեղադրման աշխատաշրջանները"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"պահանջել տեղադրման փաթեթներ"</string>
</resources>
diff --git a/core/res/res/values-in-watch/strings.xml b/core/res/res/values-in-watch/strings.xml
index b0b22e7..ef88a11 100644
--- a/core/res/res/values-in-watch/strings.xml
+++ b/core/res/res/values-in-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplikasi <xliff:g id="NUMBER_0">%1$d</xliff:g> dari <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensor"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"akses kontak"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"akses lokasi jam tangan ini"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"akses kalender"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"kirim dan lihat pesan SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"akses foto, media, dan file di jam tangan"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"rekam audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ambil gambar dan rekam video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"lakukan dan kelola panggilan telepon"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"akses data sensor tentang tanda-tanda vital"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"jadikan bilah status"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"akses sensor tubuh (misalnya, monitor detak jantung)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"akses lokasi akurat (berbasis jaringan dan GPS)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"akses perkiraan lokasi (berbasis jaringan)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"kirimkan perintah ke SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"dapatkan akses jaringan penuh"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"kelola pemilik profil dan perangkat"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"ubah status WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"terima status transfer Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"tentukan rute keluaran media"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"baca sesi pemasangan"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"minta pasang paket"</string>
</resources>
diff --git a/core/res/res/values-is-rIS-watch/strings.xml b/core/res/res/values-is-rIS-watch/strings.xml
index ab82c1c..d512b6e 100644
--- a/core/res/res/values-is-rIS-watch/strings.xml
+++ b/core/res/res/values-is-rIS-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Forrit <xliff:g id="NUMBER_0">%1$d</xliff:g> af <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Skynjarar"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"fá aðgang að tengiliðunum þínum"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"fá aðgang að staðsetningu þessa úrs"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"fá aðgang að dagatalinu þínu"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"senda og skoða SMS-skilaboð"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"fá aðgang að myndum, efni og skrám í úrinu þínu"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"taka upp hljóð"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"taka myndir og myndskeið"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"hringja og stjórna símtölum"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"fá aðgang að skynjaragögnum yfir lífsmörk þín"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"vera stöðustikan"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"fá aðgang að líkamsskynjurum (s.s. hjartsláttarmælum)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"fá aðgang að nákvæmri staðsetningu (frá GPS og símkerfi)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"fá aðgang að áætlaðri staðsetningu (frá símkerfi)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"senda skipanir til SIM-kortsins"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"hafa fullan netaðgang"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"stjórna eigendum sniða og tækja"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"breyta stöðu WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"fá flutningsstöðu Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"beina margmiðlunarúttaki"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"lesa uppsetningarlotur"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"fara fram á uppsetningu pakka"</string>
</resources>
diff --git a/core/res/res/values-it-watch/strings.xml b/core/res/res/values-it-watch/strings.xml
index 111c2a2..c348e48 100644
--- a/core/res/res/values-it-watch/strings.xml
+++ b/core/res/res/values-it-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> di <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensori"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"accedere ai contatti"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"accedere alla posizione dell\'orologio"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"accedere al calendario"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"inviare e visualizzare SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"accedere a foto, contenuti multimediali e file sull\'orologio"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"registrare audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"scattare foto e registrare video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"fare e gestire telefonate"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"avere la funzione di barra di stato"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"accedere ai sensori (come il cardiofrequenzimetro)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"accedere alla posizione esatta (basata su GPS e rete)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"accedere alla posizione approssimativa (basata sulla rete)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"inviare comandi alla SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"avere accesso completo alla rete"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"gestire proprietari di dispositivi e profili"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"modificare lo stato WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"ricevere lo stato dei trasferimenti Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"indirizzare l\'output dei contenuti multimediali"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"leggere sessioni di installazione"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"richiedere pacchetti di installazione"</string>
</resources>
diff --git a/core/res/res/values-iw-watch/strings.xml b/core/res/res/values-iw-watch/strings.xml
index d0b4943..1e4bad4 100644
--- a/core/res/res/values-iw-watch/strings.xml
+++ b/core/res/res/values-iw-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"אפליקציה <xliff:g id="NUMBER_0">%1$d</xliff:g> מתוך <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"חיישנים"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"גישה אל אנשי הקשר"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"גישה אל מיקום השעון הזה"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"גישה אל היומן"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"שליחה והצגה של הודעות SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"גישה אל תמונות, מדיה וקבצים בשעון שלך"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"הקלטת אודיו"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"צילום תמונות והקלטת סרטונים"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"התקשרות וניהול של שיחות טלפון"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"גישה אל נתוני חיישנים של הסימנים החיוניים שלך"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"להיות שורת מצב"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"גישה אל חיישני גוף (כמו מוניטורים עבור קצב לב)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"גישה אל מיקום מדויק (מבוסס GPS ורשת)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"גישה אל מיקום משוער (מבוסס רשת)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"שלח פקודות אל ה-SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"קבלת גישת רשת מלאה"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"ניהול בעלים של פרופיל ומכשיר"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"שנה את מצב WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"קבלת סטטוס העברה של Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"ניתוב פלט מדיה"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"קריאת פעילות התקנה"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"בקשה להתקנת חבילות"</string>
</resources>
diff --git a/core/res/res/values-ja-watch/strings.xml b/core/res/res/values-ja-watch/strings.xml
index ec1257ef..3248041 100644
--- a/core/res/res/values-ja-watch/strings.xml
+++ b/core/res/res/values-ja-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"アプリ<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"センサー"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"連絡先へのアクセス"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"この時計の位置情報へのアクセス"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"カレンダーへのアクセス"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMSメッセージの送信と表示"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"時計上の写真、メディア、ファイルへのアクセス"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"録音"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"写真の撮影と動画の記録"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"通話の発信と管理"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"バイタルサインに関するセンサーデータへのアクセス"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ステータスバーへの表示"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"ボディーセンサー(心拍数モニターなど)へのアクセス"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"正確な位置情報(GPSとネットワーク基地局)へのアクセス"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"おおよその位置情報(ネットワーク基地局)へのアクセス"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIMへのコマンド送信"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ネットワークへのフルアクセス"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"プロフィールの所有者と端末の所有者の管理"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX状態の変更"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Androidビーム転送のステータスの受信"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"メディア出力のルーティング"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"インストールセッションの読み取り"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"インストールパッケージのリクエスト"</string>
</resources>
diff --git a/core/res/res/values-ka-rGE-watch/strings.xml b/core/res/res/values-ka-rGE-watch/strings.xml
index 5aa9aaf..9e2ca1f 100644
--- a/core/res/res/values-ka-rGE-watch/strings.xml
+++ b/core/res/res/values-ka-rGE-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"აპი <xliff:g id="NUMBER_0">%1$d</xliff:g>, სულ <xliff:g id="NUMBER_1">%2$d</xliff:g>-დან."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"სენსორები"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"თქვენს კონტაქტებზე წვდომა"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"ამ ნახვის მდებარეობაზე წვდომა"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"თქვენს კალენდარზე წვდომა"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS შეტყობინებების გაგზავნა და ნახვა"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"თქვენს სანახავ ფოტოებზე, მედიაზე და ფაილებზე წვდომა"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"აუდიოს ჩაწერა"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ფოტოებისა და ვიდეოების გადაღება"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"სატელეფონო ზარების გაშვება და მართვა"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"თქვენი სასიცოცხლო ნიშნების შესახებ სენეორის მონაცემებზე წვდომა"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"სტატუსის ზოლის ჩანაცვლება"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"სხეულის სენსორებზე (როგორიცაა გულისცემის სიხშირე) წვდომა"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"ზუსტ მდებარეობაზე წვდომა (GPS-ის და ქსელის მიხედვით)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"მიახლოებით მდებარეობაზე წვდომა (ქსელის მიხედვით)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"ბრძანებების SIM-ზე გაგზავნა"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"მთელ ქსელზე წვდომის მიღება"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"პროფილისა და მოწყობილობის მფლობელების მართვა"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX-ის მდგომარეობის შეცვლა"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android სხივით გადაცემის სტატუსის მიღება"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"მედიის მონაცემების მარშრუტიზაცია"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ინსტალაციის სესიების წაკითხვა"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"პაკეტების ინსტალაციის მოთხოვნა"</string>
</resources>
diff --git a/core/res/res/values-kk-rKZ-watch/strings.xml b/core/res/res/values-kk-rKZ-watch/strings.xml
index e913230..8c41688 100644
--- a/core/res/res/values-kk-rKZ-watch/strings.xml
+++ b/core/res/res/values-kk-rKZ-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g> бағдарлама."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Сенсорлар"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"контактілерге қатынасу"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"осы сағаттың орнына қатынасу"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"күнтізбеге қатынасу"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS хабарларын жіберу және көру"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"сағаттағы фотосуреттерге, медиафайлдарға және файлдарға қатынасу"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"аудио жазу"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"суреттер түсіру және бейне жазу"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"қоңырау шалу және телефон қоңырауларын басқару"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"ағза күйінің көрсеткіштері туралы сенсор деректеріне қатынасу"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"күй жолағы болу"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"дене датчиктеріне (мысалы, жүрек соғу жиілігінің мониторларына) қатынасу"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"дәл орынға қатынасу (GPS және желіге негізделген)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"шамамен алған орынға қатынасу (желі негізінде)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM картасына пәрмендер жіберу"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"желіге толық қатынасы бар"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"профиль және құрылғы иелерін басқару"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX күйін өзгерту"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam тасымалдау күйін алу"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"медиа шығысын бағыттау"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"орнату сеанстарын оқу"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"орнату бумаларын сұрау"</string>
</resources>
diff --git a/core/res/res/values-km-rKH-watch/strings.xml b/core/res/res/values-km-rKH-watch/strings.xml
index 01731f3..5c1bf8a 100644
--- a/core/res/res/values-km-rKH-watch/strings.xml
+++ b/core/res/res/values-km-rKH-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"កម្មវិធី <xliff:g id="NUMBER_0">%1$d</xliff:g> នៃ <xliff:g id="NUMBER_1">%2$d</xliff:g>។"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"ឧបករណ៍ចាប់សញ្ញា"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"ចូលដំណើរការទំនាក់ទំនងរបស់អ្នក"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"ចូលដំណើរការទីតាំងនាឡិកាដៃនេះ"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"ចូលដំណើរការប្រិតិទិនរបស់អ្នក"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"ផ្ញើ និងមើលសារ SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"ចូលដំណើរការរូបថត មេឌៀ និងឯកសារនៅលើនាឡិកាដៃរបស់អ្នក។"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ថតសំឡេង"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ថតរូប និងថតវីដេអូ"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ហៅទូរស័ព្ទ និងគ្រប់គ្រងការហៅទូរស័ព្ទ"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"ចូលដំណើរការទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ធ្វើជារបារស្ថានភាព"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"ចូលដំណើរការឧបករណ៍ចាប់សញ្ញារាងកាយ (ដូចជាម៉ាស៊ីនវាស់ចង្វាក់បេះដូង)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"ចូលដំណើរការទីតាំងច្បាស់លាស់ (ផ្អែកលើបណ្តាញ និង GPS)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"ចូលដំណើរការទីតាំងប្រហាក់ប្រហែល (ផ្អែកលើបណ្តាញ)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"ផ្ញើពាក្យបញ្ជាទៅស៊ីមកាត"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"មានការចូលដំណើរការបណ្ដាញពេញលេញ"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"គ្រប់គ្រងម្ចាស់ឧបករណ៍ និងប្រវត្តិរូប"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"ប្ដូរស្ថានភាព WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"ទទួលបានស្ថានភាពផ្ទេរ Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"នាំផ្លូវលទ្ធផលមេឌៀ"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"អានវេនដំឡើង"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"ស្នើសុំកញ្ចប់ដំឡើង"</string>
</resources>
diff --git a/core/res/res/values-kn-rIN-watch/strings.xml b/core/res/res/values-kn-rIN-watch/strings.xml
index ea010b3..def2130 100644
--- a/core/res/res/values-kn-rIN-watch/strings.xml
+++ b/core/res/res/values-kn-rIN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="NUMBER_0">%1$d</xliff:g> ಅಪ್ಲಿಕೇಶನ್."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"ಸೆನ್ಸರ್ಗಳು"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"ಈ ಗಡಿಯಾರದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ವೀಕ್ಷಿಸಿ"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"ನಿಮ್ಮ ಗಡಿಯಾರದಲ್ಲಿನ ಫೋಟೋಗಳು, ಮಾಧ್ಯಮ ಮತ್ತು ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ಆಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ಚಿತ್ರಗಳನ್ನು ತೆಗೆಯಿರಿ ಹಾಗೂ ವೀಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಿ ಹಾಗೂ ನಿರ್ವಹಿಸಿ"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿರಲು"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"ದೇಹ ಸೆನ್ಸರ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ (ಹೃದಯದ ಬಡಿತ ಮಾನಿಟರ್ಗಳಂತಹ)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"ನಿಖರ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ (GPS ಮತ್ತು ನೆಟ್ವರ್ಕ್-ಆಧಾರಿತ)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"ಅಂದಾಜು ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ (ನೆಟ್ವರ್ಕ್-ಆಧಾರಿತ)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"ಸಿಮ್ಗೆ ಆಜ್ಞೆಗಳನ್ನು ಕಳುಹಿಸಿ"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ಪೂರ್ಣ ನೆಟ್ವರ್ಕ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರಿ"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"ಪ್ರೊಫೈಲ್ ಮತ್ತು ಸಾಧನ ಮಾಲೀಕರನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX ಸ್ಥಿತಿಯನ್ನು ಬದಲಿಸಿ"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android ಬೀಮ್ ವರ್ಗಾವಣೆ ಸ್ಥಿತಿ ಸ್ವೀಕರಿಸಿ"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"ಮಾಧ್ಯಮ ಔಟ್ಪುಟ್ ಅನ್ನು ರೂಟ್ ಮಾಡಿ"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ಸ್ಥಾಪನೆ ಸೆಷನ್ಗಳನ್ನು ಓದಿ"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"ಸ್ಥಾಪನೆ ಪ್ಯಾಕೇಜ್ಗಳನ್ನು ವಿನಂತಿಸಿ"</string>
</resources>
diff --git a/core/res/res/values-ko-watch/strings.xml b/core/res/res/values-ko-watch/strings.xml
index 985f401..8602c7e 100644
--- a/core/res/res/values-ko-watch/strings.xml
+++ b/core/res/res/values-ko-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"앱 <xliff:g id="NUMBER_1">%2$d</xliff:g>개 중 <xliff:g id="NUMBER_0">%1$d</xliff:g>개"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"센서"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"주소록에 액세스"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"이 시계 위치에 액세스"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"캘린더에 액세스"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS 메시지 보내기 및 보기"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"시계의 사진, 미디어, 파일에 액세스"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"오디오 녹음"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"사진 찍기 및 동영상 녹화"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"전화 걸기 및 관리"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"생체 신호에 관한 센서 데이터에 액세스"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"상태 표시줄에 위치"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"신체 센서(예: 심박수 모니터)에 액세스"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"정확한 위치(GPS 및 네트워크 기반)에 액세스"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"대략적인 위치(네트워크 기반)에 액세스"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM에 명령어 보내기"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"전체 네트워크 액세스 권한 보유"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"프로필 및 기기 소유자 관리"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX 상태 변경"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam 전송 상태 수신"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"미디어 출력 연결"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"설치 세션 읽기"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"패키지 설치 요청"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 1844214..f5a6fa4 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -431,7 +431,7 @@
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"지문 인식 작업이 취소되었습니다."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"다시 시도해 보세요."</string>
- <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>번째 손가락"</string>
+ <string name="fingerprint_name_template" msgid="5870957565512716938">"손가락 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"지문 아이콘"</string>
diff --git a/core/res/res/values-ky-rKG-watch/strings.xml b/core/res/res/values-ky-rKG-watch/strings.xml
index 3c708961..2fb9047 100644
--- a/core/res/res/values-ky-rKG-watch/strings.xml
+++ b/core/res/res/values-ky-rKG-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ичинен <xliff:g id="NUMBER_0">%1$d</xliff:g> колднм."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Сенсорлор"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"байланыштарыңызга уруксат"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"бул сааттын жайгашкан жерине уруксат"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"жылнаамаңызды пайдалануу"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS билдирүүлөрдү жөнөтүү жана көрсөтүү"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"саатыңыздагы сүрөттөр, медиа жана файлдарга уруксат"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"аудио жаздыруу"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"сүрөт тартуу жана видео жаздыруу"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"телефон чалуу жана аларды башкаруу"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"организмдин абалына көз салган сенсордун дайындарына мүмкүнчүлүк алуу"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"абал тилкесинин милдетин аткаруу"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"дене-бой сенсорлоруна (жүрөктүн кагышын өлчөгүчтөр сыяктуу) уруксат"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"так аныкталган жайгашкан жерге (GPS жана тармактын негизинде) уруксат"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"болжолдуу жайгашкан жерге (тармактын негизинде) уруксат"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM-картага буйруктарды жөнөтүү"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"тармакка толук мүмкүнчүлүк алуу"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"профилди жана түзмөк ээлерин башкаруу"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX абалын өзгөртүү"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam өткөрүү абалын кабыл алуу"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"медиа чыгарылышын багыттоо"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"орнотуу сеанстарын окуу"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"топтомдорду орнотууга уруксат суроо"</string>
</resources>
diff --git a/core/res/res/values-lo-rLA-watch/strings.xml b/core/res/res/values-lo-rLA-watch/strings.xml
index d7e97fb..db2f7e4 100644
--- a/core/res/res/values-lo-rLA-watch/strings.xml
+++ b/core/res/res/values-lo-rLA-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"ແອັບ <xliff:g id="NUMBER_0">%1$d</xliff:g> ໃນ <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"ເຊັນເຊີ"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"ເຂົ້າຫາລາຍຊື່ຂອງທ່ານ"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"ເຂົ້າຫາທີ່ຕັ້ງຂອງໂມງນີ້"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"ເຂົ້າຫາປະຕິທິນຂອງທ່ານ"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"ສົ່ງ ແລະ ເບິ່ງຂໍ້ຄວາມ SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"ເຂົ້າເຖິງຮູບຖ່າຍ, ສື່ ແລະ ໄຟລ໌ຢູ່ເທິງໂມງຂອງທ່ານ"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ບັນທຶກສຽງ"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ຖ່າຍຮູບ ແລະ ບັນທຶກວິດີໂອ"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ໂທ ແລະ ຈັດການການໂທລະສັບ"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"ເຂົ້າຫາຂໍ້ມູນເຊັນເຊີກ່ຽວກັບສັນຍານຊີບຂອງທ່ານ"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ເປັນແຖບສະຖານະ"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"ເຂົ້າຫາເຊັນເຊີກວດຮ່າງກາຍ (ເຊັ່ນ: ຈໍຕິດຕາມອັດຕາການເຕັ້ນຂອງຫົວໃຈ)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"ເຂົ້າຫາທີ່ຕັ້ງທີ່ແນ່ນອນ (ອີງໃສ່ GPS ແລະ ເຄືອຂ່າຍ)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"ເຂົ້າຫາທີ່ຕັ້ງໂດຍປະມານ (ອີງໃສ່ເຄືອຂ່າຍ)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"ສົ່ງຄຳສັ່ງຫາ SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ມີການເຂົ້າເຖິງເຄືອຂ່າຍເຕັມຮູບແບບ"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"ຈັດການເຈົ້າຂອງໂປຣໄຟລ໌ ແລະ ອຸປະກອນ"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"ປ່ຽນສະຖານະ WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"ຮັບສະຖານະການໂອນຂໍ້ມູນ Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"ກຳນົດຊ່ອງທາງອອກຂອງສື່"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ອ່ານເຊສຊັນການຕິດຕັ້ງ"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"ຂໍຕິດຕັ້ງແພັກເກດ"</string>
</resources>
diff --git a/core/res/res/values-lt-watch/strings.xml b/core/res/res/values-lt-watch/strings.xml
index bf32040..ce154e70 100644
--- a/core/res/res/values-lt-watch/strings.xml
+++ b/core/res/res/values-lt-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g> programa iš <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Jutikliai"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"pasiekti kontaktus"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"pasiekti šio laikrodžio vietą"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"pasiekti kalendorių"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"siųsti ir peržiūrėti SMS pranešimus"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"pasiekti laikrodžio nuotraukas, mediją ir failus"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"įrašyti garsą"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"fotografuoti ir filmuoti"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"skambinti ir tvarkyti telefonų skambučius"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"pasiekti jutiklių duomenis apie gyvybinius ženklus"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"būti būsenos juosta"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"pasiekti kūno jutiklius (pvz., pulso dažnio stebėjimo įrenginius)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"pasiekti tikslią vietą (nustatytą atsižvelgiant į GPS ir tinklą)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"pasiekti apytikslę vietą (nustatytą atsižvelgiant į tinklą)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"siųsti komandas į SIM kortelę"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"turėti visateisę tinklo prieigą"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"tvarkyti profilio ir įrenginio savininkus"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"keisti „WiMAX“ būseną"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"gauti „Android“ perdavimo funkcijos perkėlimo būseną"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"nukreipti medijos išvestį"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"skaityti diegimo sesijas"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"pateikti užklausą dėl diegimo paketų"</string>
</resources>
diff --git a/core/res/res/values-lv-watch/strings.xml b/core/res/res/values-lv-watch/strings.xml
index 3a7fd95..c44677f 100644
--- a/core/res/res/values-lv-watch/strings.xml
+++ b/core/res/res/values-lv-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g>. lietotne no <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensori"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"Piekļūt jūsu kontaktpersonu datiem"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"Piekļūt šī pulksteņa atrašanās vietas datiem"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"Piekļūt jūsu kalendāram"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"Sūtīt un skatīt īsziņas"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"Piekļūt fotoattēliem, multivides saturam un failiem pulkstenī"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"Ierakstīt audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"Uzņemt attēlus un ierakstīt videoklipus"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"Veikt un pārvaldīt tālruņa zvanus"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"Piekļūt sensoru datiem par jūsu veselības rādījumiem"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"Būt par statusa joslu"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"Piekļūt ķermeņa sensoriem (piemēram, sirdsdarbības monitoriem)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"Noteikt precīzu atrašanās vietu (izmantojot GPS un tīklu)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"Noteikt aptuveno atrašanās vietu (izmantojot tīklu)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"Sūtīt komandas SIM kartei"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"Pilnīga piekļuve tīklam"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"Pārvaldīt profilus un ierīces īpašniekus"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"Mainīt WiMAX statusu"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Saņemt Android Beam pārsūtīšanas statusu"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"Maršrutēt multivides datu izeju"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"Lasīt instalēšanas sesijas"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"Pieprasīt pakotņu instalēšanu"</string>
</resources>
diff --git a/core/res/res/values-mk-rMK-watch/strings.xml b/core/res/res/values-mk-rMK-watch/strings.xml
index 5e67a61..9d7c5bf 100644
--- a/core/res/res/values-mk-rMK-watch/strings.xml
+++ b/core/res/res/values-mk-rMK-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Апликац. <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Сензори"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"пристапи до контактите"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"пристапи до локацијата на часовникот"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"пристапи до календарот"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"испраќај и прикажувај СМС-пораки"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"пристапи до фотографиите, медиумите и датотеките на часовникот"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"снимај аудио"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"фотографирај и снимај видео"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"повикувај и управувај со телефонски повици"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"пристапи до податоците од сензорите за виталните знаци"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"биди статусната лента"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"пристапи до телесните сензори (како монитори за ритам на срце)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"пристапи до прецизната локација (ГПС и врз база на мрежа)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"пристапи до приближната локација (врз база на мрежа)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"испраќај наредби до СИМ-картичката"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"добиј целосен пристап до мрежата"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"управувај со сопствениците на профил и уред"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"промени ја состојбата на WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"добиј статус на пренос на Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"насочи излез за медиуми"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"читај сесии на инсталирање"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"барај пакети за инсталирање"</string>
</resources>
diff --git a/core/res/res/values-ml-rIN-watch/strings.xml b/core/res/res/values-ml-rIN-watch/strings.xml
index c10769e..02fe66c 100644
--- a/core/res/res/values-ml-rIN-watch/strings.xml
+++ b/core/res/res/values-ml-rIN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g> അപ്ലിക്കേഷൻ."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"സെൻസറുകൾ"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ ആക്സസ് ചെയ്യുക"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"ഈ വാച്ചിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യുക"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"നിങ്ങളുടെ കലണ്ടർ ആക്സസ് ചെയ്യുക"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS സന്ദേശങ്ങൾ അയയ്ക്കുകയും കാണുകയും ചെയ്യുക"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"നിങ്ങളുടെ വാച്ചിൽ ഫോട്ടോകളും മീഡിയയും ഫയലുകളും ആക്സസ് ചെയ്യുക"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുക"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ചിത്രങ്ങൾ എടുക്കുക, വീഡിയോ റെക്കോർഡ് ചെയ്യുക"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ഫോൺ വിളിക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"നിങ്ങളുടെ ജീവാധാര ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"സ്റ്റാറ്റസ് ബാർ ആയിരിക്കുക"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"ശരീര സെൻസറുകൾ (ഹൃദയമിടിപ്പ് നിരക്ക് മോണിറ്ററുകൾ പോലെ) ആക്സസ് ചെയ്യുക"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"കൃത്യമായ ലൊക്കേഷൻ (GPS - നെറ്റ്വർക്ക് അധിഷ്ഠിതം) ആക്സസ് ചെയ്യുക"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"ഏകദേശ ലൊക്കേഷൻ (നെറ്റ്വർക്ക് അധിഷ്ഠിതം) ആക്സസ് ചെയ്യുക"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM കമാൻഡുകൾ അയയ്ക്കുക"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"പൂർണ്ണ നെറ്റ്വർക്ക് ആക്സസ് ഉണ്ടായിരിക്കുക"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"പ്രൊഫൈൽ, ഉപകരണ ഉടമകളെ മാനേജുചെയ്യുക"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX നില മാറ്റുക"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android ബീം കൈമാറൽ നില സ്വീകരിക്കുക"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"മീഡിയ ഔട്ട്പുട്ട് റൂട്ടുചെയ്യുക"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ഇൻസ്റ്റാൾ സെഷനുകൾ റീഡുചെയ്യുക"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ അഭ്യർത്ഥിക്കുക"</string>
</resources>
diff --git a/core/res/res/values-mn-rMN-watch/strings.xml b/core/res/res/values-mn-rMN-watch/strings.xml
index 7b2e21b..6387aed 100644
--- a/core/res/res/values-mn-rMN-watch/strings.xml
+++ b/core/res/res/values-mn-rMN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g>-ны <xliff:g id="NUMBER_1">%2$d</xliff:g> апп."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Мэдрэгч"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"харилцагчийн хаягт хандах"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"энэ цагийн байршилд хандах"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"Хуанлид хандах"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS мессежийг илгээх, харах"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"Цагныхаа зураг, медиа, файлд хандах"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"дуу хураах"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"зураг авах, бичлэг хийх"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"залгах, дуудлагыг зохион байгуулах"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"таны биеийн байдлын талаарх мэдрэгч бүхий өгөгдөлд хандах"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"статус мөр байхыг зөвшөөрөх"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"бие мэдрэгчид (зүрхний түвшин шалгагч г.м) хандах"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"тодорхой байршилд (GPS, сүлжээнд суурилсан) хандах"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"ойролцоох байршилд (сүлжээнд суурилсан) хандах"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM карт руу комманд илгээх"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"сүлжээнд бүрэн нэвтрэх"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"Профайл, төхөөрөмж эзэмшигчийг зохион байгуулах"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX статусыг солих"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam дамжуулалтын статусыг хүлээн авах"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"Медиа хадгалах байршлыг тодорхойлох"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"Суулгах үеийг унших"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"Багц суулгахыг хүсэх"</string>
</resources>
diff --git a/core/res/res/values-mr-rIN-watch/strings.xml b/core/res/res/values-mr-rIN-watch/strings.xml
index 11af412..0a60aad 100644
--- a/core/res/res/values-mr-rIN-watch/strings.xml
+++ b/core/res/res/values-mr-rIN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g> पैकी <xliff:g id="NUMBER_0">%1$d</xliff:g> अॅप"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"सेन्सर"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"आपल्या संपर्कांमध्ये प्रवेश करा"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"या घड्याळाच्या स्थानामध्ये प्रवेश करा"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"आपल्या कॅलेंडरमध्ये प्रवेश करा"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS संदेश पाठवा आणि पहा"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"आपल्या घड्याळावरील फोटो, मीडिया आणि फायलींमध्ये प्रवेश करा"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ऑडिओ रेकॉर्ड करा"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"चित्रे घ्या आणि व्हिडिओ रेकॉर्ड करा"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"फोन कॉल करा आणि व्यवस्थापित करा"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"आपल्या महत्त्वाच्या मापनांविषयी सेन्सर डेटामध्ये प्रवेश करा"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"स्टेटस बार होऊ द्या"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"शरीर सेन्सरमध्ये (हृदय गती मॉनिटरसारखे) प्रवेश करा"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"अचूक स्थानामध्ये (GPS आणि नेटवर्क-आधारित) प्रवेश करा"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"अंदाजे स्थानामध्ये (नेटवर्क-आधारित) प्रवेश करा"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"सिमला आदेश पाठवा"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"पूर्ण नेटवर्क प्रवेश आहे"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"प्रोफाईल आणि डिव्हाइस मालक व्यवस्थापित करा"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX स्थिती बदला"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android बीम स्थानांतरण स्थिती प्राप्त करा"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"मीडिया आउटपुट मार्गस्थ करा"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"स्थापना सत्र वाचा"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"पॅकेज स्थापित करण्यासाठी विनंती करा"</string>
</resources>
diff --git a/core/res/res/values-ms-rMY-watch/strings.xml b/core/res/res/values-ms-rMY-watch/strings.xml
index d8245ed..c3f68b8 100644
--- a/core/res/res/values-ms-rMY-watch/strings.xml
+++ b/core/res/res/values-ms-rMY-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Apl <xliff:g id="NUMBER_0">%1$d</xliff:g> daripada <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Penderia"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"akses kenalan anda"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"akses lokasi jam tangan ini"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"akses kalendar anda"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"hantar dan lihat mesej SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"akses foto, media dan fail pada jam tangan anda"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"rakam audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ambil gambar dan rakam video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"buat dan urus panggilan telefon"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"akses data penderia tentang tanda vital anda"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"jadi bar status"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"akses penderia badan (seperti pemantau kadar denyut jantung)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"akses lokasi tepat (GPS dan berdasarkan rangkaian)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"akses lokasi anggaran (berdasarkan rangkaian)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"hantar perintah ke SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"mempunyai akses rangkaian penuh"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"urus pemilik profil dan peranti"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"tukar keadaan WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"terima status pemindahan Pancaran Android"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"halakan output media"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"baca sesi pemasangan"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"minta pakej pemasangan"</string>
</resources>
diff --git a/core/res/res/values-my-rMM-watch/strings.xml b/core/res/res/values-my-rMM-watch/strings.xml
index 34bd033..c4d738a 100644
--- a/core/res/res/values-my-rMM-watch/strings.xml
+++ b/core/res/res/values-my-rMM-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g>၏ <xliff:g id="NUMBER_0">%1$d</xliff:g> အသေးစားဆော့ဝဲ"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"အာရုံခံကိရိယာများ"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"သင့် အဆက်အသွယ်များကို ယူသုံးရန်"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"ဒီနာရီရဲ့ တည်နေရာကို ရယူရန်"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"သင့် ပြက္ခဒိန်ကို ယူသုံးရန်"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS စာတိုများကို ပို့ရန် နှင့် ကြည့်ရန်"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"သင့်နာရီထဲက ဓာတ်ပုံများ၊ မီဒီယာ၊ နှင့် ဖိုင်များကို ရယူသုံးရန်"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"အသံ ဖမ်းရန်"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ဓာတ်ပုံ ရိုက်ရန် နှင့် ဗွီဒီယို မှတ်တမ်းတင်ရန်"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန် နှင့် စီမံရန်"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"သင်ရဲ့ အဓိက အသက်ရှင်မှုဆိုင်ရာ အာရုံခံကိရိယာ ဒေတာကို ရယူသုံးစွဲရန်"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"အခြေအနေပြ ဘားဖြစ်ပါစေ"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"ခန္ဓာကိုယ် အာရုံကိရိယာများကို (နှလုံးခုန်နှုန်း မော်နီတာလို)ကို ရယူသုံးရန်"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"တိကျတဲ့ တည်နေရာ (GPS နှင့် ကွန်ရက် အခြေခံ)ကို ရယူသုံးရန်"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"အနီးစပ်ဆုံး တည်နေရာ (ကွန်ရက် အခြေခံ)ကို ရယူသုံးရန်"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM ထံသို့ ညွှန်ကြားချက်များကို ပို့တယ်"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ကွန်ရက်ကို အပြည့်အဝ ရယူသုံးနိုင်"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"ပရိုဖိုင် နှင့် ကိရိယာ ပိုင်ရှင်များကို စီမံပါ"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX အခြေအနေကို ပြောင်းရန်"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android ရဲ့ အလင်းတန်းထိုး လွှဲပြောင်းမှု အခြေအနေကို ရယူရန်"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"မီဒီယာ ထွက်ပေါက်ကို လမ်းဖေါ်ပြပေးပါ"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"တပ်ဆင်ရေး လုပ်ကိုင်မှုကို ဖတ်ရန်"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"တပ်ဆင်ရေး အထုပ်များကို တောင်းဆိုပါ"</string>
</resources>
diff --git a/core/res/res/values-nb-watch/strings.xml b/core/res/res/values-nb-watch/strings.xml
index aba8abb..249026c 100644
--- a/core/res/res/values-nb-watch/strings.xml
+++ b/core/res/res/values-nb-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensorer"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"se kontaktene dine"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"få tilgang til posisjonen til denne klokken"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"åpne kalenderen din"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"sende og lese SMS-meldinger"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"få tilgang til bilder, media og filer på klokken din"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"spille inn lyd"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ta bilder og ta opp video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ringe og administrere anrop"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"få tilgang til sensordata om de vitale tegnene dine"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"vise appen i statusfeltet"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"få tilgang til kroppssensorer (for eksempel pulsmålere)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"få tilgang til nøyaktig posisjon (GPS- og nettverksbasert)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"få tilgang til omtrentlig posisjon (nettverksbasert)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"sende kommandoer til SIM-kortet"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"få full nettverkstilgang"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"administrere profiler og enhetseiere"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"endre WiMAX-statusen"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"motta overføringsstatus for Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"videresende medieutdata"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"lese installeringsøkter"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"be om installasjon av pakker"</string>
</resources>
diff --git a/core/res/res/values-ne-rNP-watch/strings.xml b/core/res/res/values-ne-rNP-watch/strings.xml
index fe331bd..a38de99 100644
--- a/core/res/res/values-ne-rNP-watch/strings.xml
+++ b/core/res/res/values-ne-rNP-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g> को <xliff:g id="NUMBER_0">%1$d</xliff:g> अनुप्रयोग।"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"सेन्सरहरू"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"आफ्नो सम्पर्कको पहुँच गर्नुहोस्"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"यो घडीको स्थान पहुँच गर्नुहोस्"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"आफ्नो पात्रोमा पहुँच गर्नुहोस्"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"आफ्नो समयमा फोटो, मिडिया, र फाइलहरू हेर्नुहोस्"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"अडियो रेकर्ड गर्नुहोस्"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"तस्बिरहरू खिच्नुहोस् र भिडियो रेकर्ड गर्नुहोस्"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"आफ्नो महत्त्वपूर्ण संकेत बारेको सेन्सर डेटा पहुँच गर्नुहोस्"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"वस्तुस्थिति पट्टी हुन"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"शरीरका सेन्सरहरू पहुँच गर्नुहोस् (जस्तै हृदय धड्कन निगरानी)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"सटीक स्थान पहुँच गर्नुहोस् (GPS र नेटवर्क आधारित)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"अनुमानित स्थान पहुँच गर्नुहोस् (नेटवर्क आधारित)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"यस SIM मा आदेशहरू पठाउनहोस्"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"पूर्ण नेटवर्क पहुँच प्राप्त"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"प्रोफाइल र यन्त्र मालिकहरूको व्यवस्थापन गर्नुहोस्"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX अवस्था परिवर्तन गर्नुहोस्"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam स्थानान्तरण अवस्था प्राप्त गर्नुहोस्"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"मिडिया परिणाम दिशानिर्देश गर्नुहोस्"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"स्थापना सत्रहरू पढ्नुहोस्"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"स्थापना प्याकेजहरू अनुरोध गर्नुहोस्"</string>
</resources>
diff --git a/core/res/res/values-nl-watch/strings.xml b/core/res/res/values-nl-watch/strings.xml
index bed8a11..590d146 100644
--- a/core/res/res/values-nl-watch/strings.xml
+++ b/core/res/res/values-nl-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensoren"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"toegang tot uw contacten"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"toegang tot de locatie van dit horloge"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"toegang tot uw agenda"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"sms\'jes verzenden en bekijken"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"toegang tot foto\'s, media en bestanden op uw horloge"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"audio opnemen"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"foto\'s maken en video opnemen"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"bellen en telefoontjes beheren"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"toegang tot sensorgegevens over uw vitale functies"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"de statusbalk zijn"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"toegang tot lichaamssensoren (zoals hartslagmeters)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"toegang tot precieze locatie (GPS- en netwerkgebaseerd)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"toegang tot geschatte locatie (netwerkgebaseerd)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"opdrachten verzenden naar de simkaart"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"volledige netwerktoegang"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"profiel- en apparaateigenaren beheren"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX-status wijzigen"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam-overdrachtsstatus ontvangen"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"media-uitvoer aansturen"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"installatiesessies lezen"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"installatiepakketten aanvragen"</string>
</resources>
diff --git a/core/res/res/values-pa-rIN-watch/strings.xml b/core/res/res/values-pa-rIN-watch/strings.xml
index addaa6b..e5cb9e1 100644
--- a/core/res/res/values-pa-rIN-watch/strings.xml
+++ b/core/res/res/values-pa-rIN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"ਐਪ <xliff:g id="NUMBER_1">%2$d</xliff:g> ਦਾ <xliff:g id="NUMBER_0">%1$d</xliff:g>"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"ਸੰੰਵੇਦਕ"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਪ"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"ਇਸ ਘੜੀ ਦੇ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦਿਖਾਓ"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"ਤੁਹਾਡੀ ਘੜੀ ਤੇ ਮੌਜੂਦ ਫੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ਔਡੀਓ ਰਿਕਾਰਡ ਕਰੋ"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ਤਸਵੀਰਾਂ ਖਿੱਚੋ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰੋ"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਪ੍ਰਬੰਧਿਤ ਕਰੋ"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"ਆਪਣੇ ਮਹੱਤਵਪੂਰਣ ਲੱਛਣਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ਸਥਿਤੀ ਬਾਰ ਹੋਵੋ"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"ਸਰੀਰ ਸੰਵੇਦਕਾਂ ਤੱਕ ਪਹੁੰਚ (ਜਿਵੇਂ ਦਿਲ ਦੀ ਧੜਕਣ ਦੇ ਨਿਰੀਖਕ)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"ਨਿਯਤ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਤੱਕ ਪਹੁੰਚ (GPS ਅਤੇ ਨੈਟਵਰਕ-ਆਧਾਰਿਤ)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"ਅਨੁਮਾਨਿਤ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਤੱਕ ਪਹੁੰਚ (ਨੈਟਵਰਕ-ਆਧਾਰਿਤ)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM ਨੂੰ ਕਮਾਂਡਾਂ ਭੇਜੋ"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ਪੂਰੀ ਨੈਟਵਰਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"ਪ੍ਰੋਫ਼ਾਈਲ ਅਤੇ ਡਿਵਾਈਸ ਦੇ ਮਾਲਕਾਂ ਨੂੰ ਪ੍ਰਬੰਧਿਤ ਕਰੋ"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX ਸਥਿਤੀ ਬਦਲੋ"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam ਟ੍ਰਾਂਸਫਰ ਸਥਿਤੀ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"ਰੂਟ ਮੀਡੀਆ ਆਊਟਪੁਟ"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ਇੰਸਟੌਲ ਸੈਸ਼ਨ ਪੜ੍ਹੋ"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"ਪੈਕੇਜ ਇੰਸਟੌਲ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕਰੋ"</string>
</resources>
diff --git a/core/res/res/values-pl-watch/strings.xml b/core/res/res/values-pl-watch/strings.xml
index f266d0a..ff9f7ea 100644
--- a/core/res/res/values-pl-watch/strings.xml
+++ b/core/res/res/values-pl-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplikacja <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Czujniki"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"dostęp do kontaktów"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"dostęp do lokalizacji tego zegarka"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"dostęp do kalendarza"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"wysyłanie i wyświetlanie SMS-ów"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"dostęp do zdjęć, multimediów i plików na Twoim zegarku"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"nagrywanie dźwięku"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"robienie zdjęć i nagrywanie filmów"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"nawiązywanie połączeń telefonicznych i zarządzanie nimi"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"dostęp do danych czujnika podstawowych funkcji życiowych"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"działanie jako pasek stanu"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"dostęp do czujników ciała (np. monitorujących tętno)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"dostęp do dokładnej lokalizacji (na podstawie GPS-u i sieci)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"dostęp do przybliżonej lokalizacji (na podstawie sieci)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"wysyłanie poleceń do karty SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"pełny dostęp do sieci"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"zarządzanie właścicielami profilu i urządzenia"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"zmiana stanu WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"uzyskiwanie informacji o stanie transmisji Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"kierowanie wyjścia multimediów"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"odczytywanie sesji instalacji"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"żądanie instalacji pakietów"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 1086601..82d1c02 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -421,10 +421,10 @@
<string name="permlab_useFingerprint" msgid="3150478619915124905">"używanie czytnika linii papilarnych"</string>
<string name="permdesc_useFingerprint" msgid="9165097460730684114">"Zezwala aplikacji na używanie czytnika linii papilarnych na potrzeby autoryzacji"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Odcisk palca został odczytany tylko częściowo. Spróbuj ponownie."</string>
- <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nie udało się przetworzyć linii papilarnych. Spróbuj ponownie."</string>
+ <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nie udało się przetworzyć odcisku palca. Spróbuj ponownie."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Czytnik linii papilarnych jest zabrudzony. Wyczyść go i spróbuj ponownie."</string>
- <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Palec został uniesiony zbyt szybko. Spróbuj ponownie."</string>
- <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Palec został przesunięty zbyt wolno. Spróbuj ponownie."</string>
+ <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Palec został podniesiony zbyt wcześnie. Spróbuj jeszcze raz."</string>
+ <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Palec został obrócony zbyt wolno. Spróbuj ponownie."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Czytnik linii papilarnych nie jest dostępny."</string>
@@ -433,7 +433,7 @@
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Odczyt odcisku palca został anulowany."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zbyt wiele prób. Spróbuj ponownie później."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Spróbuj ponownie."</string>
- <string name="fingerprint_name_template" msgid="5870957565512716938">"Palec <xliff:g id="FINGERID">%d</xliff:g>"</string>
+ <string name="fingerprint_name_template" msgid="5870957565512716938">"Odcisk palca <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odcisku palca"</string>
diff --git a/core/res/res/values-pt-rBR-watch/strings.xml b/core/res/res/values-pt-rBR-watch/strings.xml
index 0eb0da3..a5e4a11 100644
--- a/core/res/res/values-pt-rBR-watch/strings.xml
+++ b/core/res/res/values-pt-rBR-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensores"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"acessar seus contatos"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"acessar a localização deste relógio"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"acessar sua agenda"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"enviar e ver mensagens SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"acessar fotos, mídia e arquivos do seu relógio"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"grave áudio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"tire fotos e grave vídeos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"fazer e gerenciar chamadas telefônicas"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"acessar dados do sensor sobre seus sinais vitais"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ser a barra de status"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"acessar os sensores corporais (como monitores de frequência cardíaca)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"acessar a localização precisa (GPS e com base na rede)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"acessar a localização aproximada (com base na rede)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"enviar comandos para o SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ter acesso total à rede"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"gerenciar proprietários de perfis e de dispositivos"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"alterar estado do WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"receber status de transferência do Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"rotear saída de mídia"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ler sessões de instalação"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"solicitar pacotes de instalação"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT-watch/strings.xml b/core/res/res/values-pt-rPT-watch/strings.xml
index 1654fc3..0dd354a 100644
--- a/core/res/res/values-pt-rPT-watch/strings.xml
+++ b/core/res/res/values-pt-rPT-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplicação <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensores"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"aceder aos contactos"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"aceder à localização deste relógio"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"aceder ao calendário"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"enviar e ver mensagens SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"aceder a fotos, a multimédia e a ficheiros no relógio"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"gravar áudio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"tirar fotos e gravar vídeos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"fazer e gerir chamadas"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"aceder a dados do sensor acerca dos seus sinais vitais"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ser apresentada na barra de estado"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"aceder aos sensores corporais (como monitores do ritmo cardíaco)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"aceder à localização exata (baseada no GPS e na rede)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"aceder à localização aproximada (baseada na rede)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"enviar comandos para o SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ter acesso total à rede"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"gerir proprietários de perfis e de dispositivos"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"alterar estado do WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"receber estado de transferências do Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"encaminhar saída de som multimédia"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ler sessões de instalação"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"solicitar a instalação de pacotes"</string>
</resources>
diff --git a/core/res/res/values-pt-watch/strings.xml b/core/res/res/values-pt-watch/strings.xml
index 0eb0da3..a5e4a11 100644
--- a/core/res/res/values-pt-watch/strings.xml
+++ b/core/res/res/values-pt-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensores"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"acessar seus contatos"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"acessar a localização deste relógio"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"acessar sua agenda"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"enviar e ver mensagens SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"acessar fotos, mídia e arquivos do seu relógio"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"grave áudio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"tire fotos e grave vídeos"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"fazer e gerenciar chamadas telefônicas"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"acessar dados do sensor sobre seus sinais vitais"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"ser a barra de status"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"acessar os sensores corporais (como monitores de frequência cardíaca)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"acessar a localização precisa (GPS e com base na rede)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"acessar a localização aproximada (com base na rede)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"enviar comandos para o SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"ter acesso total à rede"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"gerenciar proprietários de perfis e de dispositivos"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"alterar estado do WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"receber status de transferência do Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"rotear saída de mídia"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ler sessões de instalação"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"solicitar pacotes de instalação"</string>
</resources>
diff --git a/core/res/res/values-ro-watch/strings.xml b/core/res/res/values-ro-watch/strings.xml
index dc3c9065..e412cad 100644
--- a/core/res/res/values-ro-watch/strings.xml
+++ b/core/res/res/values-ro-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplic. <xliff:g id="NUMBER_0">%1$d</xliff:g> din <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Senzori"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"să acceseze persoanele de contact"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"să acceseze locația acestui ceas"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"să acceseze calendarul"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"să trimită și să vadă mesajele SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"să acceseze fotografiile, conținutul media și fișierele de pe ceas"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"să înregistreze conținut audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"să fotografieze și să înregistreze videoclipuri"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"să inițieze să și gestioneze apeluri telefonice"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"să acceseze datele de la senzori despre semnele vitale"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"să fie bara de stare"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"să acceseze senzorii corporali (cum ar fi monitoarele cardiace)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"să acceseze locația exactă (bazată pe GPS și pe rețea)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"să acceseze locația aproximativă (bazată pe rețea)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"să trimită comenzi către SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"să aibă acces deplin la rețea"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"să gestioneze profilul și proprietarii dispozitivului"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"să schimbe starea WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"să primească starea transferului prin Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"să direcționeze rezultatele media"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"să citească sesiunile de instalare"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"să solicite pachete de instalare"</string>
</resources>
diff --git a/core/res/res/values-ru-watch/strings.xml b/core/res/res/values-ru-watch/strings.xml
index cd536c5..5dd5630 100644
--- a/core/res/res/values-ru-watch/strings.xml
+++ b/core/res/res/values-ru-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Приложение <xliff:g id="NUMBER_0">%1$d</xliff:g> из <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Датчики"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"доступ к контактам"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"доступ к местоположению часов"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"доступ к календарю"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"отправка и просмотр SMS-сообщений"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"доступ к фото, медиа и файлам на часах"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"запись аудио"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"фото- и видеосъемка"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"осуществление телефонных звонков и управление ими"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"доступ к данным датчиков о состоянии организма"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"замена строки состояния"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"доступ к датчикам (например, пульсометру)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"доступ к точному местоположению (на основе GPS и данных сети)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"доступ к примерному местоположению (на основе данных сети)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"отправка команд SIM-карте"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"неограниченный доступ к Интернету"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"управление профилями и владельцами"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"изменение статуса WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"получение статуса передачи Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"перенаправление мультимедийных данных"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"чтение данных о сеансах установки"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"разрешение на установку пакетов"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 821342a..f1deb22 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1038,7 +1038,7 @@
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"Передача фото через USB"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI через USB"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB-устройство подключено"</string>
- <string name="usb_notification_message" msgid="7347368030849048437">"Ещё варианты"</string>
+ <string name="usb_notification_message" msgid="7347368030849048437">"Нажмите, чтобы настроить."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Нажмите, чтобы отключить отладку по USB."</string>
<string name="select_input_method" msgid="8547250819326693584">"Выбор раскладки"</string>
diff --git a/core/res/res/values-si-rLK-watch/strings.xml b/core/res/res/values-si-rLK-watch/strings.xml
index 4adfbb5..aad82a0 100644
--- a/core/res/res/values-si-rLK-watch/strings.xml
+++ b/core/res/res/values-si-rLK-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g> හි <xliff:g id="NUMBER_1">%2$d</xliff:g> යෙදුම."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"සංවේදක"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"ඔබේ සම්බන්ධතාවලට පිවිසීම"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"මෙම ඔරලෝසුවෙහි ස්ථානයට පිවිසීම"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"ඔබේ දින දර්ශනයට පිවිසීම"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS පණිවිඩ යැවීම සහ බැලීම"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"ඔබේ ඔරලෝසුවේ ඇති ඡායාරූප, මාධ්ය සහ ගොනුවලට පිවිසීම"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ශ්රව්ය පටිගත කිරීම"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"පින්තූර ගැනීම සහ වීඩියෝ පටිගත කිරීම"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"දුරකථන ඇමතුම් සිදු කිරීම සහ කළමනාකරණය කිරීම"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"ඔබේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත වෙත පිවිසීම"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"තත්ත්ව තීරුව බවට පත්වීම"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"දේහ සංවේදකවලට (හෘද ස්පන්දන වේග මොනිටර වැනි) පිවිසීම"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"නිවැරදි ස්ථානයට (GPS සහ ජාලය පදනම් කරගත්) පිවිසීම"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"ආසන්නතම ස්ථානයට (ජාලය-පාදක වූ) පිවිසීම"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM වෙත විධාන යැවීම"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"සම්පූර්ණ ජාල ප්රවේශය තබා ගැනීම"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"පැතිකඩ සහ උපාංග හිමිකරුවන් කළමනාකරණය කිරීම"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX තත්ත්වය වෙනස් කිරීම"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android කදම්බ හුවමාරු තත්ත්වය ලබා ගැනීම"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"මාධ්ය ප්රතිදානය මාර්ගගත කිරීම"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ස්ථාපන සැසි කියවීම"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"ස්ථාපන පැකේජ ඉල්ලීම"</string>
</resources>
diff --git a/core/res/res/values-sk-watch/strings.xml b/core/res/res/values-sk-watch/strings.xml
index 24bed89..765b390 100644
--- a/core/res/res/values-sk-watch/strings.xml
+++ b/core/res/res/values-sk-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplikácia <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Senzory"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"prístup ku kontaktom"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"prístup k polohe týchto hodiniek"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"prístup ku kalendáru"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"posielanie a zobrazovanie správ SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"prístup k fotkám, médiám a súborom v hodinkách"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"zaznamenávanie zvuku"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"fotenie a zaznamenávanie videí"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"telefonovanie a správa hovorov"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"prístup k údajom senzorov o životných funkciách"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"vydávanie sa za stavový riadok"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"prístup k telesným senzorom (ako sú snímače tepu)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"prístup k presnej polohe (pomocou GPS a siete)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"prístup k približnej polohe (pomocou siete)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"posielanie príkazov do SIM karty"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"úplný prístup k sieti"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"správa vlastníkov profilov a zariadení"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"zmena stavu pripojenia WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"príjem stavu prenosov Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"smerovanie výstupu médií"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"čítanie inštalačných relácií"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"odosielanie žiadostí o inštaláciu balíčkov"</string>
</resources>
diff --git a/core/res/res/values-sl-watch/strings.xml b/core/res/res/values-sl-watch/strings.xml
index 5bc0ea5..f138326 100644
--- a/core/res/res/values-sl-watch/strings.xml
+++ b/core/res/res/values-sl-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_0">%1$d</xliff:g>. aplikac. od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Tipala"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"dostop do stikov"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"dostop do lokacije te ure"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"dostop do koledarja"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"pošiljanje in ogled sporočil SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"dostop do fotografij, predstavnosti in datotek v uri"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"snemanje zvoka"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"fotografiranje in snemanje videoposnetkov"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"opravljanje in upravljanje telefonskih klicev"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"dostop do podatkov tipala o vaših vitalnih znakih"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"postane vrstica stanja"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"dostop do tipal telesnih funkcij (npr. merilnikov srčnega utripa)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"dostop do natančne lokacije (na podlagi podatkov GPS in omrežja)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"dostop do približne lokacije (na podlagi podatkov omrežja)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"pošiljanje ukazov na kartico SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"poln dostop do omrežja"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"upravljanje lastnikov profilov in lastnika naprave"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"sprememba stanja omrežja WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"prejemanje stanja prenosov s funkcijo Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"preusmeritev predstavnosti"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"branje sej namestitev"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"zahtevanje paketov za namestitev"</string>
</resources>
diff --git a/core/res/res/values-sq-rAL-watch/strings.xml b/core/res/res/values-sq-rAL-watch/strings.xml
index 1b0bdaf..7e36a32 100644
--- a/core/res/res/values-sq-rAL-watch/strings.xml
+++ b/core/res/res/values-sq-rAL-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Aplikacioni <xliff:g id="NUMBER_0">%1$d</xliff:g> nga <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensorët"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"qasu te kontaktet e tua"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"qasu te vendndodhja e kësaj ore"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"qasu te kalendari yt"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"dërgo dhe shiko mesazhet SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"qasu te fotografitë, përmbajtjet audio-vizuale dhe skedarët në orën tënde të dorës"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"regjistro audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"bëj fotografi dhe regjistro video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"kryej dhe menaxho telefonata"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"qasu tek të dhënat e sensorëve rreth shenjave të tua jetësore"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"të bëhet shiriti i statusit"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"qasu te sensorët e trupit (si monitorimet e rrahjeve të zemrës)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"qasu te vendndodhja e përpiktë (në bazë të GPS-së dhe rrjetit)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"qasu te vendndodhja e përafërt (bazuar në rrjet)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"dërgo komanda te karta SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"qasu plotësisht në rrjet"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"menaxho zotëruesit e profilit dhe të pajisjes"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"ndrysho gjendjen WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"merr statusin e transferimit përmes \"Dërgimit me rreze të Android\""</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"kalo daljet e përmbajtjes audio-vizuale"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"lexo sesionet e instalimit"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"kërko paketat e instalimit"</string>
</resources>
diff --git a/core/res/res/values-sr-watch/strings.xml b/core/res/res/values-sr-watch/strings.xml
index ae70ab1..afeae38 100644
--- a/core/res/res/values-sr-watch/strings.xml
+++ b/core/res/res/values-sr-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Апликација <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Сензори"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"приступ контактима"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"приступ локацији овог сата"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"приступ календару"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"слање и преглед SMS порука"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"приступ сликама, медијским и другим датотекама на сату"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"снимање аудио снимака"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"снимање слика и видео снимака"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"упућивање телефонских позива и управљање њима"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"приступ подацима сензора о виталним функцијама"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"функционисање као статусне траке"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"приступ сензорима на телу (попут монитора за праћење пулса)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"приступ прецизној локацији (утврђена преко мреже и GPS-а)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"приступ приближној локацији (утврђена преко мреже)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"слање команди на SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"има пун мрежни приступ"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"управљање власницима профила и уређаја"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"мењање WiMAX статуса"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"пријем статуса пребацивања помоћу Android пребацивања"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"усмеравање излаза медија"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"читање сесија инсталирања"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"захтевање пакета за инсталирање"</string>
</resources>
diff --git a/core/res/res/values-sv-watch/strings.xml b/core/res/res/values-sv-watch/strings.xml
index aba8abb..439b464 100644
--- a/core/res/res/values-sv-watch/strings.xml
+++ b/core/res/res/values-sv-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensorer"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"få tillgång till dina kontakter"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"få tillgång till klockans plats"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"få tillgång till din kalender"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"skicka och visa sms"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"få åtkomst till foton, media och filer på klockan"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"spela in ljud"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ta bilder och spela in video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ringa och hantera telefonsamtal"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"få åtkomst till sensordata om dina vitalparametrar"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"visas i statusfältet"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"få åtkomst till kroppssensorer (till exempel pulsmätare)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"få åtkomst till din exakta position (GPS- och nätverksbaserad)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"få åtkomst till din ungefärliga position (nätverksbaserad)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"skicka kommandon till SIM-kortet"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"få fullständig nätverksåtkomst"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"hantera profil- och enhetsägare"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"ändra WiMAX-status"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"ta emot status för Android Beam-överföring"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"dirigera medieuppspelning"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"läsa installationssessioner"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"begära installationspaket"</string>
</resources>
diff --git a/core/res/res/values-sw-watch/strings.xml b/core/res/res/values-sw-watch/strings.xml
index 929022f..3cad827 100644
--- a/core/res/res/values-sw-watch/strings.xml
+++ b/core/res/res/values-sw-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Programu ya <xliff:g id="NUMBER_0">%1$d</xliff:g> kati ya <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Vihisi"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"fikia anwani zako"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"tambua mahali saa hii ilipo"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"fikia kalenda yako"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"tuma na uangalie ujumbe wa SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"fikia picha, maudhui na faili kwenye saa yako"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"rekodi sauti"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"piga picha na urekodi video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"piga na udhibiti simu"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"fikia data ya kihisi kuhusu alama zako muhimu"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"kuwa sehemu ya arifa"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"fikia vihisi vya mwili (kama vifuatiliaji vya mapigo ya moyo)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"fikia mahali halisi (inategemea mtandao na GPS)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"fikia mahali karibu na hapo (inategemea mtandao)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"tuma amri kwenye SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"pata ufikiaji kamili wa mtandao"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"simamia wamiliki wa wasifu na vifaa"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"badilisha hali ya WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"pokea hali ya uhamisho wa Boriti ya Android"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"tuma njia ya kutoa maudhui"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"soma vipindi vya kusakinisha"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"omba ruhusa ya kusakinisha vifurushi"</string>
</resources>
diff --git a/core/res/res/values-ta-rIN-watch/strings.xml b/core/res/res/values-ta-rIN-watch/strings.xml
index 23accbc..63e072f 100644
--- a/core/res/res/values-ta-rIN-watch/strings.xml
+++ b/core/res/res/values-ta-rIN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"பயன்பாடு: <xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"உணர்விகள்"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"தொடர்புகளை அணுகும்"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"இந்த வாட்சின் இருப்பிடத்தை அணுகும்"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"கேலெண்டரை அணுகும்"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS செய்திகளை அனுப்பும் மற்றும் பார்க்கும்"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"உங்கள் வாட்சில் உள்ள படங்கள், மீடியா மற்றும் கோப்புகளை அணுகும்"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ஆடியோவைப் பதிவுசெய்யும்"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"படங்களை எடுக்கும், வீடியோவைப் பதிவுசெய்யும்"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"மொபைல் அழைப்புகளைச் செய்யும், பெறும்"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"உங்கள் உடலியக்கக் குறிகள் பற்றிய உணர்வித் தரவை அணுகும்"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"நிலைப் பட்டியில் இருக்கும்"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"உடல் உணர்விகளை (இதயத் துடிப்பு மானிட்டர்கள் போன்றவை) அணுகும்"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"துல்லியமான இருப்பிடத்தை அணுகும் (GPS மற்றும் நெட்வொர்க் அடிப்படையில்)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"தோராயமான இருப்பிடத்தை அணுகும் (நெட்வொர்க் அடிப்படையில்)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"கட்டளைகளை சிம்மிற்கு அனுப்பும்"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"முழுமையான நெட்வொர்க் அணுகலைக் கொண்டிருக்கும்"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"சுயவிவரத்தையும் சாதன உரிமையாளர்களையும் நிர்வகிக்கும்"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX நிலையை மாற்றும்"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android பீம் பரிமாற்ற நிலையைப் பெறும்"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"மீடியா அவுட்புட்டை ரூட் செய்யும்"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"நிறுவல் அமர்வுகளைப் படிக்கும்"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"நிறுவல் தொகுப்புகளைக் கோரும்"</string>
</resources>
diff --git a/core/res/res/values-te-rIN-watch/strings.xml b/core/res/res/values-te-rIN-watch/strings.xml
index 0843471..f642807 100644
--- a/core/res/res/values-te-rIN-watch/strings.xml
+++ b/core/res/res/values-te-rIN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g>లో <xliff:g id="NUMBER_0">%1$d</xliff:g>వ అనువర్తనం."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"సెన్సార్లు"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"మీ పరిచయాలను ప్రాప్యత చేస్తుంది"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"ఈ గడియారం స్థానాన్ని ప్రాప్యత చేస్తుంది"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"మీ క్యాలెండర్ను ప్రాప్యత చేస్తుంది"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS సందేశాలను పంపుతుంది మరియు చూస్తుంది"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"మీ గడియారంలోని ఫోటోలు, మీడియా మరియు ఫైల్లను ప్రాప్యత చేస్తుంది"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ఆడియోను రికార్డ్ చేస్తుంది"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"చిత్రాలను తీస్తుంది మరియు వీడియోను రికార్డ్ చేస్తుంది"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"ఫోన్ కాల్లు చేస్తుంది మరియు నిర్వహిస్తుంది"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని ప్రాప్యత చేస్తుంది"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"స్థితి పట్టీగా ఉంటుంది"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"శరీర సెన్సార్లను (హృదయ స్పందన రేటు మానిటర్ల వంటివి) ప్రాప్యత చేస్తుంది"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"ఖచ్చితమైన స్థానాన్ని (GPS మరియు నెట్వర్క్-ఆధారితం) ప్రాప్యత చేస్తుంది"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"సమీప స్థానాన్ని (నెట్వర్క్-ఆధారితం) ప్రాప్యత చేస్తుంది"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIMకి ఆదేశాలు పంపుతుంది"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"పూర్తి నెట్వర్క్ ప్రాప్యతను కలిగి ఉంటుంది"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"ప్రొఫైల్ మరియు పరికరం యజమానులను నిర్వహిస్తుంది"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX స్థితిని మారుస్తుంది"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam బదిలీ స్థితిని స్వీకరిస్తుంది"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"మీడియా అవుట్పుట్ మార్గం నిర్దేశిస్తుంది"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"ఇన్స్టాల్ సెషన్లను చదువుతుంది"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"ఇన్స్టాల్ ప్యాకేజీలను అభ్యర్థిస్తుంది"</string>
</resources>
diff --git a/core/res/res/values-th-watch/strings.xml b/core/res/res/values-th-watch/strings.xml
index 9cc21b0..98f938d 100644
--- a/core/res/res/values-th-watch/strings.xml
+++ b/core/res/res/values-th-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"แอป <xliff:g id="NUMBER_0">%1$d</xliff:g> จาก <xliff:g id="NUMBER_1">%2$d</xliff:g> แอป"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"เซ็นเซอร์"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"เข้าถึงรายชื่อติดต่อ"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"เข้าถึงตำแหน่งของนาฬิกานี้"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"เข้าถึงปฏิทิน"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"ส่งและดูข้อความ SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"เข้าถึงรูปภาพ สื่อ และไฟล์ในนาฬิกา"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"บันทึกเสียง"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"ถ่ายภาพและบันทึกวิดีโอ"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"โทรและจัดการการโทร"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"เข้าถึงข้อมูลเซ็นเซอร์เกี่ยวกับสัญญาณชีพของคุณ"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"เป็นแถบสถานะ"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"เข้าถึงเซ็นเซอร์สำหรับร่างกาย (เช่น เครื่องติดตามดูอัตราการเต้นของหัวใจ)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"เข้าถึงตำแหน่งที่แม่นยำ (อิงจาก GPS และเครือข่าย)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"เข้าถึงตำแหน่งโดยประมาณ (อิงจากเครือข่าย)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"ส่งคำสั่งไปยังซิม"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"มีสิทธิ์เข้าถึงเครือข่ายเต็มรูปแบบ"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"จัดการเจ้าของโปรไฟล์และอุปกรณ์"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"เปลี่ยนสถานะของ WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"รับสถานะการโอน Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"กำหนดเส้นทางเอาต์พุตของสื่อ"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"อ่านเซสชันการติดตั้ง"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"ขอติดตั้งแพ็กเกจ"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 9804f99..b2df636 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1026,7 +1026,7 @@
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"เชื่อมต่อกับอุปกรณ์เสริม USB แล้ว"</string>
<string name="usb_notification_message" msgid="7347368030849048437">"แตะเพื่อดูตัวเลือกเพิ่มเติม"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อการแก้ไขข้อบกพร่อง USB แล้ว"</string>
- <string name="adb_active_notification_message" msgid="1016654627626476142">"แตะเพื่อปิดใช้งานการแก้ไขข้อบกพร่องของ USB"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"แตะเพื่อปิดใช้งานการแก้ไขข้อบกพร่อง USB"</string>
<string name="select_input_method" msgid="8547250819326693584">"เปลี่ยนแป้นพิมพ์"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"เลือกแป้นพิมพ์"</string>
<string name="show_ime" msgid="9157568568695230830">"แสดงวิธีการป้อนข้อมูล"</string>
diff --git a/core/res/res/values-tl-watch/strings.xml b/core/res/res/values-tl-watch/strings.xml
index 3fba2dc..c38891e 100644
--- a/core/res/res/values-tl-watch/strings.xml
+++ b/core/res/res/values-tl-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> ng <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Mga Sensor"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"i-access ang iyong mga contact"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"i-access ang lokasyon ng relong ito"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"i-access ang iyong kalendaryo"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"magpadala at tumingin ng mga mensaheng SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"i-access ang mga larawan, media at mga file sa iyong relo"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"mag-record ng audio"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"kumuha ng mga larawan at mag-record ng video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"tumawag sa telepono at mamahala ng mga tawag sa telepono"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"i-access ang data ng sensor tungkol sa iyong mahahalagang senyales"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"maging status bar"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"i-access ang mga sensor sa katawan (tulad ng mga monitor ng bilis ng tibok ng puso)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"i-access ang tumpak na lokasyon (batay sa GPS at network)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"i-access ang tinatantyang lokasyon (batay sa network)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"magpadala ng mga command sa SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"magkaroon ng ganap na access sa network"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"pamahalaan ang mga may-ari ng profile at device"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"baguhin ang status ng WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"tanggapin ang status ng paglilipat ng Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"iruta ang output ng media"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"basahin ang mga session ng pag-install"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"humiling ng mga package sa pag-install"</string>
</resources>
diff --git a/core/res/res/values-tr-watch/strings.xml b/core/res/res/values-tr-watch/strings.xml
index b34ad74..4dbf664 100644
--- a/core/res/res/values-tr-watch/strings.xml
+++ b/core/res/res/values-tr-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Uygulama <xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensörler"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"kişilerinize erişme"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"bu saatin konum bilgilerine erişme"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"takviminize erişme"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS iletileri gönderme ve görüntüleme"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"saatinizdeki fotoğraflara, medyaya ve dosyalara erişme"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ses kaydetme"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"fotoğraf çekme ve video kaydetme"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"telefon aramaları yapma ve çağrıları yönetme"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"hayati belirtilerinizle ilgili sensör verilerine erişme"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"durum çubuğunda olma"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"vücut sensörlerine erişme (nabız takip cihazları gibi)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"konumunuza hassas olarak erişme (GPS ve ağ tabanlı)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"konumunuza yaklaşık olarak erişme (ağ tabanlı)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM karta komut gönderme"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"tam ağ erişimine sahip olma"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"profili ve cihaz sahiplerini yönetme"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX durumunu değiştirme"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam aktarım durumunu alma"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"medya çıkışını yönlendirme"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"yükleme oturumlarını okuma"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"paketleri yükleme isteğinde bulunma"</string>
</resources>
diff --git a/core/res/res/values-uk-watch/strings.xml b/core/res/res/values-uk-watch/strings.xml
index 4141b08..63ddea9 100644
--- a/core/res/res/values-uk-watch/strings.xml
+++ b/core/res/res/values-uk-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Додаток <xliff:g id="NUMBER_0">%1$d</xliff:g> з <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Датчики"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"отримувати доступ до контактів"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"отримувати геодані з годинника"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"отримувати доступ до календаря"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"надсилати та переглядати SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"отримувати доступ до фотографій, медіа-вмісту й інших файлів на годиннику"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"записувати аудіо"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"фотографувати та записувати відео"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"телефонувати та керувати дзвінками"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"отримувати життєві показники з датчиків"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"відображатися як рядок стану"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"отримувати дані з датчиків на тілі (наприклад, з пульсометра)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"отримувати дані про точне місцезнаходження (на основі GPS і мережі)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"отримувати дані про приблизне місцезнаходження (на основі мережі)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"надсилати команди на SIM-карту"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"отримувати повний доступ до мережі"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"керувати власниками профілів і пристроїв"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"змінювати стан WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"отримувати інформацію про стан функції Передавання даних Android"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"вибирати маршрути виводу медіа-вмісту"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"отримувати дані про сеанси встановлення"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"надсилати запити на пакети встановлення"</string>
</resources>
diff --git a/core/res/res/values-ur-rPK-watch/strings.xml b/core/res/res/values-ur-rPK-watch/strings.xml
index f90af0b..8ba8042 100644
--- a/core/res/res/values-ur-rPK-watch/strings.xml
+++ b/core/res/res/values-ur-rPK-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"ایپ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g>۔"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"سینسرز"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"اپنے رابطوں تک رسائی حاصل کریں"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"اس گھڑی کے مقام تک رسائی حاصل کریں"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"اپنے کیلنڈر تک رسائی حاصل کریں"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS پیغامات بھیجیں اور دیکھیں"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"اپنی گھڑی پر تصاویر، میڈیا اور فائلوں تک رسائی حاصل کریں"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"آڈیو ریکارڈ کریں"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"تصاویر لیں اور ویڈیو ریکارڈ کریں"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"فون کالز کریں اور ان کا نظم کریں"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"اپنی علامات حیات کے متعلق سنسر ڈیٹا تک رسائی حاصل کریں"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"بطور اسٹیٹس بار کام لیں"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"باڈی سینسرز تک رسائی حاصل کریں (جیسے دل کی دھڑکن کے مانیٹرز)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"قطعی مقام تک رسائی حاصل کریں (GPS اور نیٹ ورک پر مبنی)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"تخمینی مقام تک رسائی حاصل کریں (نیٹ ورک پر مبنی)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM کو ہدایات بھیجیں"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"پورے نیٹ ورک تک رسائی حاصل کریں"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"پروفائل اور آلہ کے مالکان کا نظم کریں"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX کی حیثیت تبدیل کریں"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam منتقلی کی صورت حال موصول کریں"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"میڈیا آؤٹ پٹ کی سمت طے کریں"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"انسٹال سیشنز پڑھیں"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"پیکجز انسٹال کرنے کی درخواست کریں"</string>
</resources>
diff --git a/core/res/res/values-uz-rUZ-watch/strings.xml b/core/res/res/values-uz-rUZ-watch/strings.xml
index 42fe54a..0fe54a1 100644
--- a/core/res/res/values-uz-rUZ-watch/strings.xml
+++ b/core/res/res/values-uz-rUZ-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"<xliff:g id="NUMBER_1">%2$d</xliff:g>dan <xliff:g id="NUMBER_0">%1$d</xliff:g> ilova."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Sensorlar"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"kontaktlarga kirishga ruxsat berish"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"mazkur soatning joylashgan joyini ko‘rishga ruxsat berish"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"taqvim ma’lumotlariga kirish"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"SMS xabarlarni yuborish va ko‘rish"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"Soatingizdagi rasmlar, media va fayllarga kirish"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ovoz yozib olish"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"rasmga tushirish va videoga olish"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"telefon qo‘ng‘iroqlarini amalga oshirish va boshqarish"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"asosiy belgilaringiz haqidagi sezgich ma’lumotlaridan foydalanishga ruxsat"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"holat qatorida ko‘rinishi"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"tana sezgichlari (m-n, yurak urishi sensori) ma’lumotlaridan foydalanishga ruxsat"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"aniq joylashuv (GPS va tarmoqqa asoslanib) ma’lumotlaridan foydalanishga ruxsat"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"taxminiy joylashuv (tarmoq asosida) ma’lumotlaridan foydalanishga ruxsat"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"SIM kartaga buyruqlar yuborish"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"to‘liq tarmoqdan foydalanish ruxsatiga ega"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"profil va qurilma egalarini boshqarish"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"WiMAX holatini o‘zgartirish"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"Android Beam o‘tkazmasi holati haqidagi ma’lumotlarni olish"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"media chiqishni yo‘naltirish"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"o‘rnatish seansi ma’lumotlarini o‘qish"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"paketlarni o‘rnatish so‘rovini yuborish"</string>
</resources>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 492f3d7..325ad91 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -414,18 +414,18 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Ilova qisqa masofali aloqa (NFC) texnologiyasi yordamida NFC yorliqlari, kartalar va o‘qish moslamalari bilan ma’lumot almashishi mumkin."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ekran qulfini o‘chirib qo‘yish"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ilovaga ekran qulfini va har qanday parol yordamidagi xavfsizlik himoyalarini o‘chirishga ruxsat beradi. Masalan, kirish qo‘ng‘irog‘ida telefon ekran qulfini o‘chiradi va qo‘ng‘iroq tugashi bilan qulfni yoqadi."</string>
- <string name="permlab_manageFingerprint" msgid="5640858826254575638">"barmoq izi sensorini boshqarish"</string>
+ <string name="permlab_manageFingerprint" msgid="5640858826254575638">"barmoq izi skanerini boshqarish"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Ilova foydalanish uchun barmoq izi namunalarini qo‘shish va o‘chirish usullarini qo‘llashi mumkin."</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"barmoq izi sensoridan foydalanish"</string>
<string name="permdesc_useFingerprint" msgid="9165097460730684114">"Ilova haqiqiylikni tekshirish uchun barmoq izi sensoridan foydalanishi mumkin"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"Barmoq izi qisman aniqlandi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Barmoq izi aniqlanmadi. Qayta urinib ko‘ring."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Barmoq izi sensori kirlangan. Uni tozalab, keyin qayta urinib ko‘ring."</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Barmoq izi skaneri kirlangan. Uni tozalab, keyin qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Barmoq juda tez harakatlandi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Barmoq juda sekin harakatlandi. Qayta urinib ko‘ring."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmoq izi sensori ish holatida emas."</string>
+ <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmoq izi skaneri ish holatida emas."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmoq izini saqlab bo‘lmadi. Mavjud barmoq izlaridan birini o‘chirib tashlang."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Barmoq izi tekshiruvi bekor qilindi."</string>
@@ -676,7 +676,7 @@
<string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"To‘xtatish"</string>
<string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"Orqaga o‘tkazish"</string>
<string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"Oldinga o‘tkazish"</string>
- <string name="emergency_calls_only" msgid="6733978304386365407">"Faqat favqulodda chaqiruvlar"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"Faqat favqulodda qo‘ng‘iroqlar"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Tarmoq qulflangan"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-karta PUK kod bilan qulflangan."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Foydalanuvchi qo‘llanmasiga qarang yoki Abonentlarni qo‘llab-quvvatlash markaziga murojaat qiling."</string>
@@ -1024,9 +1024,9 @@
<string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB orqali rasm o‘tkazish"</string>
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB orqali MIDI"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB jihozga ulangan"</string>
- <string name="usb_notification_message" msgid="7347368030849048437">"Boshqa variantlar"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozlikni tuzatish"</string>
- <string name="adb_active_notification_message" msgid="1016654627626476142">"O‘chirib qo‘yish uchun bosing"</string>
+ <string name="usb_notification_message" msgid="7347368030849048437">"Sozlash uchun bosing."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozliklarni tuzatish"</string>
+ <string name="adb_active_notification_message" msgid="1016654627626476142">"O‘chirib qo‘yish uchun bosing."</string>
<string name="select_input_method" msgid="8547250819326693584">"Klaviaturani o‘zgartirish"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Klaviaturani tanlash"</string>
<string name="show_ime" msgid="9157568568695230830">"Kiritish usulini ko‘rish"</string>
diff --git a/core/res/res/values-vi-watch/strings.xml b/core/res/res/values-vi-watch/strings.xml
index 634d890..8bfd3df 100644
--- a/core/res/res/values-vi-watch/strings.xml
+++ b/core/res/res/values-vi-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Ứng dụng <xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Cảm biến"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"truy cập danh bạ của bạn"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"truy cập vị trí của đồng hồ này"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"truy cập lịch của bạn"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"gửi và xem tin nhắn SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"truy cập ảnh, phương tiện và tệp trên đồng hồ của bạn"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"ghi âm"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"chụp ảnh và quay video"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"thực hiện và quản lý cuộc gọi điện thoại"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"truy cập dữ liệu cảm biến về dấu hiệu sinh tồn của bạn"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"trở thành thanh trạng thái"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"truy cập cảm biến cơ thể (như máy đo nhịp tim)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"truy cập vị trí chính xác (dựa vào mạng và GPS)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"truy cập vị trí gần đúng (dựa vào mạng)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"gửi lệnh đến SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"có quyền truy cập mạng đầy đủ"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"quản lý chủ sở hữu thiết bị và hồ sơ"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"thay đổi trạng thái WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"nhận trạng thái chuyển của Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"định tuyến thiết bị ra phương tiện"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"đọc phiên cài đặt"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"yêu cầu gói cài đặt"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN-watch/strings.xml b/core/res/res/values-zh-rCN-watch/strings.xml
index 8864701..f336907 100644
--- a/core/res/res/values-zh-rCN-watch/strings.xml
+++ b/core/res/res/values-zh-rCN-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"应用:<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g>。"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"传感器"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"使用您的通讯录"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"访问此手表的位置信息"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"访问您的日历"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"发送和查看短信"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"访问您手表中的照片、媒体和文件"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"录制音频"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"拍摄照片和录制视频"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"拨打电话和管理通话"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"访问与您的生命体征相关的传感器数据"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"用作状态栏"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"访问身体传感器(如心率监测器)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"访问确切位置信息(以 GPS 和网络为依据)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"访问大致位置信息(以网络为依据)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"向 SIM 卡发送命令"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"拥有完全的网络访问权限"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"管理个人资料和设备所有者"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"更改 WiMAX 状态"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"接收 Android Beam 的传输状态"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"更改媒体输出线路"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"读取安装会话"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"请求安装文件包"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK-watch/strings.xml b/core/res/res/values-zh-rHK-watch/strings.xml
index 356e853..b5ecb08 100644
--- a/core/res/res/values-zh-rHK-watch/strings.xml
+++ b/core/res/res/values-zh-rHK-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"應用程式 (<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>)"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"感應器"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"存取您的通訊錄"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"存取此手錶的位置"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"存取您的日曆"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"傳送和查看短訊"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"存取手錶上的相片、媒體和檔案"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"錄製語音"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"拍攝和錄製影片"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"撥打電話及管理通話"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"存取與您生命體徵相關的感應器資料"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"成為狀態列"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"存取身體感應器 (例如心跳監測器)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"存取精確位置 (根據 GPS 和網絡)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"存取約略位置 (根據網絡)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"發送指令至 SIM 卡"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"擁有全面網絡存取權"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"管理個人檔案和裝置擁有者"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"變更 WiMAX 狀態"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"接收 Android Beam 的傳送狀態"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"轉送媒體輸出"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"讀取安裝工作階段"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"要求安裝套件"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW-watch/strings.xml b/core/res/res/values-zh-rTW-watch/strings.xml
index 20ef6ba..79fb99d 100644
--- a/core/res/res/values-zh-rTW-watch/strings.xml
+++ b/core/res/res/values-zh-rTW-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"應用程式 <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>。"</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"感應器"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"存取您的聯絡人"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"存取這個手錶的位置資訊"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"存取您的日曆"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"傳送及查看簡訊"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"存取手錶上的相片、媒體和檔案"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"錄音"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"拍照及錄製影片"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"撥打電話及管理通話"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"存取生命徵象相關感應器資料"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"用作狀態列"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"存取人體感測器 (例如心跳速率監測器)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"存取精確位置 (以 GPS 和網路為依據)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"存取概略位置 (以網路為依據)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"傳送指令到 SIM 卡"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"擁有完整的網路存取權"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"管理個人資料和裝置擁有者"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"變更 WiMAX 狀態"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"接收 Android Beam 的傳輸狀態"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"轉送媒體輸出"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"讀取安裝工作階段"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"索取安裝套件"</string>
</resources>
diff --git a/core/res/res/values-zu-watch/strings.xml b/core/res/res/values-zu-watch/strings.xml
index 22b8af7..e9121b9 100644
--- a/core/res/res/values-zu-watch/strings.xml
+++ b/core/res/res/values-zu-watch/strings.xml
@@ -21,48 +21,26 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="android_upgrading_apk" msgid="1090732262010398759">"Uhlelo lokusebenza olungu-<xliff:g id="NUMBER_0">%1$d</xliff:g> kokungu-<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <!-- no translation found for permgrouplab_sensors (202675452368612754) -->
- <skip />
- <!-- no translation found for permgrouplab_contactswear (2340286500790908344) -->
- <skip />
- <!-- no translation found for permgrouplab_locationwear (6275317222482780209) -->
- <skip />
- <!-- no translation found for permgrouplab_calendarwear (441900844045065081) -->
- <skip />
- <!-- no translation found for permgrouplab_smswear (6849506550342974220) -->
- <skip />
- <!-- no translation found for permgrouplab_storagewear (1003807594193602313) -->
- <skip />
- <!-- no translation found for permgrouplab_microphonewear (1047561180980891136) -->
- <skip />
- <!-- no translation found for permgrouplab_camerawear (4543951283103407017) -->
- <skip />
- <!-- no translation found for permgrouplab_phonewear (134365036753766126) -->
- <skip />
- <!-- no translation found for permgrouplab_sensorswear (1429324744329327663) -->
- <skip />
- <!-- no translation found for permlab_statusBarServicewear (2469402818964691034) -->
- <skip />
- <!-- no translation found for permlab_bodySensorswear (7857941041202791873) -->
- <skip />
- <!-- no translation found for permlab_accessFineLocationwear (5584423486924377563) -->
- <skip />
- <!-- no translation found for permlab_accessCoarseLocationwear (5880746016230166090) -->
- <skip />
- <!-- no translation found for permlab_sim_communicationwear (1899198085342781874) -->
- <skip />
- <!-- no translation found for permlab_createNetworkSocketswear (6467042386273822913) -->
- <skip />
- <!-- no translation found for permlab_manageProfileAndDeviceOwnerswear (7313340516937821847) -->
- <skip />
- <!-- no translation found for permlab_changeWimaxStatewear (3828470843939853744) -->
- <skip />
- <!-- no translation found for permlab_handoverStatuswear (4835786819716499249) -->
- <skip />
- <!-- no translation found for permlab_route_media_outputwear (8737024341474587192) -->
- <skip />
- <!-- no translation found for permlab_readInstallSessionswear (9059478058685861989) -->
- <skip />
- <!-- no translation found for permlab_requestInstallPackageswear (4982025836783539503) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="202675452368612754">"Izinzwa"</string>
+ <string name="permgrouplab_contactswear" msgid="2340286500790908344">"finyelela koxhumana nabo"</string>
+ <string name="permgrouplab_locationwear" msgid="6275317222482780209">"finyelela indawo yaleli washi"</string>
+ <string name="permgrouplab_calendarwear" msgid="441900844045065081">"finyelela kukhalenda yakho"</string>
+ <string name="permgrouplab_smswear" msgid="6849506550342974220">"thumela uphinde ubuke imilayezo ye-SMS"</string>
+ <string name="permgrouplab_storagewear" msgid="1003807594193602313">"finyelela izithombe, imidiya, namafayela kuwashi lakho"</string>
+ <string name="permgrouplab_microphonewear" msgid="1047561180980891136">"rekhoda ividiyo"</string>
+ <string name="permgrouplab_camerawear" msgid="4543951283103407017">"thatha izithombe uphinde urekhode ividiyo"</string>
+ <string name="permgrouplab_phonewear" msgid="134365036753766126">"yenza uphinde uphathe amakholi wefoni"</string>
+ <string name="permgrouplab_sensorswear" msgid="1429324744329327663">"finyelela idatha yenzwa mayelana nezimpawu zakho ezibalulekile"</string>
+ <string name="permlab_statusBarServicewear" msgid="2469402818964691034">"yiba yibha yesimo"</string>
+ <string name="permlab_bodySensorswear" msgid="7857941041202791873">"finyelela kuzinzwa zomzimba (ezifana neziqaphi zokulinganisela inhliziyo)"</string>
+ <string name="permlab_accessFineLocationwear" msgid="5584423486924377563">"finyelela indawo enembile (i-GPS nesuselwa kunethiwekhi)"</string>
+ <string name="permlab_accessCoarseLocationwear" msgid="5880746016230166090">"finyelela kundawo elinganiselwe (esuselwa kunethiwekhi)"</string>
+ <string name="permlab_sim_communicationwear" msgid="1899198085342781874">"thumela imilayezo ku-SIM"</string>
+ <string name="permlab_createNetworkSocketswear" msgid="6467042386273822913">"iba nokufinyelela okugcwele kwenethiwekhi"</string>
+ <string name="permlab_manageProfileAndDeviceOwnerswear" msgid="7313340516937821847">"phatha iphrofayela nabanikazi bedivayisi"</string>
+ <string name="permlab_changeWimaxStatewear" msgid="3828470843939853744">"shintsha isimo se-WiMAX"</string>
+ <string name="permlab_handoverStatuswear" msgid="4835786819716499249">"thola isimo sokudlulisa se-Android Beam"</string>
+ <string name="permlab_route_media_outputwear" msgid="8737024341474587192">"yenza umzila ukukhipha kwemidiya"</string>
+ <string name="permlab_readInstallSessionswear" msgid="9059478058685861989">"funda izikhathi zokufaka"</string>
+ <string name="permlab_requestInstallPackageswear" msgid="4982025836783539503">"cela amaphakheji wokufaka"</string>
</resources>
diff --git a/graphics/java/android/graphics/drawable/DrawableInflater.java b/graphics/java/android/graphics/drawable/DrawableInflater.java
index f3657d3..348af70d 100644
--- a/graphics/java/android/graphics/drawable/DrawableInflater.java
+++ b/graphics/java/android/graphics/drawable/DrawableInflater.java
@@ -203,7 +203,10 @@
throw ie;
} catch (ClassNotFoundException e) {
// If loadClass fails, we should propagate the exception.
- throw new InflateException("Class not found " + className);
+ final InflateException ie = new InflateException(
+ "Class not found " + className);
+ ie.initCause(e);
+ throw ie;
} catch (Exception e) {
final InflateException ie = new InflateException(
"Error inflating class " + className);
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index d9469d4..1a0ba6f 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -1366,6 +1366,14 @@
}
@Override
+ public void jumpToCurrentState() {
+ final ChildDrawable[] children = mLayerState.mChildren;
+ for (int i = 0, count = mLayerState.mNum; i < count; i++) {
+ children[i].mDrawable.jumpToCurrentState();
+ }
+ }
+
+ @Override
public boolean isStateful() {
return mLayerState.isStateful();
}
diff --git a/libs/androidfw/Android.mk b/libs/androidfw/Android.mk
index 2f28700..f682fb8 100644
--- a/libs/androidfw/Android.mk
+++ b/libs/androidfw/Android.mk
@@ -40,10 +40,9 @@
# For the host
# =====================================================
include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_MODULE:= libandroidfw
-LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_CFLAGS += -DSTATIC_ANDROIDFW_FOR_TOOLS
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
LOCAL_SRC_FILES:= $(hostSources)
@@ -56,13 +55,10 @@
# =====================================================
include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_MODULE:= libandroidfw
-LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES:= $(deviceSources)
LOCAL_C_INCLUDES := \
- external/zlib \
system/core/include
LOCAL_STATIC_LIBRARIES := libziparchive libbase
LOCAL_SHARED_LIBRARIES := \
diff --git a/media/java/android/mtp/MtpObjectInfo.java b/media/java/android/mtp/MtpObjectInfo.java
index a080c73..64aa997 100644
--- a/media/java/android/mtp/MtpObjectInfo.java
+++ b/media/java/android/mtp/MtpObjectInfo.java
@@ -294,6 +294,11 @@
mObjectInfo.mThumbPixWidth = objectInfo.mThumbPixWidth;
}
+ public Builder setObjectHandle(int value) {
+ mObjectInfo.mHandle = value;
+ return this;
+ }
+
public Builder setAssociationDesc(int value) {
mObjectInfo.mAssociationDesc = value;
return this;
diff --git a/packages/BackupRestoreConfirmation/res/values-it/strings.xml b/packages/BackupRestoreConfirmation/res/values-it/strings.xml
index 2325d40..b84edbc 100644
--- a/packages/BackupRestoreConfirmation/res/values-it/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-it/strings.xml
@@ -29,7 +29,7 @@
<string name="device_encryption_backup_text" msgid="5866590762672844664">"Inserisci la tua password di crittografia dispositivo di seguito. Verrà utilizzata anche per crittografare l\'archivio di backup."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Inserisci una password da utilizzare per la crittografia dei dati di backup completi. Se non ne inserisci una, verrà utilizzata la tua password di backup corrente:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Se desideri crittografare tutti i dati di backup, inserisci una password qui di seguito:"</string>
- <string name="backup_enc_password_required" msgid="7889652203371654149">"Il dispositivo è crittografato, pertanto devi crittografare il backup. Inserisci una password di seguito:"</string>
+ <string name="backup_enc_password_required" msgid="7889652203371654149">"Il dispositivo è criptato, quindi devi criptare il backup. Inserisci una password di seguito:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Se i dati di ripristino sono crittografati, inserisci la password qui di seguito:"</string>
<string name="toast_backup_started" msgid="550354281452756121">"Avvio del backup..."</string>
<string name="toast_backup_ended" msgid="3818080769548726424">"Backup terminato"</string>
diff --git a/packages/DocumentsUI/Android.mk b/packages/DocumentsUI/Android.mk
index 3430bb47..c21c5cc 100644
--- a/packages/DocumentsUI/Android.mk
+++ b/packages/DocumentsUI/Android.mk
@@ -5,9 +5,25 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 \
- android-support-v7-recyclerview \
- guava
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+# The design lib requires that the client package use appcompat themes.
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat
+# Supplies material design components, e.g. Snackbar.
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-design
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-recyclerview
+LOCAL_STATIC_JAVA_LIBRARIES += guava
+
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+# Not quite sure why it is necessary to explicitly pull in resources from the
+# appcompat lib, but the demo code indicates it's necessary (see
+# development/samples/Support7Demos/Android.mk)
+LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
+LOCAL_RESOURCE_DIR += frameworks/support/design/res
+
+# Again, required to pull in appcompat resources. See abovementioned demo code.
+LOCAL_AAPT_FLAGS := --auto-add-overlay
+LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
+LOCAL_AAPT_FLAGS += --extra-packages android.support.design
LOCAL_PACKAGE_NAME := DocumentsUI
LOCAL_CERTIFICATE := platform
diff --git a/packages/DocumentsUI/res/layout/fixed_layout.xml b/packages/DocumentsUI/res/layout/fixed_layout.xml
index 221de13..9769f26 100644
--- a/packages/DocumentsUI/res/layout/fixed_layout.xml
+++ b/packages/DocumentsUI/res/layout/fixed_layout.xml
@@ -25,7 +25,8 @@
android:layout_height="?android:attr/actionBarSize"
android:background="?android:attr/colorPrimary"
android:elevation="8dp"
- android:theme="?android:attr/actionBarTheme">
+ android:theme="?actionBarTheme"
+ android:popupTheme="?actionBarPopupTheme">
<Spinner
android:id="@+id/stack"
diff --git a/packages/DocumentsUI/res/values-sw720dp/styles.xml b/packages/DocumentsUI/res/values-sw720dp/styles.xml
index 0b03a94..f4bc88e 100644
--- a/packages/DocumentsUI/res/values-sw720dp/styles.xml
+++ b/packages/DocumentsUI/res/values-sw720dp/styles.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="DialogWhenReallyLarge" parent="@*android:style/Theme.Material.DayNight.Dialog">
+ <style name="DocumentsBaseTheme" parent="@*android:style/Theme.Material.DayNight.Dialog">
<!-- We do not specify width of window here because the max size of
floating window specified by windowFixedWidthis is limited. -->
<item name="*android:windowFixedHeightMajor">80%</item>
diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml
index fa94ff1..f6c4628 100644
--- a/packages/DocumentsUI/res/values/styles.xml
+++ b/packages/DocumentsUI/res/values/styles.xml
@@ -16,12 +16,12 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="DialogWhenReallyLarge" parent="@android:style/Theme.Material.DayNight.DarkActionBar" />
+ <style name="DocumentsBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar" />
- <style name="DocumentsTheme" parent="@style/DialogWhenReallyLarge">
- <item name="android:actionBarWidgetTheme">@null</item>
- <item name="android:actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item>
- <item name="android:actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item>
+ <style name="DocumentsTheme" parent="@style/DocumentsBaseTheme">
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item>
+ <item name="actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item>
<item name="android:colorPrimaryDark">@*android:color/material_blue_grey_900</item>
<item name="android:colorPrimary">@*android:color/material_blue_grey_800</item>
@@ -37,14 +37,10 @@
<item name="android:alertDialogTheme">@android:style/Theme.Material.Light.Dialog.Alert</item>
</style>
- <style name="DocumentsNonDialogTheme" parent="@android:style/Theme.Material.DayNight.DarkActionBar">
- <item name="android:actionBarWidgetTheme">@null</item>
- <item name="android:actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item>
- <item name="android:actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item>
-
- <item name="android:colorPrimaryDark">@*android:color/material_blue_grey_900</item>
- <item name="android:colorPrimary">@*android:color/material_blue_grey_800</item>
- <item name="android:colorAccent">@*android:color/material_deep_teal_500</item>
+ <style name="DocumentsBaseTheme.FullScreen" parent="@style/Theme.AppCompat.Light.DarkActionBar">
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item>
+ <item name="actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item>
<item name="android:listDivider">@*android:drawable/list_divider_material</item>
@@ -55,6 +51,12 @@
<item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
</style>
+ <style name="DocumentsNonDialogTheme" parent="@style/DocumentsBaseTheme.FullScreen">
+ <item name="android:colorPrimaryDark">@*android:color/material_blue_grey_900</item>
+ <item name="android:colorPrimary">@*android:color/material_blue_grey_800</item>
+ <item name="android:colorAccent">@*android:color/material_deep_teal_500</item>
+ </style>
+
<style name="ActionModeStyle" parent="@android:style/Widget.Material.Light.ActionMode">
<item name="android:background">@color/material_grey_600</item>
</style>
@@ -63,21 +65,12 @@
<item name="android:colorAccent">@color/material_blue_700</item>
</style>
- <style name="FilesTheme" parent="@android:style/Theme.Material.DayNight.DarkActionBar">
- <item name="android:actionBarWidgetTheme">@null</item>
-
+ <style name="FilesTheme" parent="@style/DocumentsBaseTheme.FullScreen">
<item name="android:colorPrimaryDark">@color/status_bar_background</item>
<item name="android:colorPrimary">@color/material_blue_500</item>
<item name="android:colorAccent">@color/material_blue_700</item>
<item name="android:actionModeStyle">@style/ActionModeStyle</item>
- <item name="android:listDivider">@*android:drawable/list_divider_material</item>
-
- <item name="android:windowActionBar">false</item>
- <item name="android:windowActionModeOverlay">true</item>
- <item name="android:windowNoTitle">true</item>
-
- <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
<item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
</style>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index c28806b..ecf03f5 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -61,6 +61,7 @@
import android.os.SystemProperties;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
+import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -96,7 +97,6 @@
import com.android.documentsui.model.DocumentStack;
import com.android.documentsui.model.RootInfo;
import com.android.internal.util.Preconditions;
-
import com.google.common.collect.Lists;
import java.util.ArrayList;
@@ -129,6 +129,8 @@
private static final String EXTRA_QUERY = "query";
private static final String EXTRA_IGNORE_STATE = "ignoreState";
+ private final Model mModel = new Model();
+
private final Handler mHandler = new Handler(Looper.getMainLooper());
private View mEmptyView;
@@ -147,7 +149,6 @@
private LoaderCallbacks<DirectoryResult> mCallbacks;
private FragmentTuner mFragmentTuner;
private DocumentClipper mClipper;
- private MultiSelectManager mSelectionManager;
// These are lazily initialized.
private LinearLayoutManager mListLayout;
private GridLayoutManager mGridLayout;
@@ -261,7 +262,7 @@
}
// Clear any outstanding selection
- mSelectionManager.clearSelection();
+ mModel.clearSelection();
}
@Override
@@ -290,14 +291,17 @@
}
};
- mSelectionManager = new MultiSelectManager(
+ // TODO: instead of inserting the view into the constructor, extract listener-creation code
+ // and set the listener on the view after the fact. Then the view doesn't need to be passed
+ // into the selection manager which is passed into the model.
+ MultiSelectManager selMgr= new MultiSelectManager(
mRecView,
listener,
state.allowMultiple
? MultiSelectManager.MODE_MULTIPLE
: MultiSelectManager.MODE_SINGLE);
-
- mSelectionManager.addCallback(new SelectionModeListener());
+ selMgr.addCallback(new SelectionModeListener());
+ mModel.setSelectionManager(selMgr);
mType = getArguments().getInt(EXTRA_TYPE);
mStateKey = buildStateKey(root, doc);
@@ -367,7 +371,9 @@
if (!isAdded()) return;
- mAdapter.replaceResult(result);
+ // TODO: make the adapter listen to the model
+ mModel.update(result);
+ mAdapter.update();
// Push latest state up to UI
// TODO: if mode change was racing with us, don't overwrite it
@@ -380,7 +386,7 @@
updateDisplayState();
// When launched into empty recents, show drawer
- if (mType == TYPE_RECENT_OPEN && mAdapter.isEmpty() && !state.stackTouched &&
+ if (mType == TYPE_RECENT_OPEN && mModel.isEmpty() && !state.stackTouched &&
context instanceof DocumentsActivity) {
((DocumentsActivity) context).setRootsDrawerOpen(true);
}
@@ -398,7 +404,9 @@
@Override
public void onLoaderReset(Loader<DirectoryResult> loader) {
- mAdapter.replaceResult(null);
+ // TODO: make the adapter listen to the model.
+ mModel.update(null);
+ mAdapter.update();
}
};
@@ -433,7 +441,7 @@
}
private boolean onSingleTapUp(MotionEvent e) {
- if (Events.isTouchEvent(e) && mSelectionManager.getSelection().isEmpty()) {
+ if (Events.isTouchEvent(e) && mModel.getSelection().isEmpty()) {
int position = getEventAdapterPosition(e);
if (position != RecyclerView.NO_POSITION) {
return handleViewItem(position);
@@ -454,14 +462,14 @@
}
private boolean handleViewItem(int position) {
- final Cursor cursor = mAdapter.getItem(position);
+ final Cursor cursor = mModel.getItem(position);
checkNotNull(cursor, "Cursor cannot be null.");
final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS);
if (isDocumentEnabled(docMimeType, docFlags)) {
final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
- ((BaseActivity) getActivity()).onDocumentPicked(doc, mAdapter);
- mSelectionManager.clearSelection();
+ ((BaseActivity) getActivity()).onDocumentPicked(doc, mModel);
+ mModel.clearSelection();
return true;
}
return false;
@@ -565,6 +573,9 @@
}
mRecView.setLayoutManager(layout);
+ // TODO: Once b/23691541 is resolved, use a listener within MultiSelectManager instead of
+ // imperatively calling this function.
+ mModel.mSelectionManager.handleLayoutChanged();
// setting layout manager automatically invalidates existing ViewHolders.
mThumbSize = new Point(thumbSize, thumbSize);
}
@@ -598,7 +609,7 @@
public boolean onBeforeItemStateChange(int position, boolean selected) {
// Directories and footer items cannot be checked
if (selected) {
- final Cursor cursor = mAdapter.getItem(position);
+ final Cursor cursor = mModel.getItem(position);
checkNotNull(cursor, "Cursor cannot be null.");
final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS);
@@ -610,7 +621,7 @@
@Override
public void onItemStateChanged(int position, boolean selected) {
- final Cursor cursor = mAdapter.getItem(position);
+ final Cursor cursor = mModel.getItem(position);
checkNotNull(cursor, "Cursor cannot be null.");
final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS);
@@ -621,7 +632,7 @@
@Override
public void onSelectionChanged() {
- mSelectionManager.getSelection(mSelected);
+ mModel.getSelection(mSelected);
if (mSelected.size() > 0) {
if (DEBUG) Log.d(TAG, "Maybe starting action mode.");
if (mActionMode == null) {
@@ -651,7 +662,7 @@
if (DEBUG) Log.d(TAG, "Handling action mode destroyed.");
mActionMode = null;
// clear selection
- mSelectionManager.clearSelection();
+ mModel.clearSelection();
mSelected.clear();
mNoDeleteCount = 0;
}
@@ -659,8 +670,8 @@
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.mode_directory, menu);
- mode.setTitle(TextUtils.formatSelectedCount(mSelectionManager.getSelection().size()));
- return mSelectionManager.getSelection().size() > 0;
+ mode.setTitle(TextUtils.formatSelectedCount(mModel.getSelection().size()));
+ return mModel.getSelection().size() > 0;
}
@Override
@@ -679,8 +690,7 @@
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- Selection selection = new Selection();
- mSelectionManager.getSelection(selection);
+ Selection selection = mModel.getSelection(new Selection());
final int id = item.getItemId();
if (id == R.id.menu_open) {
@@ -948,50 +958,31 @@
}
}
- private final class DocumentsAdapter extends RecyclerView.Adapter<DocumentHolder>
- implements DocumentContext {
+ private final class DocumentsAdapter extends RecyclerView.Adapter<DocumentHolder> {
private final Context mContext;
private final LayoutInflater mInflater;
// TODO: Bring back support for footers.
private final List<Footer> mFooters = new ArrayList<>();
- private Cursor mCursor;
- private int mCursorCount;
-
public DocumentsAdapter(Context context) {
mContext = context;
mInflater = LayoutInflater.from(context);
}
- public void replaceResult(DirectoryResult result) {
- if (DEBUG) Log.i(TAG, "Updating adapter with new result set.");
- mCursor = result != null ? result.cursor : null;
- mCursorCount = mCursor != null ? mCursor.getCount() : 0;
-
+ public void update() {
mFooters.clear();
-
- final Bundle extras = mCursor != null ? mCursor.getExtras() : null;
- if (extras != null) {
- final String info = extras.getString(DocumentsContract.EXTRA_INFO);
- if (info != null) {
- mFooters.add(new MessageFooter(2, R.drawable.ic_dialog_info, info));
- }
- final String error = extras.getString(DocumentsContract.EXTRA_ERROR);
- if (error != null) {
- mFooters.add(new MessageFooter(3, R.drawable.ic_dialog_alert, error));
- }
- if (extras.getBoolean(DocumentsContract.EXTRA_LOADING, false)) {
- mFooters.add(new LoadingFooter());
- }
+ if (mModel.info != null) {
+ mFooters.add(new MessageFooter(2, R.drawable.ic_dialog_info, mModel.info));
+ }
+ if (mModel.error != null) {
+ mFooters.add(new MessageFooter(3, R.drawable.ic_dialog_alert, mModel.error));
+ }
+ if (mModel.isLoading()) {
+ mFooters.add(new LoadingFooter());
}
- if (result != null && result.exception != null) {
- mFooters.add(new MessageFooter(
- 3, R.drawable.ic_dialog_alert, getString(R.string.query_error)));
- }
-
- if (isEmpty()) {
+ if (mModel.isEmpty()) {
mEmptyView.setVisibility(View.VISIBLE);
} else {
mEmptyView.setVisibility(View.GONE);
@@ -1025,7 +1016,7 @@
final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache(
context, mThumbSize);
- final Cursor cursor = getItem(position);
+ final Cursor cursor = mModel.getItem(position);
checkNotNull(cursor, "Cursor cannot be null.");
final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY);
@@ -1041,7 +1032,7 @@
holder.docId = docId;
final View itemView = holder.view;
- itemView.setActivated(mSelectionManager.getSelection().contains(position));
+ itemView.setActivated(mModel.isSelected(position));
final View line1 = itemView.findViewById(R.id.line1);
final View line2 = itemView.findViewById(R.id.line2);
@@ -1214,44 +1205,21 @@
}
@Override
- public Cursor getCursor() {
- if (Looper.myLooper() != Looper.getMainLooper()) {
- throw new IllegalStateException("Can't call getCursor from non-main thread.");
- }
- return mCursor;
- }
-
- private Cursor getItem(int position) {
- if (position < mCursorCount) {
- mCursor.moveToPosition(position);
- return mCursor;
- }
-
- Log.w(TAG, "Returning null cursor for position: " + position);
- if (DEBUG) Log.d(TAG, "...Adapter size: " + mCursorCount);
- if (DEBUG) Log.d(TAG, "...Footer size: " + mFooters.size());
- return null;
- }
-
- @Override
public int getItemCount() {
- return mCursorCount;
+ return mModel.getItemCount();
// return mCursorCount + mFooters.size();
}
@Override
public int getItemViewType(int position) {
- if (position < mCursorCount) {
+ final int itemCount = mModel.getItemCount();
+ if (position < itemCount) {
return 0;
} else {
- position -= mCursorCount;
+ position -= itemCount;
return mFooters.get(position).getItemViewType();
}
}
-
- private boolean isEmpty() {
- return getItemCount() > 0;
- }
}
private static String formatTime(Context context, long when) {
@@ -1328,27 +1296,6 @@
return MimePredicate.mimeMatches(state.acceptMimes, docMimeType);
}
- private List<DocumentInfo> getSelectedDocuments() {
- Selection sel = mSelectionManager.getSelection(new Selection());
- return getItemsAsDocuments(sel);
- }
-
- private List<DocumentInfo> getItemsAsDocuments(Selection items) {
- if (items == null || items.size() == 0) {
- return new ArrayList<>(0);
- }
-
- final List<DocumentInfo> docs = new ArrayList<>(items.size());
- final int size = items.size();
- for (int i = 0; i < size; i++) {
- final Cursor cursor = mAdapter.getItem(items.get(i));
- checkNotNull(cursor, "Cursor cannot be null.");
- final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
- docs.add(doc);
- }
- return docs;
- }
-
private void copyFromClipboard() {
new AsyncTask<Void, Void, List<DocumentInfo>>() {
@@ -1426,7 +1373,7 @@
}
void copySelectedToClipboard() {
- Selection sel = mSelectionManager.getSelection(new Selection());
+ Selection sel = mModel.getSelection(new Selection());
copySelectionToClipboard(sel);
}
@@ -1475,7 +1422,7 @@
}
void selectAllFiles() {
- boolean changed = mSelectionManager.setItemsSelected(0, mAdapter.getItemCount(), true);
+ boolean changed = mModel.selectAll();
if (changed) {
updateDisplayState();
}
@@ -1521,7 +1468,7 @@
int dstPosition = mRecView.getChildAdapterPosition(v);
DocumentInfo dstDir = null;
if (dstPosition != android.widget.AdapterView.INVALID_POSITION) {
- Cursor dstCursor = mAdapter.getItem(dstPosition);
+ Cursor dstCursor = mModel.getItem(dstPosition);
checkNotNull(dstCursor, "Cursor cannot be null.");
dstDir = DocumentInfo.fromDirectoryCursor(dstCursor);
// TODO: Do not drop into the directory where the documents came from.
@@ -1556,16 +1503,16 @@
return Collections.EMPTY_LIST;
}
- final List<DocumentInfo> selectedDocs = getSelectedDocuments();
+ final List<DocumentInfo> selectedDocs = mModel.getSelectedDocuments();
if (!selectedDocs.isEmpty()) {
- if (!mSelectionManager.getSelection().contains(position)) {
+ if (!mModel.isSelected(position)) {
// There is a selection that does not include the current item, drag nothing.
return Collections.EMPTY_LIST;
}
return selectedDocs;
}
- final Cursor cursor = mAdapter.getItem(position);
+ final Cursor cursor = mModel.getItem(position);
checkNotNull(cursor, "Cursor cannot be null.");
final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
@@ -1671,12 +1618,14 @@
mShadow.setBounds(0, 0, mShadowDimension, mShadowDimension);
}
+ @Override
public void onProvideShadowMetrics(
Point shadowSize, Point shadowTouchPoint) {
shadowSize.set(mShadowDimension, mShadowDimension);
shadowTouchPoint.set(mShadowDimension / 2, mShadowDimension / 2);
}
+ @Override
public void onDrawShadow(Canvas canvas) {
mShadow.draw(canvas);
}
@@ -1706,7 +1655,7 @@
extends AsyncTask<Selection, Void, List<DocumentInfo>> {
@Override
protected final List<DocumentInfo> doInBackground(Selection... selected) {
- return getItemsAsDocuments(selected[0]);
+ return mModel.getDocuments(selected[0]);
}
@Override
@@ -1775,4 +1724,136 @@
@Override
public void afterActivityCreated(DirectoryFragment fragment) {}
}
+
+ /**
+ * The data model for the current loaded directory.
+ */
+ private final class Model implements DocumentContext {
+ private MultiSelectManager mSelectionManager;
+ private int mCursorCount;
+ private boolean mIsLoading;
+ @Nullable private Cursor mCursor;
+ @Nullable private String info;
+ @Nullable private String error;
+
+ /**
+ * Sets the selection manager used by the model.
+ * TODO: the model should instantiate the selection manager. See onActivityCreated.
+ */
+ void setSelectionManager(MultiSelectManager mgr) {
+ mSelectionManager = mgr;
+ }
+
+ /**
+ * Selects all files in the current directory.
+ * @return true if the selection state changed for any files.
+ */
+ boolean selectAll() {
+ return mSelectionManager.setItemsSelected(0, mCursorCount, true);
+ }
+
+ /**
+ * Clones the current selection into the given Selection object.
+ * @param selection
+ * @return The selection that was passed in, for convenience.
+ */
+ Selection getSelection(Selection selection) {
+ return mSelectionManager.getSelection(selection);
+ }
+
+ /**
+ * @return The current selection (the live instance, not a copy).
+ */
+ Selection getSelection() {
+ return mSelectionManager.getSelection();
+ }
+
+ boolean isSelected(int position) {
+ return mSelectionManager.getSelection().contains(position);
+ }
+
+ void clearSelection() {
+ mSelectionManager.clearSelection();
+ }
+
+ void update(DirectoryResult result) {
+ if (DEBUG) Log.i(TAG, "Updating model with new result set.");
+
+ if (result == null) {
+ mCursor = null;
+ mCursorCount = 0;
+ info = null;
+ error = null;
+ mIsLoading = false;
+ return;
+ }
+
+ if (result.exception != null) {
+ Log.e(TAG, "Error while loading directory contents", result.exception);
+ error = getString(R.string.query_error);
+ return;
+ }
+
+ mCursor = result.cursor;
+ mCursorCount = mCursor.getCount();
+
+ final Bundle extras = mCursor.getExtras();
+ if (extras != null) {
+ info = extras.getString(DocumentsContract.EXTRA_INFO);
+ error = extras.getString(DocumentsContract.EXTRA_ERROR);
+ mIsLoading = extras.getBoolean(DocumentsContract.EXTRA_LOADING, false);
+ }
+ }
+
+ private int getItemCount() {
+ return mCursorCount;
+ }
+
+ private Cursor getItem(int position) {
+ if (position >= mCursorCount) {
+ throw new IndexOutOfBoundsException("Attempt to retrieve " + position + " of " +
+ mCursorCount + " items");
+ }
+
+ mCursor.moveToPosition(position);
+ return mCursor;
+ }
+
+ private boolean isEmpty() {
+ return mCursorCount == 0;
+ }
+
+ private boolean isLoading() {
+ return mIsLoading;
+ }
+
+ private List<DocumentInfo> getSelectedDocuments() {
+ Selection sel = getSelection(new Selection());
+ return getDocuments(sel);
+ }
+
+ private List<DocumentInfo> getDocuments(Selection items) {
+ if (items == null || items.size() == 0) {
+ return new ArrayList<>(0);
+ }
+
+ final List<DocumentInfo> docs = new ArrayList<>(items.size());
+ final int size = items.size();
+ for (int i = 0; i < size; i++) {
+ final Cursor cursor = getItem(items.get(i));
+ checkNotNull(cursor, "Cursor cannot be null.");
+ final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
+ docs.add(doc);
+ }
+ return docs;
+ }
+
+ @Override
+ public Cursor getCursor() {
+ if (Looper.myLooper() != Looper.getMainLooper()) {
+ throw new IllegalStateException("Can't call getCursor from non-main thread.");
+ }
+ return mCursor;
+ }
+ }
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java b/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java
index e972566..4284f6f 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/MultiSelectManager.java
@@ -184,13 +184,13 @@
/**
* Returns a Selection object that provides a live view
- * on the current selection. Callers wishing to get
+ * on the current selection.
*
- * @see #getSelectionSnapshot() on how to get a snapshot
+ * @see #getSelection(Selection) on how to get a snapshot
* of the selection that will not reflect future changes
* to selection.
*
- * @return The current seleciton.
+ * @return The current selection.
*/
public Selection getSelection() {
return mSelection;
@@ -250,6 +250,10 @@
notifySelectionChanged();
}
+ public void handleLayoutChanged() {
+ mBandSelectManager.handleLayoutChanged();
+ }
+
/**
* Clears the selection, without notifying anyone.
*/
@@ -1192,6 +1196,18 @@
}
/**
+ * Handle a change in layout by cleaning up and getting rid of the old model and creating
+ * a new model which will track the new layout.
+ */
+ public void handleLayoutChanged() {
+ mModel.removeOnSelectionChangedListener(this);
+ mModel.stopListening();
+
+ mModel = new BandSelectModel((RuntimeRecyclerViewHelper) mHelper);
+ mModel.addOnSelectionChangedListener(this);
+ }
+
+ /**
* Processes a MotionEvent by starting, ending, or resizing the band select overlay.
* @param e
*/
diff --git a/packages/InputDevices/res/values-uz-rUZ/strings.xml b/packages/InputDevices/res/values-uz-rUZ/strings.xml
index 0a99ad3..3b6772b 100644
--- a/packages/InputDevices/res/values-uz-rUZ/strings.xml
+++ b/packages/InputDevices/res/values-uz-rUZ/strings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="8016145283189546017">"Kiruvchi qurilmalar"</string>
+ <string name="app_label" msgid="8016145283189546017">"Kiritish qurilmalari"</string>
<string name="keyboard_layouts_label" msgid="6688773268302087545">"Android klaviaturasi"</string>
<string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Inglizcha (BQ)"</string>
<string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Inglizcha (AQSH)"</string>
diff --git a/packages/Keyguard/res/values-pl/strings.xml b/packages/Keyguard/res/values-pl/strings.xml
index 8fd2086..04930c5 100644
--- a/packages/Keyguard/res/values-pl/strings.xml
+++ b/packages/Keyguard/res/values-pl/strings.xml
@@ -141,5 +141,5 @@
<item quantity="other">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godziny. Potwierdź hasło.</item>
<item quantity="one">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_0">%d</xliff:g> godziny. Potwierdź hasło.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nie rozpoznano"</string>
+ <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nie rozpoznano odcisku palca."</string>
</resources>
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index fc6117f..cfc232c 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -29,6 +29,7 @@
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.graphics.Bitmap;
+import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
@@ -472,6 +473,10 @@
}
}
+ private void handleFingerprintLockoutReset() {
+ updateFingerprintListeningState();
+ }
+
private void setFingerprintRunningState(int fingerprintRunningState) {
boolean wasRunning = mFingerprintRunningState == FINGERPRINT_STATE_RUNNING;
boolean isRunning = fingerprintRunningState == FINGERPRINT_STATE_RUNNING;
@@ -681,6 +686,14 @@
}
};
+ private final FingerprintManager.LockoutResetCallback mLockoutResetCallback
+ = new FingerprintManager.LockoutResetCallback() {
+ @Override
+ public void onLockoutReset() {
+ handleFingerprintLockoutReset();
+ }
+ };
+
private FingerprintManager.AuthenticationCallback mAuthenticationCallback
= new AuthenticationCallback() {
@@ -1003,6 +1016,9 @@
mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
updateFingerprintListeningState();
+ if (mFpm != null) {
+ mFpm.addLockoutResetCallback(mLockoutResetCallback);
+ }
}
private void updateFingerprintListeningState() {
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/CursorHelper.java b/packages/MtpDocumentsProvider/src/com/android/mtp/CursorHelper.java
new file mode 100644
index 0000000..48d5dcf
--- /dev/null
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/CursorHelper.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.mtp;
+
+import android.database.MatrixCursor;
+import android.mtp.MtpObjectInfo;
+import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
+
+import java.util.Date;
+
+final class CursorHelper {
+ static final int DUMMY_HANDLE_FOR_ROOT = 0;
+
+ private CursorHelper() {
+ }
+
+ static void addToCursor(MtpRoot root, MatrixCursor.RowBuilder builder) {
+ final Identifier identifier = new Identifier(
+ root.mDeviceId, root.mStorageId, DUMMY_HANDLE_FOR_ROOT);
+ builder.add(Document.COLUMN_DOCUMENT_ID, identifier.toDocumentId());
+ builder.add(Document.COLUMN_DISPLAY_NAME, root.mDescription);
+ builder.add(Document.COLUMN_MIME_TYPE, DocumentsContract.Document.MIME_TYPE_DIR);
+ builder.add(Document.COLUMN_LAST_MODIFIED, null);
+ builder.add(Document.COLUMN_FLAGS, 0);
+ builder.add(Document.COLUMN_SIZE,
+ (int) Math.min(root.mMaxCapacity - root.mFreeSpace, Integer.MAX_VALUE));
+ }
+
+ static void addToCursor(MtpObjectInfo objectInfo, Identifier rootIdentifier,
+ MatrixCursor.RowBuilder builder) {
+ final Identifier identifier = new Identifier(
+ rootIdentifier.mDeviceId, rootIdentifier.mStorageId, objectInfo.getObjectHandle());
+ final String mimeType = formatTypeToMimeType(objectInfo.getFormat());
+
+ int flag = 0;
+ if (objectInfo.getProtectionStatus() == 0) {
+ flag |= DocumentsContract.Document.FLAG_SUPPORTS_DELETE |
+ DocumentsContract.Document.FLAG_SUPPORTS_WRITE;
+ if (mimeType == DocumentsContract.Document.MIME_TYPE_DIR) {
+ flag |= DocumentsContract.Document.FLAG_DIR_SUPPORTS_CREATE;
+ }
+ }
+ if (objectInfo.getThumbCompressedSize() > 0) {
+ flag |= DocumentsContract.Document.FLAG_SUPPORTS_THUMBNAIL;
+ }
+
+ builder.add(Document.COLUMN_DOCUMENT_ID, identifier.toDocumentId());
+ builder.add(Document.COLUMN_DISPLAY_NAME, objectInfo.getName());
+ builder.add(Document.COLUMN_MIME_TYPE, mimeType);
+ builder.add(
+ Document.COLUMN_LAST_MODIFIED,
+ objectInfo.getDateModified() != 0 ? objectInfo.getDateModified() : null);
+ builder.add(Document.COLUMN_FLAGS, flag);
+ builder.add(Document.COLUMN_SIZE, objectInfo.getCompressedSize());
+ }
+
+ static String formatTypeToMimeType(int format) {
+ // TODO: Add complete list of mime types.
+ switch (format) {
+ case 0x3001:
+ return DocumentsContract.Document.MIME_TYPE_DIR;
+ case 0x3009:
+ return "audio/mp3";
+ case 0x3801:
+ return "image/jpeg";
+ default:
+ return "application/octet-stream";
+ }
+ }
+
+ static int mimeTypeToFormatType(String mimeType) {
+ // TODO: Add complete list of mime types.
+ switch (mimeType.toLowerCase()) {
+ case Document.MIME_TYPE_DIR:
+ return 0x3001;
+ case "audio/mp3":
+ return 0x3009;
+ case "image/jpeg":
+ return 0x3801;
+ default:
+ return 0x3000; // Undefined object.
+ }
+ }
+}
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java
index c430def..d4c4331 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java
@@ -19,6 +19,7 @@
import android.content.ContentResolver;
import android.database.Cursor;
import android.database.MatrixCursor;
+import android.mtp.MtpObjectInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Process;
@@ -34,6 +35,7 @@
* Loader for MTP document.
* At the first request, the loader returns only first NUM_INITIAL_ENTRIES. Then it launches
* background thread to load the rest documents and caches its result for next requests.
+ * TODO: Rename this class to ObjectInfoLoader
*/
class DocumentLoader {
static final int NUM_INITIAL_ENTRIES = 10;
@@ -50,13 +52,13 @@
mResolver = resolver;
}
- private static MtpDocument[] loadDocuments(MtpManager manager, int deviceId, int[] handles)
+ private static MtpObjectInfo[] loadDocuments(MtpManager manager, int deviceId, int[] handles)
throws IOException {
- final MtpDocument[] documents = new MtpDocument[handles.length];
+ final MtpObjectInfo[] objectInfos = new MtpObjectInfo[handles.length];
for (int i = 0; i < handles.length; i++) {
- documents[i] = manager.getDocument(deviceId, handles[i]);
+ objectInfos[i] = manager.getObjectInfo(deviceId, handles[i]);
}
- return documents;
+ return objectInfos;
}
synchronized Cursor queryChildDocuments(String[] columnNames, Identifier parent)
@@ -66,7 +68,7 @@
int parentHandle = parent.mObjectHandle;
// Need to pass the special value MtpManager.OBJECT_HANDLE_ROOT_CHILDREN to
// getObjectHandles if we would like to obtain children under the root.
- if (parentHandle == MtpDocument.DUMMY_HANDLE_FOR_ROOT) {
+ if (parentHandle == CursorHelper.DUMMY_HANDLE_FOR_ROOT) {
parentHandle = MtpManager.OBJECT_HANDLE_ROOT_CHILDREN;
}
task = new LoaderTask(parent, mMtpManager.getObjectHandles(
@@ -89,14 +91,18 @@
return task.createCursor(mResolver, columnNames);
}
- synchronized void clearCache(int deviceId) {
+ synchronized void clearTasks(int deviceId) {
mTaskList.clearTaskForDevice(deviceId);
}
- synchronized void clearCache() {
+ synchronized void clearCompletedTasks() {
mTaskList.clearCompletedTask();
}
+ synchronized void clearTask(Identifier parentIdentifier) {
+ mTaskList.clearTask(parentIdentifier);
+ }
+
private class BackgroundLoaderThread extends Thread {
@Override
public void run() {
@@ -114,16 +120,16 @@
deviceId = task.mIdentifier.mDeviceId;
handles = task.getUnloadedObjectHandles(NUM_LOADING_ENTRIES);
}
- MtpDocument[] documents;
+ MtpObjectInfo[] objectInfos;
try {
- documents = loadDocuments(mMtpManager, deviceId, handles);
+ objectInfos = loadDocuments(mMtpManager, deviceId, handles);
} catch (IOException exception) {
- documents = null;
+ objectInfos = null;
Log.d(MtpDocumentsProvider.TAG, exception.getMessage());
}
synchronized (DocumentLoader.this) {
- if (documents != null) {
- task.fillDocuments(documents);
+ if (objectInfos != null) {
+ task.fillDocuments(objectInfos);
final boolean shouldNotify =
task.mLastNotified.getTime() <
new Date().getTime() - NOTIFY_PERIOD_MS ||
@@ -177,19 +183,30 @@
}
}
}
+
+ void clearTask(Identifier parentIdentifier) {
+ for (int i = 0; i < size(); i++) {
+ final LoaderTask task = get(i);
+ if (task.mIdentifier.mDeviceId == parentIdentifier.mDeviceId &&
+ task.mIdentifier.mObjectHandle == parentIdentifier.mObjectHandle) {
+ remove(i);
+ return;
+ }
+ }
+ }
}
private static class LoaderTask {
final Identifier mIdentifier;
final int[] mObjectHandles;
- final MtpDocument[] mDocuments;
+ final MtpObjectInfo[] mObjectInfos;
Date mLastNotified;
int mNumLoaded;
LoaderTask(Identifier identifier, int[] objectHandles) {
mIdentifier = identifier;
mObjectHandles = objectHandles;
- mDocuments = new MtpDocument[mObjectHandles.length];
+ mObjectInfos = new MtpObjectInfo[mObjectHandles.length];
mNumLoaded = 0;
mLastNotified = new Date();
}
@@ -199,7 +216,7 @@
final Identifier rootIdentifier = new Identifier(
mIdentifier.mDeviceId, mIdentifier.mStorageId);
for (int i = 0; i < mNumLoaded; i++) {
- mDocuments[i].addToCursor(rootIdentifier, cursor.newRow());
+ CursorHelper.addToCursor(mObjectInfos[i], rootIdentifier, cursor.newRow());
}
final Bundle extras = new Bundle();
extras.putBoolean(DocumentsContract.EXTRA_LOADING, !completed());
@@ -209,7 +226,7 @@
}
boolean completed() {
- return mNumLoaded == mDocuments.length;
+ return mNumLoaded == mObjectInfos.length;
}
int[] getUnloadedObjectHandles(int count) {
@@ -224,9 +241,9 @@
mLastNotified = new Date();
}
- void fillDocuments(MtpDocument[] documents) {
- for (int i = 0; i < documents.length; i++) {
- mDocuments[mNumLoaded++] = documents[i];
+ void fillDocuments(MtpObjectInfo[] objectInfos) {
+ for (int i = 0; i < objectInfos.length; i++) {
+ mObjectInfos[mNumLoaded++] = objectInfos[i];
}
}
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java b/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java
index bd0c837..ae29f52 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java
@@ -41,7 +41,7 @@
Identifier(int deviceId, int storageId) {
- this(deviceId, storageId, MtpDocument.DUMMY_HANDLE_FOR_ROOT);
+ this(deviceId, storageId, CursorHelper.DUMMY_HANDLE_FOR_ROOT);
}
Identifier(int deviceId, int storageId, int objectHandle) {
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocument.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocument.java
deleted file mode 100644
index c1d9609..0000000
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocument.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.mtp;
-
-import android.database.MatrixCursor;
-import android.mtp.MtpObjectInfo;
-import android.provider.DocumentsContract;
-import android.provider.DocumentsContract.Document;
-
-import java.util.Date;
-
-class MtpDocument {
- static final int DUMMY_HANDLE_FOR_ROOT = 0;
-
- private final int mObjectHandle;
- private final int mFormat;
- private final String mName;
- private final Date mDateModified;
- private final int mSize;
- private final int mThumbSize;
- private final boolean mReadOnly;
-
- /**
- * Constructor for root document.
- */
- MtpDocument(MtpRoot root) {
- this(DUMMY_HANDLE_FOR_ROOT,
- 0x3001, // Directory.
- root.mDescription,
- null, // Unknown name.
- (int) Math.min(root.mMaxCapacity - root.mFreeSpace, Integer.MAX_VALUE),
- 0, // Total size.
- true); // Writable.
- }
-
- MtpDocument(MtpObjectInfo objectInfo) {
- this(objectInfo.getObjectHandle(),
- objectInfo.getFormat(),
- objectInfo.getName(),
- objectInfo.getDateModified() != 0 ? new Date(objectInfo.getDateModified()) : null,
- objectInfo.getCompressedSize(),
- objectInfo.getThumbCompressedSize(),
- objectInfo.getProtectionStatus() != 0);
- }
-
- MtpDocument(int objectHandle,
- int format,
- String name,
- Date dateModified,
- int size,
- int thumbSize,
- boolean readOnly) {
- this.mObjectHandle = objectHandle;
- this.mFormat = format;
- this.mName = name;
- this.mDateModified = dateModified;
- this.mSize = size;
- this.mThumbSize = thumbSize;
- this.mReadOnly = readOnly;
- }
-
- void addToCursor(Identifier rootIdentifier, MatrixCursor.RowBuilder builder) {
- final Identifier identifier = new Identifier(
- rootIdentifier.mDeviceId, rootIdentifier.mStorageId, mObjectHandle);
- final String mimeType = formatTypeToMimeType(mFormat);
-
- int flag = 0;
- if (mObjectHandle != DUMMY_HANDLE_FOR_ROOT) {
- if (mThumbSize > 0) {
- flag |= DocumentsContract.Document.FLAG_SUPPORTS_THUMBNAIL;
- }
- if (!mReadOnly) {
- flag |= DocumentsContract.Document.FLAG_SUPPORTS_DELETE |
- DocumentsContract.Document.FLAG_SUPPORTS_WRITE;
- }
- }
- if (mimeType == DocumentsContract.Document.MIME_TYPE_DIR && !mReadOnly) {
- flag |= DocumentsContract.Document.FLAG_DIR_SUPPORTS_CREATE;
- }
-
- builder.add(Document.COLUMN_DOCUMENT_ID, identifier.toDocumentId());
- builder.add(Document.COLUMN_DISPLAY_NAME, mName);
- builder.add(Document.COLUMN_MIME_TYPE, mimeType);
- builder.add(
- Document.COLUMN_LAST_MODIFIED,
- mDateModified != null ? mDateModified.getTime() : null);
- builder.add(Document.COLUMN_FLAGS, flag);
- builder.add(Document.COLUMN_SIZE, mSize);
- }
-
- static String formatTypeToMimeType(int format) {
- // TODO: Add complete list of mime types.
- switch (format) {
- case 0x3001:
- return DocumentsContract.Document.MIME_TYPE_DIR;
- case 0x3009:
- return "audio/mp3";
- case 0x3801:
- return "image/jpeg";
- default:
- return "application/octet-stream";
- }
- }
-
- static int mimeTypeToFormatType(String mimeType) {
- // TODO: Add complete list of mime types.
- switch (mimeType.toLowerCase()) {
- case Document.MIME_TYPE_DIR:
- return 0x3001;
- case "audio/mp3":
- return 0x3009;
- case "image/jpeg":
- return 0x3801;
- default:
- return 0x3000; // Undefined object.
- }
- }
-}
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
index a3cf3e2..78ed161 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
@@ -21,11 +21,12 @@
import android.database.Cursor;
import android.database.MatrixCursor;
import android.graphics.Point;
+import android.mtp.MtpObjectInfo;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
-import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Root;
+import android.provider.DocumentsContract;
import android.provider.DocumentsProvider;
import android.util.Log;
@@ -116,37 +117,37 @@
}
final Identifier identifier = Identifier.createFromDocumentId(documentId);
- MtpDocument document = null;
- if (identifier.mObjectHandle != MtpDocument.DUMMY_HANDLE_FOR_ROOT) {
+ if (identifier.mObjectHandle != CursorHelper.DUMMY_HANDLE_FOR_ROOT) {
+ MtpObjectInfo objectInfo;
try {
- document = mMtpManager.getDocument(identifier.mDeviceId, identifier.mObjectHandle);
+ objectInfo = mMtpManager.getObjectInfo(
+ identifier.mDeviceId, identifier.mObjectHandle);
} catch (IOException e) {
throw new FileNotFoundException(e.getMessage());
}
+ final MatrixCursor cursor = new MatrixCursor(projection);
+ CursorHelper.addToCursor(
+ objectInfo,
+ new Identifier(identifier.mDeviceId, identifier.mStorageId),
+ cursor.newRow());
+ return cursor;
} else {
MtpRoot[] roots;
try {
roots = mMtpManager.getRoots(identifier.mDeviceId);
- if (roots != null) {
- for (final MtpRoot root : roots) {
- if (identifier.mStorageId == root.mStorageId) {
- document = new MtpDocument(root);
- break;
- }
- }
- }
- if (document == null) {
- throw new FileNotFoundException();
- }
} catch (IOException e) {
throw new FileNotFoundException(e.getMessage());
}
+ for (final MtpRoot root : roots) {
+ if (identifier.mStorageId != root.mStorageId)
+ continue;
+ final MatrixCursor cursor = new MatrixCursor(projection);
+ CursorHelper.addToCursor(root, cursor.newRow());
+ return cursor;
+ }
}
- final MatrixCursor cursor = new MatrixCursor(projection);
- document.addToCursor(
- new Identifier(identifier.mDeviceId, identifier.mStorageId), cursor.newRow());
- return cursor;
+ throw new FileNotFoundException();
}
@Override
@@ -173,6 +174,8 @@
case "r":
return mPipeManager.readDocument(mMtpManager, identifier);
case "w":
+ // TODO: Clear the parent document loader task (if exists) and call notify
+ // when writing is completed.
return mPipeManager.writeDocument(getContext(), mMtpManager, identifier);
default:
// TODO: Add support for seekable files.
@@ -207,8 +210,10 @@
final int parentHandle =
mMtpManager.getParent(identifier.mDeviceId, identifier.mObjectHandle);
mMtpManager.deleteDocument(identifier.mDeviceId, identifier.mObjectHandle);
- notifyChildDocumentsChange(new Identifier(
- identifier.mDeviceId, identifier.mStorageId, parentHandle).toDocumentId());
+ final Identifier parentIdentifier = new Identifier(
+ identifier.mDeviceId, identifier.mStorageId, parentHandle);
+ mDocumentLoader.clearTask(parentIdentifier);
+ notifyChildDocumentsChange(parentIdentifier.toDocumentId());
} catch (IOException error) {
throw new FileNotFoundException(error.getMessage());
}
@@ -216,7 +221,7 @@
@Override
public void onTrimMemory(int level) {
- mDocumentLoader.clearCache();
+ mDocumentLoader.clearCompletedTasks();
}
@Override
@@ -224,11 +229,19 @@
throws FileNotFoundException {
try {
final Identifier parentId = Identifier.createFromDocumentId(parentDocumentId);
+ final ParcelFileDescriptor pipe[] = ParcelFileDescriptor.createReliablePipe();
+ pipe[0].close(); // 0 bytes for a new document.
final int objectHandle = mMtpManager.createDocument(
- parentId.mDeviceId, parentId.mStorageId, parentId.mObjectHandle, mimeType,
- displayName);
- final String documentId = new Identifier(parentId.mDeviceId, parentId.mStorageId,
+ parentId.mDeviceId,
+ new MtpObjectInfo.Builder()
+ .setStorageId(parentId.mStorageId)
+ .setParent(parentId.mObjectHandle)
+ .setFormat(CursorHelper.mimeTypeToFormatType(mimeType))
+ .setName(displayName)
+ .build(), pipe[1]);
+ final String documentId = new Identifier(parentId.mDeviceId, parentId.mStorageId,
objectHandle).toDocumentId();
+ mDocumentLoader.clearTask(parentId);
notifyChildDocumentsChange(parentDocumentId);
return documentId;
} catch (IOException error) {
@@ -244,7 +257,7 @@
void closeDevice(int deviceId) throws IOException {
mMtpManager.closeDevice(deviceId);
- mDocumentLoader.clearCache(deviceId);
+ mDocumentLoader.clearTasks(deviceId);
mRootScanner.scanNow();
}
@@ -253,7 +266,7 @@
for (int deviceId : mMtpManager.getOpenedDeviceIds()) {
try {
mMtpManager.closeDevice(deviceId);
- mDocumentLoader.clearCache(deviceId);
+ mDocumentLoader.clearTasks(deviceId);
closed = true;
} catch (IOException d) {
Log.d(TAG, "Failed to close the MTP device: " + deviceId);
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java
index 6647009..ca78a3e 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java
@@ -20,6 +20,7 @@
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
+import android.mtp.MtpConstants;
import android.mtp.MtpDevice;
import android.mtp.MtpObjectInfo;
import android.os.ParcelFileDescriptor;
@@ -108,16 +109,12 @@
return results;
}
- synchronized MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException {
+ synchronized MtpObjectInfo getObjectInfo(int deviceId, int objectHandle)
+ throws IOException {
final MtpDevice device = getDevice(deviceId);
return device.getObjectInfo(objectHandle);
}
- synchronized MtpDocument getDocument(int deviceId, int objectHandle) throws IOException {
- final MtpDevice device = getDevice(deviceId);
- return new MtpDocument(device.getObjectInfo(objectHandle));
- }
-
synchronized int[] getObjectHandles(int deviceId, int storageId, int parentObjectHandle)
throws IOException {
final MtpDevice device = getDevice(deviceId);
@@ -142,25 +139,20 @@
}
}
- // TODO: Remove this method.
- synchronized int createDocument(int deviceId, int storageId, int parentObjectHandle,
- String mimeType, String name) throws IOException {
- final MtpObjectInfo objectInfo = new MtpObjectInfo.Builder()
- .setName(name)
- .setStorageId(storageId)
- .setParent(parentObjectHandle)
- .setFormat(MtpDocument.mimeTypeToFormatType(mimeType))
- .build();
- return createDocument(deviceId, objectInfo);
- }
-
- synchronized int createDocument(int deviceId, MtpObjectInfo objectInfo) throws IOException {
+ synchronized int createDocument(int deviceId, MtpObjectInfo objectInfo,
+ ParcelFileDescriptor source) throws IOException {
final MtpDevice device = getDevice(deviceId);
- final MtpObjectInfo result = device.sendObjectInfo(objectInfo);
- if (result == null) {
+ final MtpObjectInfo sendObjectInfoResult = device.sendObjectInfo(objectInfo);
+ if (sendObjectInfoResult == null) {
throw new IOException("Failed to create a document");
}
- return result.getObjectHandle();
+ if (objectInfo.getFormat() != MtpConstants.FORMAT_ASSOCIATION) {
+ if (!device.sendObject(sendObjectInfoResult.getObjectHandle(),
+ sendObjectInfoResult.getCompressedSize(), source)) {
+ throw new IOException("Failed to send contents of a document");
+ }
+ }
+ return sendObjectInfoResult.getObjectHandle();
}
synchronized int getParent(int deviceId, int objectHandle) throws IOException {
@@ -178,13 +170,6 @@
device.importFile(objectHandle, target);
}
- synchronized void sendObject(int deviceId, int objectHandle, int size,
- ParcelFileDescriptor source) throws IOException {
- final MtpDevice device = getDevice(deviceId);
- if (!device.sendObject(objectHandle, size, source))
- throw new IOException("Failed to send a document");
- }
-
private MtpDevice getDevice(int deviceId) throws IOException {
final MtpDevice device = mDevices.get(deviceId);
if (device == null) {
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/PipeManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/PipeManager.java
index 53f1b65..cd38f1e 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/PipeManager.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/PipeManager.java
@@ -139,20 +139,15 @@
// Delete the target object info if it already exists (as a placeholder).
mManager.deleteDocument(mIdentifier.mDeviceId, mIdentifier.mObjectHandle);
- // Create the target object info with a correct file size.
- final int targetObjectHandle =
- mManager.createDocument(
- mIdentifier.mDeviceId,
- new MtpObjectInfo.Builder(placeholderObjectInfo)
- .setCompressedSize((int) tempFile.length())
- .build());
-
- // Upload the object.
+ // Create the target object info with a correct file size and upload the file.
+ final MtpObjectInfo targetObjectInfo =
+ new MtpObjectInfo.Builder(placeholderObjectInfo)
+ .setCompressedSize((int) tempFile.length())
+ .build();
final ParcelFileDescriptor tempInputDescriptor = ParcelFileDescriptor.open(
tempFile, ParcelFileDescriptor.MODE_READ_ONLY);
- mManager.sendObject(mIdentifier.mDeviceId,
- targetObjectHandle, (int) tempFile.length(), tempInputDescriptor);
-
+ mManager.createDocument(mIdentifier.mDeviceId,
+ targetObjectInfo, tempInputDescriptor);
} catch (IOException error) {
Log.w(MtpDocumentsProvider.TAG,
"Failed to send a file because of: " + error.getMessage());
diff --git a/packages/MtpDocumentsProvider/tests/AndroidManifest.xml b/packages/MtpDocumentsProvider/tests/AndroidManifest.xml
index 50b7521..28ad3f4 100644
--- a/packages/MtpDocumentsProvider/tests/AndroidManifest.xml
+++ b/packages/MtpDocumentsProvider/tests/AndroidManifest.xml
@@ -5,10 +5,20 @@
<application>
<uses-library android:name="android.test.runner" />
+ <activity android:name="com.android.mtp.TestResultActivity"
+ android:screenOrientation="locked"
+ android:launchMode="singleInstance">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
</application>
+ <instrumentation android:name="com.android.mtp.TestResultInstrumentation"
+ android:targetPackage="com.android.mtp"
+ android:label="Tests for MtpDocumentsProvider with the UI for output." />
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.android.mtp"
- android:label="Tests for MtpDocumentsProvider" />
-
+ android:label="Tests for MtpDocumentsProvider." />
</manifest>
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java
index 1e015bd..a012d7f 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.database.Cursor;
+import android.mtp.MtpObjectInfo;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.test.AndroidTestCase;
@@ -31,14 +32,14 @@
@SmallTest
public class DocumentLoaderTest extends AndroidTestCase {
- private BlockableTestMtpMaanger mManager;
+ private BlockableTestMtpManager mManager;
private TestContentResolver mResolver;
private DocumentLoader mLoader;
final private Identifier mParentIdentifier = new Identifier(0, 0, 0);
@Override
public void setUp() {
- mManager = new BlockableTestMtpMaanger(getContext());
+ mManager = new BlockableTestMtpManager(getContext());
mResolver = new TestContentResolver();
mLoader = new DocumentLoader(mManager, mResolver);
}
@@ -85,22 +86,17 @@
for (int i = 0; i < childDocuments.length; i++) {
final int objectHandle = i + 1;
childDocuments[i] = objectHandle;
- manager.setDocument(0, objectHandle, new MtpDocument(
- objectHandle,
- 0 /* format */,
- "file" + objectHandle,
- new Date(),
- 1024,
- 0 /* thumbnail size */,
- false /* not read only */));
+ manager.setObjectInfo(0, new MtpObjectInfo.Builder()
+ .setObjectHandle(objectHandle)
+ .build());
}
manager.setObjectHandles(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, childDocuments);
}
- private static class BlockableTestMtpMaanger extends TestMtpManager {
+ private static class BlockableTestMtpManager extends TestMtpManager {
final private Map<String, CountDownLatch> blockedDocuments = new HashMap<>();
- BlockableTestMtpMaanger(Context context) {
+ BlockableTestMtpManager(Context context) {
super(context);
}
@@ -113,7 +109,7 @@
}
@Override
- MtpDocument getDocument(int deviceId, int objectHandle) throws IOException {
+ MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException {
final CountDownLatch latch = blockedDocuments.get(pack(deviceId, objectHandle));
if (latch != null) {
try {
@@ -122,7 +118,7 @@
fail();
}
}
- return super.getDocument(deviceId, objectHandle);
+ return super.getObjectInfo(deviceId, objectHandle);
}
}
}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
index 1826bd0..cbb72d1 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
@@ -17,9 +17,12 @@
package com.android.mtp;
import android.database.Cursor;
+import android.mtp.MtpConstants;
+import android.mtp.MtpObjectInfo.Builder;
+import android.mtp.MtpObjectInfo;
import android.net.Uri;
-import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Root;
+import android.provider.DocumentsContract;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
@@ -204,14 +207,14 @@
}
public void testQueryDocument() throws IOException {
- mMtpManager.setDocument(0, 2, new MtpDocument(
- 2 /* object handle */,
- 0x3801 /* JPEG */,
- "image.jpg" /* display name */,
- new Date(1422716400000L) /* modified date */,
- 1024 * 1024 * 5 /* file size */,
- 1024 * 50 /* thumbnail size */,
- false /* read only */));
+ mMtpManager.setObjectInfo(0, new MtpObjectInfo.Builder()
+ .setObjectHandle(2)
+ .setFormat(0x3801)
+ .setName("image.jpg")
+ .setDateModified(1422716400000L)
+ .setCompressedSize(1024 * 1024 * 5)
+ .setThumbCompressedSize(1024 * 50)
+ .build());
final Cursor cursor = mProvider.queryDocument("0_1_2", null);
assertEquals(1, cursor.getCount());
@@ -229,14 +232,12 @@
}
public void testQueryDocument_directory() throws IOException {
- mMtpManager.setDocument(0, 2, new MtpDocument(
- 2 /* object handle */,
- 0x3001 /* directory */,
- "directory" /* display name */,
- new Date(1422716400000L) /* modified date */,
- 0 /* file size */,
- 0 /* thumbnail size */,
- false /* read only */));
+ mMtpManager.setObjectInfo(0, new MtpObjectInfo.Builder()
+ .setObjectHandle(2)
+ .setFormat(0x3001 /* directory format */)
+ .setName("directory")
+ .setDateModified(1422716400000L)
+ .build());
final Cursor cursor = mProvider.queryDocument("0_1_2", null);
assertEquals(1, cursor.getCount());
@@ -278,14 +279,14 @@
public void testQueryChildDocuments() throws Exception {
mMtpManager.setObjectHandles(0, 0, -1, new int[] { 1 });
- mMtpManager.setDocument(0, 1, new MtpDocument(
- 1 /* object handle */,
- 0x3801 /* JPEG */,
- "image.jpg" /* display name */,
- new Date(0) /* modified date */,
- 1024 * 1024 * 5 /* file size */,
- 1024 * 50 /* thumbnail size */,
- true /* read only */));
+ mMtpManager.setObjectInfo(0, new MtpObjectInfo.Builder()
+ .setObjectHandle(1)
+ .setFormat(0x3801 /* JPEG */)
+ .setName("image.jpg")
+ .setCompressedSize(1024 * 1024 * 5)
+ .setThumbCompressedSize(5 * 1024)
+ .setProtectionStatus(MtpConstants.PROTECTION_STATUS_READ_ONLY)
+ .build());
final Cursor cursor = mProvider.queryChildDocuments("0_0_0", null, null);
assertEquals(1, cursor.getCount());
@@ -321,15 +322,10 @@
}
public void testDeleteDocument() throws FileNotFoundException {
- mMtpManager.setDocument(0, 1, new MtpDocument(
- 1 /* object handle */,
- 0x3801 /* JPEG */,
- "image.jpg" /* display name */,
- new Date(1422716400000L) /* modified date */,
- 1024 * 1024 * 5 /* file size */,
- 1024 * 50 /* thumbnail size */,
- false /* not read only */));
- mMtpManager.setParent(0, 1, 2);
+ mMtpManager.setObjectInfo(0, new MtpObjectInfo.Builder()
+ .setObjectHandle(1)
+ .setParent(2)
+ .build());
mProvider.deleteDocument("0_0_1");
assertEquals(1, mResolver.getChangeCount(
DocumentsContract.buildChildDocumentsUri(
@@ -337,7 +333,9 @@
}
public void testDeleteDocument_error() {
- mMtpManager.setParent(0, 1, 2);
+ mMtpManager.setObjectInfo(0, new MtpObjectInfo.Builder()
+ .setObjectHandle(2)
+ .build());
try {
mProvider.deleteDocument("0_0_1");
fail();
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java
new file mode 100644
index 0000000..2c1f115
--- /dev/null
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.mtp;
+
+import android.content.Context;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.hardware.usb.UsbManager;
+import android.test.InstrumentationTestCase;
+
+import java.util.HashMap;
+
+public class MtpManagerTest extends InstrumentationTestCase {
+ @RealDeviceTest
+ public void testBasic() throws Exception {
+ final UsbDevice usbDevice = findDevice();
+ final MtpManager manager = new MtpManager(getContext());
+ manager.openDevice(usbDevice.getDeviceId());
+ waitForStorages(manager, usbDevice.getDeviceId());
+ manager.closeDevice(usbDevice.getDeviceId());
+ }
+
+ private UsbDevice findDevice() throws InterruptedException {
+ final UsbManager usbManager = getContext().getSystemService(UsbManager.class);
+ while (true) {
+ final HashMap<String,UsbDevice> devices = usbManager.getDeviceList();
+ if (devices.size() == 0) {
+ show("Wait for devices.");
+ Thread.sleep(1000);
+ continue;
+ }
+ final UsbDevice device = devices.values().iterator().next();
+ final UsbDeviceConnection connection = usbManager.openDevice(device);
+ for (int i = 0; i < device.getInterfaceCount(); i++) {
+ // Since the test runs real environment, we need to call claim interface with
+ // force = true to rob interfaces from other applications.
+ connection.claimInterface(device.getInterface(i), true);
+ connection.releaseInterface(device.getInterface(i));
+ }
+ connection.close();
+ return device;
+ }
+ }
+
+ private void waitForStorages(MtpManager manager, int deviceId) throws Exception {
+ while (true) {
+ if (manager.getRoots(deviceId).length == 0) {
+ show("Wait for storages.");
+ Thread.sleep(1000);
+ continue;
+ }
+ return;
+ }
+ }
+
+ private void show(String message) {
+ if (!(getInstrumentation() instanceof TestResultInstrumentation)) {
+ return;
+ }
+ ((TestResultInstrumentation) getInstrumentation()).show(message);
+ }
+
+ private Context getContext() {
+ return getInstrumentation().getContext();
+ }
+}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java
index e2cc3ed..53018cc 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java
@@ -16,6 +16,7 @@
package com.android.mtp;
+import android.mtp.MtpObjectInfo;
import android.os.ParcelFileDescriptor;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
@@ -31,52 +32,54 @@
private static final byte[] HELLO_BYTES = new byte[] { 'h', 'e', 'l', 'l', 'o' };
private TestMtpManager mtpManager;
- private ExecutorService executor;
- private PipeManager pipeManager;
+ private ExecutorService mExecutor;
+ private PipeManager mPipeManager;
@Override
public void setUp() {
mtpManager = new TestMtpManager(getContext());
- executor = Executors.newSingleThreadExecutor();
- pipeManager = new PipeManager(executor);
+ mExecutor = Executors.newSingleThreadExecutor();
+ mPipeManager = new PipeManager(mExecutor);
}
public void testReadDocument_basic() throws Exception {
mtpManager.setImportFileBytes(0, 1, HELLO_BYTES);
- final ParcelFileDescriptor descriptor = pipeManager.readDocument(
+ final ParcelFileDescriptor descriptor = mPipeManager.readDocument(
mtpManager, new Identifier(0, 0, 1));
assertDescriptor(descriptor, HELLO_BYTES);
}
public void testReadDocument_error() throws Exception {
final ParcelFileDescriptor descriptor =
- pipeManager.readDocument(mtpManager, new Identifier(0, 0, 1));
+ mPipeManager.readDocument(mtpManager, new Identifier(0, 0, 1));
assertDescriptorError(descriptor);
}
public void testWriteDocument_basic() throws Exception {
// Create a placeholder file which should be replaced by a real file later.
- mtpManager.setDocument(0, 1, new MtpDocument(1, 0, "", new Date(), 0, 0, false));
+ mtpManager.setObjectInfo(0, new MtpObjectInfo.Builder()
+ .setObjectHandle(1)
+ .build());
// Upload testing bytes.
- final ParcelFileDescriptor descriptor = pipeManager.writeDocument(
+ final ParcelFileDescriptor descriptor = mPipeManager.writeDocument(
getContext(), mtpManager, new Identifier(0, 0, 1));
final ParcelFileDescriptor.AutoCloseOutputStream outputStream =
new ParcelFileDescriptor.AutoCloseOutputStream(descriptor);
outputStream.write(HELLO_BYTES, 0, HELLO_BYTES.length);
outputStream.close();
- executor.awaitTermination(1000, TimeUnit.MILLISECONDS);
+ mExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
// Check if the placeholder file is removed.
try {
- final MtpDocument placeholderDocument = mtpManager.getDocument(0, 1);
+ final MtpObjectInfo placeholderDocument = mtpManager.getObjectInfo(0, 1);
fail(); // The placeholder file has not been deleted.
} catch (IOException e) {
// Expected error, as the file is gone.
}
// Confirm that the target file is created.
- final MtpDocument targetDocument = mtpManager.getDocument(
+ final MtpObjectInfo targetDocument = mtpManager.getObjectInfo(
0, TestMtpManager.CREATED_DOCUMENT_HANDLE);
assertTrue(targetDocument != null);
@@ -91,20 +94,20 @@
public void testReadThumbnail_basic() throws Exception {
mtpManager.setThumbnail(0, 1, HELLO_BYTES);
- final ParcelFileDescriptor descriptor = pipeManager.readThumbnail(
+ final ParcelFileDescriptor descriptor = mPipeManager.readThumbnail(
mtpManager, new Identifier(0, 0, 1));
assertDescriptor(descriptor, HELLO_BYTES);
}
public void testReadThumbnail_error() throws Exception {
final ParcelFileDescriptor descriptor =
- pipeManager.readThumbnail(mtpManager, new Identifier(0, 0, 1));
+ mPipeManager.readThumbnail(mtpManager, new Identifier(0, 0, 1));
assertDescriptorError(descriptor);
}
private void assertDescriptor(ParcelFileDescriptor descriptor, byte[] expectedBytes)
throws IOException, InterruptedException {
- executor.awaitTermination(1000, TimeUnit.MILLISECONDS);
+ mExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
try (final ParcelFileDescriptor.AutoCloseInputStream stream =
new ParcelFileDescriptor.AutoCloseInputStream(descriptor)) {
byte[] results = new byte[100];
@@ -117,7 +120,7 @@
private void assertDescriptorError(ParcelFileDescriptor descriptor)
throws InterruptedException {
- executor.awaitTermination(1000, TimeUnit.MILLISECONDS);
+ mExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
try {
descriptor.checkError();
fail();
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/RealDeviceTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/RealDeviceTest.java
new file mode 100644
index 0000000..9641ad7
--- /dev/null
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/RealDeviceTest.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.mtp;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@interface RealDeviceTest {}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java
index 94b5ba0..5605388 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java
@@ -40,10 +40,9 @@
private final Set<Integer> mValidDevices = new HashSet<>();
private final Set<Integer> mOpenedDevices = new TreeSet<>();
private final Map<Integer, MtpRoot[]> mRoots = new HashMap<>();
- private final Map<String, MtpDocument> mDocuments = new HashMap<>();
+ private final Map<String, MtpObjectInfo> mObjectInfos = new HashMap<>();
private final Map<String, int[]> mObjectHandles = new HashMap<>();
private final Map<String, byte[]> mThumbnailBytes = new HashMap<>();
- private final Map<String, Integer> mParents = new HashMap<>();
private final Map<String, byte[]> mImportFileBytes = new HashMap<>();
TestMtpManager(Context context) {
@@ -54,16 +53,16 @@
mValidDevices.add(deviceId);
}
- void setObjectHandles(int deviceId, int storageId, int objectHandle, int[] documents) {
- mObjectHandles.put(pack(deviceId, storageId, objectHandle), documents);
+ void setObjectHandles(int deviceId, int storageId, int parentHandle, int[] objectHandles) {
+ mObjectHandles.put(pack(deviceId, storageId, parentHandle), objectHandles);
}
void setRoots(int deviceId, MtpRoot[] roots) {
mRoots.put(deviceId, roots);
}
- void setDocument(int deviceId, int objectHandle, MtpDocument document) {
- mDocuments.put(pack(deviceId, objectHandle), document);
+ void setObjectInfo(int deviceId, MtpObjectInfo objectInfo) {
+ mObjectInfos.put(pack(deviceId, objectInfo.getObjectHandle()), objectInfo);
}
void setImportFileBytes(int deviceId, int objectHandle, byte[] bytes) {
@@ -78,10 +77,6 @@
mThumbnailBytes.put(pack(deviceId, objectHandle), bytes);
}
- void setParent(int deviceId, int objectHandle, int parentObjectHandle) {
- mParents.put(pack(deviceId, objectHandle), parentObjectHandle);
- }
-
@Override
void openDevice(int deviceId) throws IOException {
if (!mValidDevices.contains(deviceId) || mOpenedDevices.contains(deviceId)) {
@@ -108,22 +103,13 @@
}
@Override
- MtpDocument getDocument(int deviceId, int objectHandle) throws IOException {
- final String key = pack(deviceId, objectHandle);
- if (mDocuments.containsKey(key)) {
- return mDocuments.get(key);
- } else {
- throw new IOException("getDocument error: " + key);
- }
- }
-
- @Override
MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException {
- final MtpDocument document = getDocument(deviceId, objectHandle);
- // It's impossible to set an object id of MtpObjectInfo at this stage. Also,
- // it's hard to get any information from MtpDocument, as it's designed to return them
- // only via cursors. Rework these.
- return new MtpObjectInfo.Builder().build();
+ final String key = pack(deviceId, objectHandle);
+ if (mObjectInfos.containsKey(key)) {
+ return mObjectInfos.get(key);
+ } else {
+ throw new IOException("getObjectInfo error: " + key);
+ }
}
@Override
@@ -151,44 +137,29 @@
}
@Override
- int createDocument(int deviceId, MtpObjectInfo objectInfo) throws IOException {
- // For simplicity, it allows to create only one document, and it always has the hardcoded
- // CREATED_DOCUMENT_HANDLE document handle.
+ int createDocument(int deviceId, MtpObjectInfo objectInfo, ParcelFileDescriptor source)
+ throws IOException {
final String key = pack(deviceId, CREATED_DOCUMENT_HANDLE);
- if (!mDocuments.containsKey(key)) {
- mDocuments.put(key, new MtpDocument(
- CREATED_DOCUMENT_HANDLE,
- objectInfo.getFormat(),
- objectInfo.getName(),
- new Date(objectInfo.getDateModified()),
- objectInfo.getCompressedSize(),
- objectInfo.getThumbCompressedSize(),
- false /* Always writable for testing. */));
- } else {
+ if (mObjectInfos.containsKey(key)) {
throw new IOException();
}
+ mObjectInfos.put(key, objectInfo);
+ if (objectInfo.getFormat() != 0x3001) {
+ try (final ParcelFileDescriptor.AutoCloseInputStream inputStream =
+ new ParcelFileDescriptor.AutoCloseInputStream(source)) {
+ final byte[] buffer = new byte[objectInfo.getCompressedSize()];
+ if (inputStream.read(buffer, 0, objectInfo.getCompressedSize()) !=
+ objectInfo.getCompressedSize()) {
+ throw new IOException();
+ }
+
+ mImportFileBytes.put(pack(deviceId, CREATED_DOCUMENT_HANDLE), buffer);
+ }
+ }
return CREATED_DOCUMENT_HANDLE;
}
@Override
- void sendObject(int deviceId, int objectHandle, int size, ParcelFileDescriptor source)
- throws IOException {
- final String key = pack(deviceId, objectHandle);
- if (!mDocuments.containsKey(key)) {
- throw new IOException();
- }
-
- ParcelFileDescriptor.AutoCloseInputStream inputStream =
- new ParcelFileDescriptor.AutoCloseInputStream(source);
- byte[] buffer = new byte[size];
- if (inputStream.read(buffer, 0, size) != size) {
- throw new IOException();
- }
-
- mImportFileBytes.put(pack(deviceId, objectHandle), buffer);
- }
-
- @Override
byte[] getThumbnail(int deviceId, int objectHandle) throws IOException {
final String key = pack(deviceId, objectHandle);
if (mThumbnailBytes.containsKey(key)) {
@@ -201,18 +172,18 @@
@Override
void deleteDocument(int deviceId, int objectHandle) throws IOException {
final String key = pack(deviceId, objectHandle);
- if (mDocuments.containsKey(key)) {
- mDocuments.remove(key);
+ if (mObjectInfos.containsKey(key)) {
+ mObjectInfos.remove(key);
} else {
throw new IOException();
}
}
@Override
- synchronized int getParent(int deviceId, int objectHandle) throws IOException {
+ int getParent(int deviceId, int objectHandle) throws IOException {
final String key = pack(deviceId, objectHandle);
- if (mParents.containsKey(key)) {
- return mParents.get(key);
+ if (mObjectInfos.containsKey(key)) {
+ return mObjectInfos.get(key).getParent();
} else {
throw new IOException();
}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultActivity.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultActivity.java
new file mode 100644
index 0000000..9f2bb2a
--- /dev/null
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultActivity.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.mtp;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+
+/**
+ * Activity that shows the test results instead of adb while using USB port to connect MTP device.
+ */
+public class TestResultActivity extends Activity {
+ private final static String TAG = "MtpDocumentsProviderTest";
+ private TextView mTextView;
+
+ static void show(Context context, String message) {
+ Log.d(TAG, message);
+ final Intent intent = new Intent(context, TestResultActivity.class);
+ intent.putExtra("message", message);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final LinearLayout linearLayout = new LinearLayout(this);
+ linearLayout.setOrientation(LinearLayout.VERTICAL);
+ setContentView(linearLayout);
+
+ mTextView = new TextView(this);
+ mTextView.setText(getIntent().getStringExtra("message") + "\n");
+ linearLayout.addView(
+ mTextView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ mTextView.setText(mTextView.getText() + intent.getStringExtra("message") + "\n");
+ }
+}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultInstrumentation.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultInstrumentation.java
new file mode 100644
index 0000000..9824d28
--- /dev/null
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultInstrumentation.java
@@ -0,0 +1,52 @@
+package com.android.mtp;
+
+import android.os.Bundle;
+import android.test.InstrumentationTestRunner;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestListener;
+
+public class TestResultInstrumentation extends InstrumentationTestRunner implements TestListener {
+ private boolean mHasError = false;
+
+ @Override
+ public void onCreate(Bundle arguments) {
+ super.onCreate(arguments);
+ addTestListener(this);
+ }
+
+ @Override
+ public void addError(Test test, Throwable t) {
+ mHasError = true;
+ show("ERROR", test, t);
+ }
+
+ @Override
+ public void addFailure(Test test, AssertionFailedError t) {
+ mHasError = true;
+ show("FAIL", test, t);
+ }
+
+ @Override
+ public void endTest(Test test) {
+ if (!mHasError) {
+ show("PASS", test, null);
+ }
+ }
+
+ @Override
+ public void startTest(Test test) {
+ mHasError = false;
+ }
+
+ void show(String message) {
+ TestResultActivity.show(getContext(), " " + message);
+ }
+
+ private void show(String tag, Test test, Throwable t) {
+ TestResultActivity.show(
+ getContext(),
+ String.format("[%s] %s %s", tag, test.toString(), t != null ? t.getMessage() : ""));
+ }
+}
diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml
index 6029425..8ef7517 100644
--- a/packages/PrintSpooler/res/values-ja/strings.xml
+++ b/packages/PrintSpooler/res/values-ja/strings.xml
@@ -53,7 +53,7 @@
<string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"検索ボックスは表示されていません"</string>
<string name="print_add_printer" msgid="1088656468360653455">"プリンタを追加"</string>
<string name="print_select_printer" msgid="7388760939873368698">"プリンタを選択"</string>
- <string name="print_forget_printer" msgid="5035287497291910766">"プリンタを切断"</string>
+ <string name="print_forget_printer" msgid="5035287497291910766">"プリンタを削除"</string>
<plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
<item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g>台のプリンタが見つかりました</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g>台のプリンタが見つかりました</item>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_1_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_1_animation.xml
new file mode 100755
index 0000000..1c50165
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_1_animation.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="strokeColor"
+ android:valueFrom="#FFF3511E"
+ android:valueTo="#FFFFFFFF"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.5"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="383"
+ android:propertyName="trimPathStart"
+ android:valueFrom="0.5001"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_3" />
+ <objectAnimator
+ android:duration="383"
+ android:propertyName="trimPathEnd"
+ android:valueFrom="1.5"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_1" />
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_2_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_2_animation.xml
new file mode 100755
index 0000000..598255c
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_ellipse_path_2_animation.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="316"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueTo="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="233"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueTo="M 0.0,-1.988645 c 1.09829830627,0.0 1.988645,0.890346693734 1.988645,1.988645 c 0.0,1.09829830627 -0.890346693734,1.988645 -1.988645,1.988645 c -1.09829830627,0.0 -1.988645,-0.890346693734 -1.988645,-1.988645 c 0.0,-1.09829830627 0.890346693734,-1.988645 1.988645,-1.988645 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_1" />
+ </set>
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFF3511E"
+ android:valueTo="#FFFFFFFF"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.5"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_exclamation_dot_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_exclamation_dot_animation.xml
new file mode 100755
index 0000000..7e0fa43
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_exclamation_dot_animation.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="133"
+ android:propertyXName="translateX"
+ android:propertyYName="translateY"
+ android:pathData="M -0.00391,5.333 c 0.00065,-0.22217 0.00326,-1.11083 0.00391,-1.333"
+ android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_0" />
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="83"
+ android:propertyName="scaleX"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="16"
+ android:propertyName="scaleX"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="83"
+ android:propertyName="scaleY"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="16"
+ android:propertyName="scaleY"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_lock_left_side_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_lock_left_side_animation.xml
new file mode 100755
index 0000000..f413cbf
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_lock_left_side_animation.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="scaleX"
+ android:valueFrom="1.33333"
+ android:valueTo="1.33333"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="183"
+ android:propertyName="scaleX"
+ android:valueFrom="1.33333"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="scaleY"
+ android:valueFrom="1.33333"
+ android:valueTo="1.33333"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="183"
+ android:propertyName="scaleY"
+ android:valueFrom="1.33333"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_lock_right_side_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_lock_right_side_animation.xml
new file mode 100755
index 0000000..f413cbf
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_lock_right_side_animation.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="scaleX"
+ android:valueFrom="1.33333"
+ android:valueTo="1.33333"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="183"
+ android:propertyName="scaleX"
+ android:valueFrom="1.33333"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="scaleY"
+ android:valueFrom="1.33333"
+ android:valueTo="1.33333"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="183"
+ android:propertyName="scaleY"
+ android:valueFrom="1.33333"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_lock_top_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_lock_top_animation.xml
new file mode 100755
index 0000000..2518041
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_lock_top_animation.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="333"
+ android:propertyName="scaleX"
+ android:valueFrom="0.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="16"
+ android:propertyName="scaleX"
+ android:valueFrom="0.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="333"
+ android:propertyName="scaleY"
+ android:valueFrom="0.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="16"
+ android:propertyName="scaleY"
+ android:valueFrom="0.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_path_1_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_path_1_animation.xml
new file mode 100755
index 0000000..15f8d2e
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_path_1_animation.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.02685546875,-4.96875 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 -0.00936889648438,3.9296875 -0.00936889648438,3.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0028076171875,0.0234375 -0.0028076171875,0.0234375 c 0.0,0.0 0.010498046875,-0.015625 0.010498046875,-0.015625 c 0.0,0.0 0.985595703125,0.0078125 0.985595703125,0.0078125 c 0.0,0.0 0.017578125,-6.015625 0.017578125,-6.015625 c 0.0,0.0 0.104400634766,0.0546875 -0.99560546875,0.0546875 Z"
+ android:valueTo="M 0.02685546875,-4.96875 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 -0.00936889648438,3.9296875 -0.00936889648438,3.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0028076171875,0.0234375 -0.0028076171875,0.0234375 c 0.0,0.0 0.010498046875,-0.015625 0.010498046875,-0.015625 c 0.0,0.0 0.985595703125,0.0078125 0.985595703125,0.0078125 c 0.0,0.0 0.017578125,-6.015625 0.017578125,-6.015625 c 0.0,0.0 0.104400634766,0.0546875 -0.99560546875,0.0546875 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="183"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.02685546875,-4.96875 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 -0.00936889648438,3.9296875 -0.00936889648438,3.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0028076171875,0.0234375 -0.0028076171875,0.0234375 c 0.0,0.0 0.010498046875,-0.015625 0.010498046875,-0.015625 c 0.0,0.0 0.985595703125,0.0078125 0.985595703125,0.0078125 c 0.0,0.0 0.017578125,-6.015625 0.017578125,-6.015625 c 0.0,0.0 0.104400634766,0.0546875 -0.99560546875,0.0546875 Z"
+ android:valueTo="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.0118713378906,7.9296875 0.0118713378906,7.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 -0.01123046875,-7.9296875 -0.01123046875,-7.9296875 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="316"
+ android:propertyName="pathData"
+ android:valueFrom="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.0118713378906,7.9296875 0.0118713378906,7.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 -0.01123046875,-7.9296875 -0.01123046875,-7.9296875 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:valueTo="M 6.00561523438,-4.046875 c 0.0,0.0 -5.98999023438,0.0 -5.98999023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 5.98812866211,0.0 5.98812866211,0.0 c 0.0,0.0 0.00064086914062,10.0 0.00064086914062,10.0 c 0.0,0.0 -5.98840332031,0.0 -5.98840332031,0.0 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 5.99487304688,0.0 5.99487304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.0 0.0,-10.0 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_4" />
+ </set>
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFF3511E"
+ android:valueTo="#FFFFFFFF"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.5"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_path_2_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_path_2_animation.xml
new file mode 100755
index 0000000..aa81fcf
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_path_2_animation.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0252990722656,-2.96914672852 c 0.0,0.0 -0.00390625,0.0160217285156 -0.00390625,0.0160217285156 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 0.005615234375,-0.015625 0.005615234375,-0.015625 c -1.10000610352,0.0 -1.01220703125,-0.0546875 -1.01220703125,-0.0546875 c 0.0,0.0 -0.017578125,6.015625 -0.017578125,6.015625 c 0.0,0.0 -0.0777893066406,-0.0078125 1.02221679688,-0.0078125 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 -0.002685546875,-0.0244140625 -0.002685546875,-0.0244140625 c 0.0,0.0 0.00390625,-0.0152587890625 0.00390625,-0.0152587890625 c 0.0,0.0 0.0104064941406,-3.92947387695 0.0104064941406,-3.92947387695 Z"
+ android:valueTo="M 0.0252990722656,-2.96914672852 c 0.0,0.0 -0.00390625,0.0160217285156 -0.00390625,0.0160217285156 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 0.005615234375,-0.015625 0.005615234375,-0.015625 c -1.10000610352,0.0 -1.01220703125,-0.0546875 -1.01220703125,-0.0546875 c 0.0,0.0 -0.017578125,6.015625 -0.017578125,6.015625 c 0.0,0.0 -0.0777893066406,-0.0078125 1.02221679688,-0.0078125 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 -0.002685546875,-0.0244140625 -0.002685546875,-0.0244140625 c 0.0,0.0 0.00390625,-0.0152587890625 0.00390625,-0.0152587890625 c 0.0,0.0 0.0104064941406,-3.92947387695 0.0104064941406,-3.92947387695 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="183"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0252990722656,-2.96914672852 c 0.0,0.0 -0.00390625,0.0160217285156 -0.00390625,0.0160217285156 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 0.005615234375,-0.015625 0.005615234375,-0.015625 c -1.10000610352,0.0 -1.01220703125,-0.0546875 -1.01220703125,-0.0546875 c 0.0,0.0 -0.017578125,6.015625 -0.017578125,6.015625 c 0.0,0.0 -0.0777893066406,-0.0078125 1.02221679688,-0.0078125 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 -0.002685546875,-0.0244140625 -0.002685546875,-0.0244140625 c 0.0,0.0 0.00390625,-0.0152587890625 0.00390625,-0.0152587890625 c 0.0,0.0 0.0104064941406,-3.92947387695 0.0104064941406,-3.92947387695 Z"
+ android:valueTo="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.01123046875,7.9296875 0.01123046875,7.9296875 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 -0.0108337402344,-7.92947387695 -0.0108337402344,-7.92947387695 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="316"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.01123046875,7.9296875 0.01123046875,7.9296875 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 -0.0108337402344,-7.92947387695 -0.0108337402344,-7.92947387695 Z"
+ android:valueTo="M -5.9959564209,-2.04727172852 c 0.0,0.0 6.01173400879,0.00039672851562 6.01173400879,0.00039672851562 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -6.01000976562,0.0 -6.01000976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.0 0.0,10.0 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 6.01000976562,0.0 6.01000976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 -6.01171875,0.0003662109375 -6.01171875,0.0003662109375 c 0.0,0.0 0.00038146972656,-9.99978637695 0.00038146972656,-9.99978637695 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_4" />
+ </set>
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFF3511E"
+ android:valueTo="#FFFFFFFF"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.5"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_path_3_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_path_3_animation.xml
new file mode 100755
index 0000000..f94fe0a
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_path_3_animation.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="233"
+ android:propertyName="pathData"
+ android:valueFrom="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
+ android:valueTo="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="366"
+ android:propertyName="pathData"
+ android:valueFrom="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
+ android:valueTo="M 5.00619506836,-6.046875 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/error_to_trustedstate_animation_interpolator_2" />
+ </set>
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFF3511E"
+ android:valueTo="#FFFFFFFF"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.5"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/error_to_trustedstate_rectangle_path_1_animation.xml b/packages/SystemUI/res/anim/error_to_trustedstate_rectangle_path_1_animation.xml
new file mode 100755
index 0000000..bcc8c41
--- /dev/null
+++ b/packages/SystemUI/res/anim/error_to_trustedstate_rectangle_path_1_animation.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFF3511E"
+ android:valueTo="#FFFFFFFF"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.5"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_1_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_1_animation.xml
new file mode 100755
index 0000000..5cf4809
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_1_animation.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="strokeColor"
+ android:valueFrom="#FFFFFFFF"
+ android:valueTo="#FFF3511E"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="0.5"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="trimPathOffset"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="433"
+ android:propertyName="trimPathOffset"
+ android:valueFrom="1.0"
+ android:valueTo="0.5"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_2" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="trimPathStart"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="433"
+ android:propertyName="trimPathStart"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_0" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_2_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_2_animation.xml
new file mode 100755
index 0000000..a387f97
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_ellipse_path_2_animation.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0,-1.988645 c 1.09829830627,0.0 1.988645,0.890346693734 1.988645,1.988645 c 0.0,1.09829830627 -0.890346693734,1.988645 -1.988645,1.988645 c -1.09829830627,0.0 -1.988645,-0.890346693734 -1.988645,-1.988645 c 0.0,-1.09829830627 0.890346693734,-1.988645 1.988645,-1.988645 Z"
+ android:valueTo="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFFFFFFF"
+ android:valueTo="#FFF3511E"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.5"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_exclamation_dot_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_exclamation_dot_animation.xml
new file mode 100755
index 0000000..7a9fb3b
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_exclamation_dot_animation.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="566"
+ android:propertyXName="translateX"
+ android:propertyYName="translateY"
+ android:pathData="M 0.0,4.0 c -0.00065,0.22217 -0.00326,1.11083 -0.00391,1.333"
+ android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_1" />
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="300"
+ android:propertyName="scaleX"
+ android:valueFrom="0.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="16"
+ android:propertyName="scaleX"
+ android:valueFrom="0.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="300"
+ android:propertyName="scaleY"
+ android:valueFrom="0.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="16"
+ android:propertyName="scaleY"
+ android:valueFrom="0.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_lock_left_side_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_lock_left_side_animation.xml
new file mode 100755
index 0000000..2a4753a
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_lock_left_side_animation.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleX"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleX"
+ android:valueFrom="1.0"
+ android:valueTo="1.33333"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleY"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleY"
+ android:valueFrom="1.0"
+ android:valueTo="1.33333"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_lock_right_side_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_lock_right_side_animation.xml
new file mode 100755
index 0000000..2a4753a
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_lock_right_side_animation.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleX"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleX"
+ android:valueFrom="1.0"
+ android:valueTo="1.33333"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleY"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleY"
+ android:valueFrom="1.0"
+ android:valueTo="1.33333"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_lock_top_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_lock_top_animation.xml
new file mode 100755
index 0000000..1f601d3
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_lock_top_animation.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="116"
+ android:propertyName="scaleX"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="16"
+ android:propertyName="scaleX"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="116"
+ android:propertyName="scaleY"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="16"
+ android:propertyName="scaleY"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_path_1_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_path_1_animation.xml
new file mode 100755
index 0000000..7b9be5c
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_path_1_animation.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="pathData"
+ android:valueFrom="M 6.00561523438,-4.046875 c 0.0,0.0 -5.98999023438,0.0 -5.98999023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 5.98812866211,0.0 5.98812866211,0.0 c 0.0,0.0 0.00064086914062,10.0 0.00064086914062,10.0 c 0.0,0.0 -5.98840332031,0.0 -5.98840332031,0.0 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 5.99487304688,0.0 5.99487304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.0 0.0,-10.0 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:valueTo="M 6.00561523438,-4.046875 c 0.0,0.0 -5.98999023438,0.0 -5.98999023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 5.98812866211,0.0 5.98812866211,0.0 c 0.0,0.0 0.00064086914062,10.0 0.00064086914062,10.0 c 0.0,0.0 -5.98840332031,0.0 -5.98840332031,0.0 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 5.99487304688,0.0 5.99487304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.0 0.0,-10.0 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="pathData"
+ android:valueFrom="M 6.00561523438,-4.046875 c 0.0,0.0 -5.98999023438,0.0 -5.98999023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 5.98812866211,0.0 5.98812866211,0.0 c 0.0,0.0 0.00064086914062,10.0 0.00064086914062,10.0 c 0.0,0.0 -5.98840332031,0.0 -5.98840332031,0.0 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 5.99487304688,0.0 5.99487304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.0 0.0,-10.0 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:valueTo="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.00064086914062,10.625 0.00064086914062,10.625 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.625 0.0,-10.625 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="pathData"
+ android:valueFrom="M 1.63623046875,-4.953125 c 0.0,0.0 -1.61499023438,0.0 -1.61499023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 0.00064086914062,10.625 0.00064086914062,10.625 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 1.61987304688,0.0 1.61987304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.625 0.0,-10.625 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:valueTo="M 0.02685546875,-4.96875 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 -0.00936889648438,3.9296875 -0.00936889648438,3.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0028076171875,0.0234375 -0.0028076171875,0.0234375 c 0.0,0.0 0.010498046875,-0.015625 0.010498046875,-0.015625 c 0.0,0.0 0.985595703125,0.0078125 0.985595703125,0.0078125 c 0.0,0.0 0.017578125,-6.015625 0.017578125,-6.015625 c 0.0,0.0 0.104400634766,0.0546875 -0.99560546875,0.0546875 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFFFFFFF"
+ android:valueTo="#FFF3511E"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.5"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_path_2_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_path_2_animation.xml
new file mode 100755
index 0000000..8eb0c62
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_path_2_animation.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="pathData"
+ android:valueFrom="M -5.9959564209,-2.04727172852 c 0.0,0.0 6.01173400879,0.00039672851562 6.01173400879,0.00039672851562 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -6.01000976562,0.0 -6.01000976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.0 0.0,10.0 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 6.01000976562,0.0 6.01000976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 -6.01171875,0.0003662109375 -6.01171875,0.0003662109375 c 0.0,0.0 0.00038146972656,-9.99978637695 0.00038146972656,-9.99978637695 Z"
+ android:valueTo="M -5.9959564209,-2.04727172852 c 0.0,0.0 6.01173400879,0.00039672851562 6.01173400879,0.00039672851562 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -6.01000976562,0.0 -6.01000976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.0 0.0,10.0 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 6.01000976562,0.0 6.01000976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 -6.01171875,0.0003662109375 -6.01171875,0.0003662109375 c 0.0,0.0 0.00038146972656,-9.99978637695 0.00038146972656,-9.99978637695 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="pathData"
+ android:valueFrom="M -5.9959564209,-2.04727172852 c 0.0,0.0 6.01173400879,0.00039672851562 6.01173400879,0.00039672851562 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -6.01000976562,0.0 -6.01000976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.0 0.0,10.0 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 6.01000976562,0.0 6.01000976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 -6.01171875,0.0003662109375 -6.01171875,0.0003662109375 c 0.0,0.0 0.00038146972656,-9.99978637695 0.00038146972656,-9.99978637695 Z"
+ android:valueTo="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.625 0.0,10.625 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 0.00039672851562,-10.624786377 0.00039672851562,-10.624786377 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0252990722656,-2.96975708008 c 0.0,0.0 -0.00390625,0.0166320800781 -0.00390625,0.0166320800781 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -1.63500976562,0.0 -1.63500976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.625 0.0,10.625 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 1.63500976562,0.0 1.63500976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 0.00390625,-0.015869140625 0.00390625,-0.015869140625 c 0.0,0.0 0.00039672851562,-10.624786377 0.00039672851562,-10.624786377 Z"
+ android:valueTo="M 0.0252990722656,-2.96914672852 c 0.0,0.0 -0.00390625,0.0160217285156 -0.00390625,0.0160217285156 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 0.005615234375,-0.015625 0.005615234375,-0.015625 c -1.10000610352,0.0 -1.01220703125,-0.0546875 -1.01220703125,-0.0546875 c 0.0,0.0 -0.017578125,6.015625 -0.017578125,6.015625 c 0.0,0.0 -0.0777893066406,-0.0078125 1.02221679688,-0.0078125 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 -0.002685546875,-0.0244140625 -0.002685546875,-0.0244140625 c 0.0,0.0 0.00390625,-0.0152587890625 0.00390625,-0.0152587890625 c 0.0,0.0 0.0104064941406,-3.92947387695 0.0104064941406,-3.92947387695 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ </set>
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFFFFFFF"
+ android:valueTo="#FFF3511E"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.5"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_path_3_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_path_3_animation.xml
new file mode 100755
index 0000000..2e86744
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_path_3_animation.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="pathData"
+ android:valueFrom="M 5.00619506836,-6.046875 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
+ android:valueTo="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/trusted_state_to_error_animation_interpolator_3" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFFFFFFF"
+ android:valueTo="#FFF3511E"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.5"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/trusted_state_to_error_rectangle_path_1_animation.xml b/packages/SystemUI/res/anim/trusted_state_to_error_rectangle_path_1_animation.xml
new file mode 100755
index 0000000..46d571c
--- /dev/null
+++ b/packages/SystemUI/res/anim/trusted_state_to_error_rectangle_path_1_animation.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillColor"
+ android:valueFrom="#FFFFFFFF"
+ android:valueTo="#FFF3511E"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="600"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.5"
+ android:valueTo="1.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/drawable/error_to_trustedstate.xml b/packages/SystemUI/res/drawable/error_to_trustedstate.xml
new file mode 100755
index 0000000..6211edf
--- /dev/null
+++ b/packages/SystemUI/res/drawable/error_to_trustedstate.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="error_to_trustedstate"
+ android:width="32dp"
+ android:viewportWidth="32"
+ android:height="32dp"
+ android:viewportHeight="32" >
+ <group
+ android:name="error_to_trusted_state"
+ android:translateX="16"
+ android:translateY="16" >
+ <group
+ android:name="error_circle" >
+ <path
+ android:name="ellipse_path_1"
+ android:trimPathStart="0"
+ android:trimPathEnd="1"
+ android:trimPathOffset="0.0"
+ android:strokeColor="#FFF3511E"
+ android:strokeWidth="2"
+ android:pathData="M 0.0,-12.0 c 6.6274169976,0.0 12.0,5.3725830024 12.0,12.0 c 0.0,6.6274169976 -5.3725830024,12.0 -12.0,12.0 c -6.6274169976,0.0 -12.0,-5.3725830024 -12.0,-12.0 c 0.0,-6.6274169976 5.3725830024,-12.0 12.0,-12.0 Z" />
+ </group>
+ <group
+ android:name="middle_ellipse"
+ android:translateY="2.9375" >
+ <path
+ android:name="ellipse_path_2"
+ android:fillColor="#FFF3511E"
+ android:pathData="M 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
+ </group>
+ <group
+ android:name="lock_right_side"
+ android:scaleX="1.33333"
+ android:scaleY="1.33333" >
+ <path
+ android:name="path_1"
+ android:pathData="M 0.02685546875,-4.96875 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 0.00375366210938,-0.015625 0.00375366210938,-0.015625 c 0.0,0.0 -0.00936889648438,3.9296875 -0.00936889648438,3.9296875 c 0.0,0.0 -0.0040283203125,0.015625 -0.0040283203125,0.015625 c 0.0,0.0 -0.0028076171875,0.0234375 -0.0028076171875,0.0234375 c 0.0,0.0 0.010498046875,-0.015625 0.010498046875,-0.015625 c 0.0,0.0 0.985595703125,0.0078125 0.985595703125,0.0078125 c 0.0,0.0 0.017578125,-6.015625 0.017578125,-6.015625 c 0.0,0.0 0.104400634766,0.0546875 -0.99560546875,0.0546875 Z"
+ android:fillColor="#FFF3511E" />
+ </group>
+ <group
+ android:name="lock_left_side"
+ android:scaleX="1.33333"
+ android:scaleY="1.33333" >
+ <path
+ android:name="path_2"
+ android:pathData="M 0.0252990722656,-2.96914672852 c 0.0,0.0 -0.00390625,0.0160217285156 -0.00390625,0.0160217285156 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 0.005615234375,-0.015625 0.005615234375,-0.015625 c -1.10000610352,0.0 -1.01220703125,-0.0546875 -1.01220703125,-0.0546875 c 0.0,0.0 -0.017578125,6.015625 -0.017578125,6.015625 c 0.0,0.0 -0.0777893066406,-0.0078125 1.02221679688,-0.0078125 c 0.0,0.0 -0.005615234375,0.015625 -0.005615234375,0.015625 c 0.0,0.0 -0.002685546875,-0.0244140625 -0.002685546875,-0.0244140625 c 0.0,0.0 0.00390625,-0.0152587890625 0.00390625,-0.0152587890625 c 0.0,0.0 0.0104064941406,-3.92947387695 0.0104064941406,-3.92947387695 Z"
+ android:fillColor="#FFF3511E" />
+ </group>
+ <group
+ android:name="lock_top"
+ android:scaleX="0"
+ android:scaleY="0" >
+ <path
+ android:name="path_3"
+ android:pathData="M 5.01239013672,3.390625 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
+ android:fillColor="#FFF3511E" />
+ </group>
+ <group
+ android:name="exclamation_dot"
+ android:translateX="-0.00391"
+ android:translateY="5.333" >
+ <path
+ android:name="rectangle_path_1"
+ android:fillColor="#FFF3511E"
+ android:pathData="M -1.33871,-1.3335 l 2.67742,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,2.667 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.67742,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-2.667 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
+ </group>
+ </group>
+</vector>
diff --git a/packages/SystemUI/res/drawable/error_to_trustedstate_animation.xml b/packages/SystemUI/res/drawable/error_to_trustedstate_animation.xml
new file mode 100755
index 0000000..6befe13
--- /dev/null
+++ b/packages/SystemUI/res/drawable/error_to_trustedstate_animation.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<animated-vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/error_to_trustedstate" >
+ <target
+ android:name="ellipse_path_1"
+ android:animation="@anim/error_to_trustedstate_ellipse_path_1_animation" />
+ <target
+ android:name="ellipse_path_2"
+ android:animation="@anim/error_to_trustedstate_ellipse_path_2_animation" />
+ <target
+ android:name="lock_right_side"
+ android:animation="@anim/error_to_trustedstate_lock_right_side_animation" />
+ <target
+ android:name="path_1"
+ android:animation="@anim/error_to_trustedstate_path_1_animation" />
+ <target
+ android:name="lock_left_side"
+ android:animation="@anim/error_to_trustedstate_lock_left_side_animation" />
+ <target
+ android:name="path_2"
+ android:animation="@anim/error_to_trustedstate_path_2_animation" />
+ <target
+ android:name="lock_top"
+ android:animation="@anim/error_to_trustedstate_lock_top_animation" />
+ <target
+ android:name="path_3"
+ android:animation="@anim/error_to_trustedstate_path_3_animation" />
+ <target
+ android:name="exclamation_dot"
+ android:animation="@anim/error_to_trustedstate_exclamation_dot_animation" />
+ <target
+ android:name="rectangle_path_1"
+ android:animation="@anim/error_to_trustedstate_rectangle_path_1_animation" />
+</animated-vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_circle.xml b/packages/SystemUI/res/drawable/ic_qs_circle.xml
new file mode 100644
index 0000000..57223cf
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_circle.xml
@@ -0,0 +1,30 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="64dp"
+ android:height="64dp"
+ android:viewportWidth="2.2"
+ android:viewportHeight="2.2">
+
+ <path
+ android:strokeColor="#4DFFFFFF"
+ android:strokeWidth=".05"
+ android:pathData="M.1,1.1
+ c0,.55 .45,1 1,1
+ c.55,0 1,-.45 1,-1
+ c0,-.55 -.45,-1 -1,-1
+ c-.55,0 -1,.45 -1,1"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/trusted_state_to_error.xml b/packages/SystemUI/res/drawable/trusted_state_to_error.xml
new file mode 100755
index 0000000..534a9a5
--- /dev/null
+++ b/packages/SystemUI/res/drawable/trusted_state_to_error.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="trusted_state_to_error"
+ android:width="32dp"
+ android:viewportWidth="32"
+ android:height="32dp"
+ android:viewportHeight="32" >
+ <group
+ android:name="trusted_state_to_error_0"
+ android:translateX="16"
+ android:translateY="16" >
+ <group
+ android:name="error_circle" >
+ <path
+ android:name="ellipse_path_1"
+ android:trimPathStart="1"
+ android:trimPathOffset="1"
+ android:strokeColor="#FFFFFFFF"
+ android:strokeAlpha="0.5"
+ android:strokeWidth="2"
+ android:pathData="M 0.0,-12.0 c 6.6274169976,0.0 12.0,5.3725830024 12.0,12.0 c 0.0,6.6274169976 -5.3725830024,12.0 -12.0,12.0 c -6.6274169976,0.0 -12.0,-5.3725830024 -12.0,-12.0 c 0.0,-6.6274169976 5.3725830024,-12.0 12.0,-12.0 Z" />
+ </group>
+ <group
+ android:name="middle_ellipse"
+ android:translateY="2.9375" >
+ <path
+ android:name="ellipse_path_2"
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="0.5"
+ android:pathData="M 0.0,-1.988645 c 1.09829830627,0.0 1.988645,0.890346693734 1.988645,1.988645 c 0.0,1.09829830627 -0.890346693734,1.988645 -1.988645,1.988645 c -1.09829830627,0.0 -1.988645,-0.890346693734 -1.988645,-1.988645 c 0.0,-1.09829830627 0.890346693734,-1.988645 1.988645,-1.988645 Z" />
+ </group>
+ <group
+ android:name="lock_right_side" >
+ <path
+ android:name="path_1"
+ android:pathData="M 6.00561523438,-4.046875 c 0.0,0.0 -5.98999023438,0.0 -5.98999023438,0.0 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 5.98812866211,0.0 5.98812866211,0.0 c 0.0,0.0 0.00064086914062,10.0 0.00064086914062,10.0 c 0.0,0.0 -5.98840332031,0.0 -5.98840332031,0.0 c 0.0,0.0 -0.0052490234375,2.0 -0.0052490234375,2.0 c 0.0,0.0 5.99487304688,0.0 5.99487304688,0.0 c 1.10000610352,0.0 2.0,-0.900024414062 2.0,-2.0 c 0.0,0.0 0.0,-10.0 0.0,-10.0 c 0.0,-1.09997558594 -0.899993896484,-2.0 -2.0,-2.0 Z"
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="0.5" />
+ </group>
+ <group
+ android:name="lock_left_side" >
+ <path
+ android:name="path_2"
+ android:pathData="M -5.9959564209,-2.04727172852 c 0.0,0.0 6.01173400879,0.00039672851562 6.01173400879,0.00039672851562 c 0.0,0.0 -0.00015258789062,-2.0 -0.00015258789062,-2.0 c 0.0,0.0 -6.01000976562,0.0 -6.01000976562,0.0 c -1.10000610352,0.0 -2.0,0.900024414062 -2.0,2.0 c 0.0,0.0 0.0,10.0 0.0,10.0 c 0.0,1.09997558594 0.899993896484,2.0 2.0,2.0 c 0.0,0.0 6.01000976562,0.0 6.01000976562,0.0 c 0.0,0.0 -0.000244140625,-2.0009765625 -0.000244140625,-2.0009765625 c 0.0,0.0 -6.01171875,0.0003662109375 -6.01171875,0.0003662109375 c 0.0,0.0 0.00038146972656,-9.99978637695 0.00038146972656,-9.99978637695 Z"
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="0.5" />
+ </group>
+ <group
+ android:name="lock_top" >
+ <path
+ android:name="path_3"
+ android:pathData="M 5.00619506836,-6.046875 c 0.0,-2.76000976562 -2.23999023438,-5.0 -5.0,-5.0 c -2.76000976562,0.0 -5.0,2.23999023438 -5.0,5.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,-1.71002197266 1.38999938965,-3.09997558594 3.10000610352,-3.09997558594 c 1.71000671387,0.0 3.10000610352,1.38995361328 3.10000610352,3.09997558594 c 0.0,0.0 0.0,2.0 0.0,2.0 c 0.0,0.0 1.89999389648,0.0 1.89999389648,0.0 c 0.0,0.0 0.0,-2.0 0.0,-2.0 Z"
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="0.5" />
+ </group>
+ <group
+ android:name="exclamation_dot"
+ android:translateY="4"
+ android:scaleX="0"
+ android:scaleY="0" >
+ <path
+ android:name="rectangle_path_1"
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="0.5"
+ android:pathData="M -1.33871,-1.3335 l 2.67742,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,2.667 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.67742,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-2.667 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
+ </group>
+ </group>
+</vector>
diff --git a/packages/SystemUI/res/drawable/trusted_state_to_error_animation.xml b/packages/SystemUI/res/drawable/trusted_state_to_error_animation.xml
new file mode 100755
index 0000000..5686d54
--- /dev/null
+++ b/packages/SystemUI/res/drawable/trusted_state_to_error_animation.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<animated-vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/trusted_state_to_error" >
+ <target
+ android:name="ellipse_path_1"
+ android:animation="@anim/trusted_state_to_error_ellipse_path_1_animation" />
+ <target
+ android:name="ellipse_path_2"
+ android:animation="@anim/trusted_state_to_error_ellipse_path_2_animation" />
+ <target
+ android:name="lock_right_side"
+ android:animation="@anim/trusted_state_to_error_lock_right_side_animation" />
+ <target
+ android:name="path_1"
+ android:animation="@anim/trusted_state_to_error_path_1_animation" />
+ <target
+ android:name="lock_left_side"
+ android:animation="@anim/trusted_state_to_error_lock_left_side_animation" />
+ <target
+ android:name="path_2"
+ android:animation="@anim/trusted_state_to_error_path_2_animation" />
+ <target
+ android:name="lock_top"
+ android:animation="@anim/trusted_state_to_error_lock_top_animation" />
+ <target
+ android:name="path_3"
+ android:animation="@anim/trusted_state_to_error_path_3_animation" />
+ <target
+ android:name="exclamation_dot"
+ android:animation="@anim/trusted_state_to_error_exclamation_dot_animation" />
+ <target
+ android:name="rectangle_path_1"
+ android:animation="@anim/trusted_state_to_error_rectangle_path_1_animation" />
+</animated-vector>
diff --git a/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_0.xml b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_0.xml
new file mode 100755
index 0000000..262cb88
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_0.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 l 0.254777070064,0.0 c 0.00007,0.0 0.447133757962,1.0 0.745222929936,1.0 L 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_1.xml b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_1.xml
new file mode 100755
index 0000000..9ecee94
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_1.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.00010,0.0 0.6,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_2.xml b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_2.xml
new file mode 100755
index 0000000..ae0b2d7
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_2.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.000100000000009,0.0 0.6,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_3.xml b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_3.xml
new file mode 100755
index 0000000..be7cc69
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_3.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.00010,0.0 0.2,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_4.xml b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_4.xml
new file mode 100755
index 0000000..f8f978d
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/error_to_trustedstate_animation_interpolator_4.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.4,0.0 0.6,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_0.xml b/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_0.xml
new file mode 100755
index 0000000..9ecee94
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_0.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.00010,0.0 0.6,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_1.xml b/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_1.xml
new file mode 100755
index 0000000..87ef1d4
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_1.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 l 0.412907702984,0.0 c 0.00006,0.0 0.35225537821,1.0 0.587092297016,1.0 L 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_2.xml b/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_2.xml
new file mode 100755
index 0000000..be7cc69
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_2.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.00010,0.0 0.2,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_3.xml b/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_3.xml
new file mode 100755
index 0000000..83af65a
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/trusted_state_to_error_animation_interpolator_3.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.4,0.0 0.9999,1.0 1.0,1.0" />
diff --git a/packages/SystemUI/res/layout/qs_paged_page.xml b/packages/SystemUI/res/layout/qs_paged_page.xml
new file mode 100644
index 0000000..eef08ba
--- /dev/null
+++ b/packages/SystemUI/res/layout/qs_paged_page.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<view
+ class="com.android.systemui.qs.PagedTileLayout$TilePage"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/tile_page"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
diff --git a/packages/SystemUI/res/layout/qs_paged_tile_layout.xml b/packages/SystemUI/res/layout/qs_paged_tile_layout.xml
new file mode 100644
index 0000000..6c236ea
--- /dev/null
+++ b/packages/SystemUI/res/layout/qs_paged_tile_layout.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<com.android.systemui.qs.PagedTileLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <view
+ class="com.android.systemui.qs.PagedTileLayout$FirstPage"
+ android:id="@+id/first_page"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <com.android.systemui.qs.QuickTileLayout
+ android:id="@+id/quick_tile_layout"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/qs_quick_actions_height"
+ android:orientation="horizontal"
+ android:paddingLeft="@dimen/qs_quick_actions_padding"
+ android:paddingRight="@dimen/qs_quick_actions_padding" />
+
+ <view
+ class="com.android.systemui.qs.PagedTileLayout$TilePage"
+ android:id="@+id/tile_page"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ </view>
+
+ <com.android.systemui.qs.PageIndicator
+ android:id="@+id/page_indicator"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal|bottom"
+ android:gravity="center" />
+
+</com.android.systemui.qs.PagedTileLayout>
diff --git a/packages/SystemUI/res/layout/qs_tile_layout.xml b/packages/SystemUI/res/layout/qs_tile_layout.xml
new file mode 100644
index 0000000..b5d1a1e
--- /dev/null
+++ b/packages/SystemUI/res/layout/qs_tile_layout.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<com.android.systemui.qs.TileLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent" />
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 7dd11eb..9c32052 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -270,7 +270,7 @@
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Emet"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"En emissió"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositiu sense nom"</string>
- <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"A punt per a l\'emissió"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"A punt per emetre"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"No hi ha cap dispositiu disponible."</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillantor"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÀTICA"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 5c0966c..898611d 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -270,7 +270,7 @@
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляція"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Трансляція"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Пристрій без назви"</string>
- <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Можна транслювати"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Готово до трансляції"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Немає пристроїв"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яскравість"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТО"</string>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index 527248c..c070a0e 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -90,5 +90,9 @@
<declare-styleable name="AlphaOptimizedImageView">
<attr name="hasOverlappingRendering" format="boolean" />
</declare-styleable>
+
+ <declare-styleable name="TunerSwitch">
+ <attr name="defValue" format="boolean" />
+ </declare-styleable>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 03ea73c..3817741 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -164,6 +164,9 @@
<dimen name="pull_span_min">25dp</dimen>
<dimen name="qs_tile_height">88dp</dimen>
+ <dimen name="qs_quick_actions_height">88dp</dimen>
+ <dimen name="qs_quick_actions_padding">25dp</dimen>
+ <dimen name="qs_page_indicator_size">12dp</dimen>
<dimen name="qs_tile_icon_size">24dp</dimen>
<dimen name="qs_tile_text_size">12sp</dimen>
<dimen name="qs_tile_divider_height">1dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 8b3f2d8..b732e99 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1145,4 +1145,15 @@
<!-- Description of setting to show clock seconds [CHAR LIMIT=NONE] -->
<string name="clock_seconds_desc">Show clock seconds in the status bar. May impact battery life.</string>
+ <!-- Button that leads to page to rearrange quick settings tiles [CHAR LIMIT=60] -->
+ <string name="qs_rearrange">Rearrange Quick Settings</string>
+ <!-- Option to show brightness bar in quick settings [CHAR LIMIT=60] -->
+ <string name="show_brightness">Show brightness in Quick Settings</string>
+ <!-- Option to use new paging layout in quick settings [CHAR LIMIT=60] -->
+ <string name="qs_paging">Use paging in Quick Settings</string>
+
+ <!-- Category in the System UI Tuner settings, where new/experimental
+ settings are -->
+ <string name="experimental">Experimental</string>
+
</resources>
diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml
index beb863c..5980108 100644
--- a/packages/SystemUI/res/xml/tuner_prefs.xml
+++ b/packages/SystemUI/res/xml/tuner_prefs.xml
@@ -15,11 +15,32 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:sysui="http://schemas.android.com/apk/res-auto"
android:title="@string/system_ui_tuner">
- <Preference
- android:key="qs_tuner"
- android:title="@string/quick_settings" />
+ <PreferenceScreen
+ android:title="@string/quick_settings">
+
+ <Preference
+ android:key="qs_tuner"
+ android:title="@string/qs_rearrange" />
+
+ <PreferenceCategory
+ android:title="@string/experimental">
+
+ <com.android.systemui.tuner.TunerSwitch
+ android:key="qs_show_brightness"
+ android:title="@string/show_brightness"
+ sysui:defValue="true" />
+
+ <com.android.systemui.tuner.QSPagingSwitch
+ android:key="qs_paged_panel"
+ android:title="@string/qs_paging" />
+
+ </PreferenceCategory>
+
+ </PreferenceScreen>
+
<PreferenceScreen
android:title="@string/status_bar" >
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java b/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java
new file mode 100644
index 0000000..1200266
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java
@@ -0,0 +1,86 @@
+package com.android.systemui.qs;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import com.android.systemui.R;
+
+public class PageIndicator extends LinearLayout {
+
+ private final int mPageIndicatorSize;
+
+ public PageIndicator(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setGravity(Gravity.CENTER);
+ mPageIndicatorSize =
+ (int) mContext.getResources().getDimension(R.dimen.qs_page_indicator_size);
+ }
+
+ public void setNumPages(int numPages) {
+ while (numPages < getChildCount()) {
+ removeViewAt(getChildCount() - 1);
+ }
+ while (numPages > getChildCount()) {
+ SinglePageIndicator v = new SinglePageIndicator(mContext);
+ v.setAmount(0);
+ addView(v, new LayoutParams(mPageIndicatorSize, mPageIndicatorSize));
+ }
+ }
+
+ public void setLocation(float location) {
+ int index = (int) location;
+ location -= index;
+
+ final int N = getChildCount();
+ for (int i = 0; i < N; i++) {
+ float amount = 0;
+ if (i == index) {
+ amount = 1 - location;
+ } else if (i == index + 1) {
+ amount = location;
+ }
+ ((SinglePageIndicator) getChildAt(i)).setAmount(amount);
+ }
+ }
+
+ // This could be done with a circle drawable and an ImageView, but this seems
+ // easier for now.
+ public static class SinglePageIndicator extends View {
+ private static final int MIN_ALPHA = 0x4d;
+ private static final int MAX_ALPHA = 0xff;
+
+ private static final float MIN_SIZE = .55f;
+ private static final float MAX_SIZE = .7f;
+
+ private final Paint mPaint;
+ private float mSize;
+
+ public SinglePageIndicator(Context context) {
+ super(context);
+ mPaint = new Paint();
+ mPaint.setColor(0xffffffff);
+ mPaint.setAlpha(MAX_ALPHA);
+ }
+
+ public void setAmount(float amount) {
+ mSize = amount * (MAX_SIZE - MIN_SIZE) + MIN_SIZE;
+ int alpha = (int) (amount * (MAX_ALPHA - MIN_ALPHA)) + MIN_ALPHA;
+ mPaint.setAlpha(alpha);
+ postInvalidate();
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ int minDimen = Math.min(getWidth(), getHeight()) / 2;
+ float radius = mSize * minDimen;
+ float x = getWidth() / 2f;
+ float y = getHeight() / 2f;
+ canvas.drawCircle(x, y, radius, mPaint);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
new file mode 100644
index 0000000..ece7022
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -0,0 +1,221 @@
+package com.android.systemui.qs;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import com.android.internal.widget.PagerAdapter;
+import com.android.internal.widget.ViewPager;
+import com.android.systemui.R;
+import com.android.systemui.qs.QSPanel.QSTileLayout;
+import com.android.systemui.qs.QSPanel.TileRecord;
+
+import java.util.ArrayList;
+
+public class PagedTileLayout extends ViewPager implements QSTileLayout {
+
+ private static final boolean DEBUG = false;
+
+ private static final String TAG = "PagedTileLayout";
+
+ private final ArrayList<TileRecord> mTiles = new ArrayList<TileRecord>();
+ private final ArrayList<TilePage> mPages = new ArrayList<TilePage>();
+
+ private FirstPage mFirstPage;
+ private PageIndicator mPageIndicator;
+
+ private int mNumPages;
+
+ public PagedTileLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setAdapter(mAdapter);
+ setOnPageChangeListener(new OnPageChangeListener() {
+ @Override
+ public void onPageSelected(int position) {
+ if (mPageIndicator == null) return;
+ mPageIndicator.setLocation(position);
+ }
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ if (mPageIndicator == null) return;
+ mPageIndicator.setLocation(position + positionOffset);
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ }
+ });
+ setCurrentItem(0);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mPageIndicator = (PageIndicator) findViewById(R.id.page_indicator);
+ ((LayoutParams) mPageIndicator.getLayoutParams()).isDecor = true;
+
+ mFirstPage = (FirstPage) findViewById(R.id.first_page);
+ removeView(mFirstPage); // We don't actually want this on the view yet, just inflated.
+ mPages.add(mFirstPage.mTilePage);
+ }
+
+ @Override
+ public int getOffsetTop(TileRecord tile) {
+ if (tile.tileView.getParent() == mFirstPage.mTilePage) {
+ return mFirstPage.getTop() + mFirstPage.mTilePage.getTop();
+ }
+ return ((ViewGroup) tile.tileView.getParent()).getTop();
+ }
+
+ @Override
+ public void setTileVisibility(TileRecord tile, int visibility) {
+ tile.tileView.setVisibility(visibility);
+ // TODO: Do something smarter here.
+ distributeTiles();
+ }
+
+ @Override
+ public void addTile(TileRecord tile) {
+ mTiles.add(tile);
+ distributeTiles();
+ }
+
+ @Override
+ public void removeTile(TileRecord tile) {
+ if (mTiles.remove(tile)) {
+ distributeTiles();
+ }
+ }
+
+ private void distributeTiles() {
+ if (DEBUG) Log.d(TAG, "Distributing tiles");
+ mFirstPage.mQuickQuickTiles.removeAllViews();
+ final int NP = mPages.size();
+ for (int i = 0; i < NP; i++) {
+ mPages.get(i).clear();
+ }
+ int index = 0;
+ final int NT = mTiles.size();
+ for (int i = 0; i < NT; i++) {
+ TileRecord tile = mTiles.get(i);
+ if (tile.tile.getTileType() == QSTileView.QS_TYPE_QUICK) {
+ tile.tileView.setType(QSTileView.QS_TYPE_QUICK);
+ mFirstPage.mQuickQuickTiles.addView(tile.tileView);
+ continue;
+ }
+ if (mPages.get(index).isFull()) {
+ if (++index == mPages.size()) {
+ if (DEBUG) Log.d(TAG, "Adding page for " + tile.tile.getClass().getSimpleName());
+ mPages.add((TilePage) LayoutInflater.from(mContext)
+ .inflate(R.layout.qs_paged_page, this, false));
+ }
+ }
+ if (DEBUG) Log.d(TAG, "Adding " + tile.tile.getClass().getSimpleName() + " to "
+ + index);
+ mPages.get(index).addTile(tile);
+ }
+ if (mNumPages != index + 1) {
+ mNumPages = index + 1;
+ mPageIndicator.setNumPages(mNumPages);
+ mAdapter.notifyDataSetChanged();
+ }
+ }
+
+ @Override
+ public void updateResources() {
+ for (int i = 0; i < mPages.size(); i++) {
+ mPages.get(i).updateResources();
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ // The ViewPager likes to eat all of the space, instead force it to wrap to the max height
+ // of the pages.
+ int maxHeight = 0;
+ final int N = getChildCount();
+ for (int i = 0; i < N; i++) {
+ int height = getChildAt(i).getMeasuredHeight();
+ if (height > maxHeight) {
+ maxHeight = height;
+ }
+ }
+ setMeasuredDimension(getMeasuredWidth(), maxHeight + mPageIndicator.getMeasuredHeight());
+ }
+
+ public static class FirstPage extends LinearLayout {
+ private LinearLayout mQuickQuickTiles;
+ private TilePage mTilePage;
+
+ public FirstPage(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mQuickQuickTiles = (LinearLayout) findViewById(R.id.quick_tile_layout);
+ mTilePage = (TilePage) findViewById(R.id.tile_page);
+ // Less rows on first page, because it needs room for the quick tiles.
+ mTilePage.mMaxRows = 3;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ // The ViewPager will try to make us taller, don't do it unless we need to.
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec),
+ MeasureSpec.AT_MOST);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+ }
+
+ public static class TilePage extends TileLayout {
+ private int mMaxRows = 4;
+
+ public TilePage(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mAllowDual = false;
+ }
+
+ private void clear() {
+ if (DEBUG) Log.d(TAG, "Clearing page");
+ removeAllViews();
+ mRecords.clear();
+ }
+
+ private boolean isFull() {
+ return mRecords.size() >= mColumns * mMaxRows;
+ }
+ }
+
+ private final PagerAdapter mAdapter = new PagerAdapter() {
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ if (DEBUG) Log.d(TAG, "Destantiating " + position);
+ // TODO: Find way to clean up the extra pages.
+ container.removeView((View) object);
+ }
+
+ public Object instantiateItem(ViewGroup container, int position) {
+ if (DEBUG) Log.d(TAG, "Instantiating " + position);
+ ViewGroup view = position == 0 ? mFirstPage : mPages.get(position);
+ container.addView(view);
+ return view;
+ }
+
+ @Override
+ public int getCount() {
+ return mNumPages;
+ }
+
+ @Override
+ public boolean isViewFromObject(View view, Object object) {
+ return view == object;
+ }
+ };
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index b640cf1..683af97 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -43,12 +43,17 @@
import com.android.systemui.settings.ToggleSlider;
import com.android.systemui.statusbar.phone.QSTileHost;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
+import com.android.systemui.tuner.TunerService;
+import com.android.systemui.tuner.TunerService.Tunable;
import java.util.ArrayList;
import java.util.Collection;
/** View that represents the quick settings tile panel. **/
-public class QSPanel extends FrameLayout {
+public class QSPanel extends FrameLayout implements Tunable {
+
+ public static final String QS_SHOW_BRIGHTNESS = "qs_show_brightness";
+ public static final String QS_PAGED_PANEL = "qs_paged_panel";
private final Context mContext;
protected final ArrayList<TileRecord> mRecords = new ArrayList<TileRecord>();
@@ -75,7 +80,7 @@
private boolean mGridContentVisible = true;
private LinearLayout mQsContainer;
- private TileLayout mTileLayout;
+ private QSTileLayout mTileLayout;
public QSPanel(Context context) {
this(context, null);
@@ -104,10 +109,7 @@
addView(mQsContainer);
- mTileLayout = new TileLayout(mContext, mRecords);
-
mQsContainer.addView(mBrightnessView);
- mQsContainer.addView(mTileLayout);
mQsContainer.addView(mFooter.getView());
mClipper = new QSDetailClipper(mDetail);
updateResources();
@@ -126,6 +128,41 @@
});
}
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ TunerService.get(mContext).addTunable(this, QS_SHOW_BRIGHTNESS, QS_PAGED_PANEL);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ TunerService.get(mContext).removeTunable(this);
+ super.onDetachedFromWindow();
+ }
+
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ if (QS_SHOW_BRIGHTNESS.equals(key)) {
+ mBrightnessView.setVisibility(newValue == null || Integer.parseInt(newValue) != 0
+ ? VISIBLE : GONE);
+ } else if (QS_PAGED_PANEL.equals(key)) {
+ if (mTileLayout != null) {
+ for (int i = 0; i < mRecords.size(); i++) {
+ mTileLayout.removeTile(mRecords.get(i));
+ }
+ mQsContainer.removeView((View) mTileLayout);
+ }
+ int layout = newValue != null && Integer.parseInt(newValue) != 0
+ ? R.layout.qs_paged_tile_layout : R.layout.qs_tile_layout;
+ mTileLayout =
+ (QSTileLayout) LayoutInflater.from(mContext).inflate(layout, mQsContainer, false);
+ mQsContainer.addView((View) mTileLayout, 1 /* Between brightness and footer */);
+ for (int i = 0; i < mRecords.size(); i++) {
+ mTileLayout.addTile(mRecords.get(i));
+ }
+ }
+ }
+
private void updateDetailText() {
mDetailDoneButton.setText(R.string.quick_settings_done);
mDetailSettingsButton.setText(R.string.quick_settings_more_settings);
@@ -164,7 +201,9 @@
refreshAllTiles();
}
updateDetailText();
- mTileLayout.updateResources();
+ if (mTileLayout != null) {
+ mTileLayout.updateResources();
+ }
}
@Override
@@ -240,18 +279,18 @@
mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0, r).sendToTarget();
}
- private void setTileVisibility(View v, int visibility) {
- mHandler.obtainMessage(H.SET_TILE_VISIBILITY, visibility, 0, v).sendToTarget();
+ private void setTileVisibility(TileRecord record, int visibility) {
+ mHandler.obtainMessage(H.SET_TILE_VISIBILITY, visibility, 0, record).sendToTarget();
}
- private void handleSetTileVisibility(View v, int visibility) {
- if (visibility == v.getVisibility()) return;
- v.setVisibility(visibility);
+ private void handleSetTileVisibility(TileRecord tile, int visibility) {
+ if (visibility == tile.tileView.getVisibility()) return;
+ mTileLayout.setTileVisibility(tile, visibility);
}
public void setTiles(Collection<QSTile<?>> tiles) {
for (TileRecord record : mRecords) {
- removeView(record.tileView);
+ mTileLayout.removeTile(record);
}
mRecords.clear();
for (QSTile<?> tile : tiles) {
@@ -264,7 +303,7 @@
private void drawTile(TileRecord r, QSTile.State state) {
final int visibility = state.visible ? VISIBLE : GONE;
- setTileVisibility(r.tileView, visibility);
+ setTileVisibility(r, visibility);
r.tileView.onStateChanged(state);
}
@@ -329,7 +368,9 @@
r.tile.refreshState();
mRecords.add(r);
- mTileLayout.addView(r.tileView);
+ if (mTileLayout != null) {
+ mTileLayout.addTile(r);
+ }
}
public boolean isShowingDetail() {
@@ -371,7 +412,7 @@
}
r.tile.setDetailListening(show);
int x = r.tileView.getLeft() + r.tileView.getWidth() / 2;
- int y = r.tileView.getTop() + mTileLayout.getTop() + r.tileView.getHeight() / 2;
+ int y = r.tileView.getTop() + mTileLayout.getOffsetTop(r) + r.tileView.getHeight() / 2;
handleShowDetailImpl(r, show, x, y);
}
@@ -474,7 +515,7 @@
if (msg.what == SHOW_DETAIL) {
handleShowDetail((Record)msg.obj, msg.arg1 != 0);
} else if (msg.what == SET_TILE_VISIBILITY) {
- handleSetTileVisibility((View)msg.obj, msg.arg1);
+ handleSetTileVisibility((TileRecord) msg.obj, msg.arg1);
}
}
}
@@ -534,4 +575,12 @@
void onToggleStateChanged(boolean state);
void onScanStateChanged(boolean state);
}
+
+ public interface QSTileLayout {
+ void addTile(TileRecord tile);
+ void removeTile(TileRecord tile);
+ void setTileVisibility(TileRecord tile, int visibility);
+ int getOffsetTop(TileRecord tile);
+ void updateResources();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
index b330582..9b3372c3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
@@ -83,9 +83,13 @@
mContext = host.getContext();
mHandler = new H(host.getLooper());
}
+
+ public int getTileType() {
+ return QSTileView.QS_TYPE_NORMAL;
+ }
- public boolean supportsDualTargets() {
- return false;
+ public final boolean supportsDualTargets() {
+ return getTileType() == QSTileView.QS_TYPE_DUAL;
}
public Host getHost() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
index 6d26a3b..08cdc1e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
@@ -48,6 +48,10 @@
private static final Typeface CONDENSED = Typeface.create("sans-serif-condensed",
Typeface.NORMAL);
+ public static final int QS_TYPE_NORMAL = 0;
+ public static final int QS_TYPE_DUAL = 1;
+ public static final int QS_TYPE_QUICK = 2;
+
protected final Context mContext;
private final View mIcon;
private final View mDivider;
@@ -61,13 +65,15 @@
private TextView mLabel;
private QSDualTileLabel mDualLabel;
- private boolean mDual;
+ private int mType;
private OnClickListener mClickPrimary;
private OnClickListener mClickSecondary;
private OnLongClickListener mLongClick;
private Drawable mTileBackground;
private RippleDrawable mRipple;
+ private View mCircle;
+
public QSTileView(Context context) {
super(context);
@@ -89,6 +95,9 @@
mIcon = createIcon();
addView(mIcon);
+ mCircle = createCircleIcon();
+ addView(mCircle);
+
mDivider = new View(mContext);
mDivider.setBackgroundColor(context.getColor(R.color.qs_tile_divider));
final int dh = res.getDimensionPixelSize(R.dimen.qs_tile_divider_height);
@@ -131,12 +140,12 @@
}
if (mDualLabel != null) {
labelText = mDualLabel.getText();
- labelDescription = mLabel.getContentDescription();
+ labelDescription = mLabel != null ? mLabel.getContentDescription() : null;
removeView(mDualLabel);
mDualLabel = null;
}
final Resources res = mContext.getResources();
- if (mDual) {
+ if (mType == QS_TYPE_DUAL) {
mDualLabel = new QSDualTileLabel(mContext);
mDualLabel.setId(View.generateViewId());
mDualLabel.setBackgroundResource(R.drawable.btn_borderless_rect);
@@ -157,7 +166,7 @@
}
addView(mDualLabel);
mDualLabel.setAccessibilityTraversalAfter(mTopBackgroundView.getId());
- } else {
+ } else if (mType == QS_TYPE_NORMAL) {
mLabel = new TextView(mContext);
mLabel.setTextColor(mContext.getColor(R.color.qs_tile_text));
mLabel.setGravity(Gravity.CENTER_HORIZONTAL);
@@ -174,16 +183,16 @@
}
}
- public boolean setDual(boolean dual) {
- final boolean changed = dual != mDual;
- mDual = dual;
+ public boolean setType(int type) {
+ final boolean changed = mType != type;
+ mType = type;
if (changed) {
recreateLabel();
}
if (mTileBackground instanceof RippleDrawable) {
setRipple((RippleDrawable) mTileBackground);
}
- if (dual) {
+ if (mType == QS_TYPE_DUAL) {
mTopBackgroundView.setOnClickListener(mClickPrimary);
setOnClickListener(null);
setClickable(false);
@@ -197,9 +206,10 @@
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setBackground(mTileBackground);
}
- mTopBackgroundView.setFocusable(dual);
- setFocusable(!dual);
- mDivider.setVisibility(dual ? VISIBLE : GONE);
+ mTopBackgroundView.setFocusable(mType == QS_TYPE_DUAL);
+ setFocusable(mType != QS_TYPE_DUAL);
+ mDivider.setVisibility(mType == QS_TYPE_DUAL ? VISIBLE : GONE);
+ mCircle.setVisibility(mType == QS_TYPE_QUICK ? VISIBLE : GONE);
postInvalidate();
return changed;
}
@@ -225,6 +235,21 @@
return icon;
}
+ protected View createCircleIcon() {
+ final ImageView icon = new ImageView(mContext);
+ icon.setImageResource(R.drawable.ic_qs_circle);
+ // TODO: Not this.
+ icon.setPadding(20, 20, 20, 20);
+ return icon;
+ }
+
+ protected View createCircle() {
+ final ImageView icon = new ImageView(mContext);
+ icon.setId(android.R.id.icon);
+ icon.setScaleType(ScaleType.CENTER_INSIDE);
+ return icon;
+ }
+
private Drawable newTileBackground() {
final int[] attrs = new int[] { android.R.attr.selectableItemBackgroundBorderless };
final TypedArray ta = mContext.obtainStyledAttributes(attrs);
@@ -234,7 +259,7 @@
}
private View labelView() {
- return mDual ? mDualLabel : mLabel;
+ return mType == QS_TYPE_DUAL ? mDualLabel : mLabel;
}
@Override
@@ -243,9 +268,18 @@
final int h = MeasureSpec.getSize(heightMeasureSpec);
final int iconSpec = exactly(mIconSizePx);
mIcon.measure(MeasureSpec.makeMeasureSpec(w, MeasureSpec.AT_MOST), iconSpec);
- labelView().measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(h, MeasureSpec.AT_MOST));
- if (mDual) {
- mDivider.measure(widthMeasureSpec, exactly(mDivider.getLayoutParams().height));
+ switch (mType) {
+ case QS_TYPE_QUICK:
+ mCircle.measure(
+ MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY));
+ break;
+ case QS_TYPE_DUAL:
+ mDivider.measure(widthMeasureSpec, exactly(mDivider.getLayoutParams().height));
+ default:
+ labelView().measure(widthMeasureSpec,
+ MeasureSpec.makeMeasureSpec(h, MeasureSpec.AT_MOST));
+ break;
}
int heightSpec = exactly(
mIconSizePx + mTilePaddingBelowIconPx + mTilePaddingTopPx);
@@ -268,6 +302,10 @@
top += mTileSpacingPx;
top += mTilePaddingTopPx;
final int iconLeft = (w - mIcon.getMeasuredWidth()) / 2;
+ if (mType == QS_TYPE_QUICK) {
+ top = (h - mIcon.getMeasuredHeight()) / 2;
+ layout(mCircle, 0, 0);
+ }
layout(mIcon, iconLeft, top);
if (mRipple != null) {
updateRippleSize(w, h);
@@ -275,17 +313,19 @@
}
top = mIcon.getBottom();
top += mTilePaddingBelowIconPx;
- if (mDual) {
+ if (mType == QS_TYPE_DUAL) {
layout(mDivider, 0, top);
top = mDivider.getBottom();
}
- layout(labelView(), 0, top);
+ if (mType != QS_TYPE_QUICK) {
+ layout(labelView(), 0, top);
+ }
}
private void updateRippleSize(int width, int height) {
// center the touch feedback on the center of the icon, and dial it down a bit
final int cx = width / 2;
- final int cy = mDual ? mIcon.getTop() + mIcon.getHeight() / 2 : height / 2;
+ final int cy = mType == QS_TYPE_DUAL ? mIcon.getTop() + mIcon.getHeight() / 2 : height / 2;
final int rad = (int)(mIcon.getHeight() * 1.25f);
mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad);
}
@@ -298,11 +338,11 @@
if (mIcon instanceof ImageView) {
setIcon((ImageView) mIcon, state);
}
- if (mDual) {
+ if (mType == QS_TYPE_DUAL) {
mDualLabel.setText(state.label);
mDualLabel.setContentDescription(state.dualLabelContentDescription);
mTopBackgroundView.setContentDescription(state.contentDescription);
- } else {
+ } else if (mType == QS_TYPE_NORMAL) {
mLabel.setText(state.label);
setContentDescription(state.contentDescription);
}
@@ -338,7 +378,7 @@
public View updateAccessibilityOrder(View previousView) {
View firstView;
View lastView;
- if (mDual) {
+ if (mType == QS_TYPE_DUAL) {
lastView = mDualLabel;
firstView = mTopBackgroundView;
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/QuickTileLayout.java
new file mode 100644
index 0000000..bb2340c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickTileLayout.java
@@ -0,0 +1,28 @@
+package com.android.systemui.qs;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+public class QuickTileLayout extends LinearLayout {
+
+ public QuickTileLayout(Context context) {
+ this(context, null);
+ }
+
+ public QuickTileLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setGravity(Gravity.CENTER);
+ }
+
+ @Override
+ public void addView(View child, int index, ViewGroup.LayoutParams params) {
+ // Make everything square at the height of this view.
+ params = new LayoutParams(params.height, params.height);
+ ((LinearLayout.LayoutParams) params).weight = 1;
+ super.addView(child, index, params);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
index 02b8fe3..e0c39c5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
@@ -2,35 +2,63 @@
import android.content.Context;
import android.content.res.Resources;
+import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import com.android.systemui.R;
+import com.android.systemui.qs.QSPanel.QSTileLayout;
import com.android.systemui.qs.QSPanel.TileRecord;
import java.util.ArrayList;
-public class TileLayout extends ViewGroup {
+public class TileLayout extends ViewGroup implements QSTileLayout {
private static final float TILE_ASPECT = 1.2f;
private static final String TAG = "TileLayout";
private int mDualTileUnderlap;
- private int mColumns;
+ protected int mColumns;
private int mCellWidth;
private int mCellHeight;
private int mLargeCellWidth;
private int mLargeCellHeight;
- private final ArrayList<TileRecord> mRecords;
+ protected boolean mAllowDual = true;
- public TileLayout(Context context, ArrayList<TileRecord> records) {
- super(context);
- mRecords = records;
+ protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
+
+ public TileLayout(Context context) {
+ this(context, null);
+ }
+
+ public TileLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
updateResources();
}
+ @Override
+ public int getOffsetTop(TileRecord tile) {
+ return getTop();
+ }
+
+ public void addTile(TileRecord tile) {
+ mRecords.add(tile);
+ addView(tile.tileView);
+ }
+
+ @Override
+ public void removeTile(TileRecord tile) {
+ mRecords.remove(tile);
+ removeView(tile.tileView);
+ }
+
+ @Override
+ public void setTileVisibility(TileRecord tile, int visibility) {
+ tile.tileView.setVisibility(visibility);
+ }
+
public void updateResources() {
final Resources res = mContext.getResources();
final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns));
@@ -56,10 +84,11 @@
if (record.tileView.getVisibility() == GONE) continue;
// wrap to next column if we've reached the max # of columns
// also don't allow dual + single tiles on the same row
- if (r == -1 || c == (mColumns - 1) || rowIsDual != record.tile.supportsDualTargets()) {
+ if (r == -1 || c == (mColumns - 1)
+ || rowIsDual != (mAllowDual && record.tile.supportsDualTargets())) {
r++;
c = 0;
- rowIsDual = record.tile.supportsDualTargets();
+ rowIsDual = mAllowDual && record.tile.supportsDualTargets();
} else {
c++;
}
@@ -70,7 +99,8 @@
View previousView = this;
for (TileRecord record : mRecords) {
- if (record.tileView.setDual(record.tile.supportsDualTargets())) {
+ if (record.tileView.setType(mAllowDual ? record.tile.getTileType()
+ : QSTileView.QS_TYPE_NORMAL)) {
record.tileView.handleStateChanged(record.tile.getState());
}
if (record.tileView.getVisibility() == GONE) continue;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
index abce31f..fd70d02 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -31,6 +31,7 @@
import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSTile;
+import com.android.systemui.qs.QSTileView;
import com.android.systemui.statusbar.policy.BluetoothController;
import java.util.Collection;
@@ -43,15 +44,18 @@
private final BluetoothController mController;
private final BluetoothDetailAdapter mDetailAdapter;
- public BluetoothTile(Host host) {
+ private final boolean mAlwaysDetail;
+
+ public BluetoothTile(Host host, boolean alwaysDetail) {
super(host);
+ mAlwaysDetail = alwaysDetail;
mController = host.getBluetoothController();
mDetailAdapter = new BluetoothDetailAdapter();
}
@Override
- public boolean supportsDualTargets() {
- return true;
+ public int getTileType() {
+ return QSTileView.QS_TYPE_DUAL;
}
@Override
@@ -75,6 +79,10 @@
@Override
protected void handleClick() {
+ if (mAlwaysDetail) {
+ handleSecondaryClick();
+ return;
+ }
final boolean isEnabled = (Boolean)mState.value;
MetricsLogger.action(mContext, getMetricsCategory(), !isEnabled);
mController.setBluetoothEnabled(!isEnabled);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QAirplaneTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QAirplaneTile.java
new file mode 100644
index 0000000..13ccaaa
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QAirplaneTile.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import com.android.systemui.qs.QSTileView;
+
+/** Quick settings tile: Wifi **/
+public class QAirplaneTile extends AirplaneModeTile {
+
+ public QAirplaneTile(Host host) {
+ super(host);
+ }
+
+ @Override
+ public int getTileType() {
+ return QSTileView.QS_TYPE_QUICK;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QBluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QBluetoothTile.java
new file mode 100644
index 0000000..02975cb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QBluetoothTile.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import com.android.systemui.qs.QSTileView;
+
+/** Quick settings tile: Bluetooth **/
+public class QBluetoothTile extends BluetoothTile {
+
+ public QBluetoothTile(Host host) {
+ super(host, false);
+ }
+
+ @Override
+ public int getTileType() {
+ return QSTileView.QS_TYPE_QUICK;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QFlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QFlashlightTile.java
new file mode 100644
index 0000000..31035cd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QFlashlightTile.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import com.android.systemui.qs.QSTileView;
+
+/** Quick settings tile: Wifi **/
+public class QFlashlightTile extends FlashlightTile {
+
+ public QFlashlightTile(Host host) {
+ super(host);
+ }
+
+ @Override
+ public int getTileType() {
+ return QSTileView.QS_TYPE_QUICK;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QRotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QRotationLockTile.java
new file mode 100644
index 0000000..e066bab
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QRotationLockTile.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import com.android.systemui.qs.QSTileView;
+
+/** Quick settings tile: Rotation **/
+public class QRotationLockTile extends RotationLockTile {
+
+ public QRotationLockTile(Host host) {
+ super(host);
+ }
+
+ @Override
+ public int getTileType() {
+ return QSTileView.QS_TYPE_QUICK;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QWifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QWifiTile.java
new file mode 100644
index 0000000..87194fb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QWifiTile.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import com.android.systemui.qs.QSTileView;
+
+/** Quick settings tile: Wifi **/
+public class QWifiTile extends WifiTile {
+
+ public QWifiTile(Host host) {
+ super(host, false);
+ }
+
+ @Override
+ public int getTileType() {
+ return QSTileView.QS_TYPE_QUICK;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index e654efd..3295e14 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -50,16 +50,19 @@
private final WifiSignalCallback mSignalCallback = new WifiSignalCallback();
- public WifiTile(Host host) {
+ private final boolean mAlwaysDetail;
+
+ public WifiTile(Host host, boolean alwaysDetail) {
super(host);
+ mAlwaysDetail = alwaysDetail;
mController = host.getNetworkController();
mWifiController = mController.getAccessPointController();
mDetailAdapter = new WifiDetailAdapter();
}
@Override
- public boolean supportsDualTargets() {
- return true;
+ public int getTileType() {
+ return QSTileView.QS_TYPE_DUAL;
}
@Override
@@ -97,6 +100,10 @@
@Override
protected void handleClick() {
+ if (mAlwaysDetail) {
+ handleSecondaryClick();
+ return;
+ }
mState.copyTo(mStateBeforeClick);
MetricsLogger.action(mContext, getMetricsCategory(), !mState.enabled);
mController.setWifiEnabled(!mState.enabled);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index d30411a..f4439bf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -262,14 +262,21 @@
return (secure && !canSkipBouncer) ? SECURE_CAMERA_INTENT : INSECURE_CAMERA_INTENT;
}
+ /**
+ * Resolves the intent to launch the camera application.
+ */
+ public ResolveInfo resolveCameraIntent() {
+ return mContext.getPackageManager().resolveActivityAsUser(getCameraIntent(),
+ PackageManager.MATCH_DEFAULT_ONLY,
+ KeyguardUpdateMonitor.getCurrentUser());
+ }
+
private void updateCameraVisibility() {
if (mCameraImageView == null) {
// Things are not set up yet; reply hazy, ask again later
return;
}
- ResolveInfo resolved = mContext.getPackageManager().resolveActivityAsUser(getCameraIntent(),
- PackageManager.MATCH_DEFAULT_ONLY,
- KeyguardUpdateMonitor.getCurrentUser());
+ ResolveInfo resolved = resolveCameraIntent();
boolean visible = !isCameraDisabledByDpm() && resolved != null
&& getResources().getBoolean(R.bool.config_keyguardShowCameraAffordance)
&& mUserSetupComplete;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index 463abfc..d0a7f8a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -100,6 +100,8 @@
// TODO: Real icon for facelock.
int state = getState();
boolean anyFingerprintIcon = state == STATE_FINGERPRINT || state == STATE_FINGERPRINT_ERROR;
+ boolean useAdditionalPadding = anyFingerprintIcon;
+ boolean trustHidden = anyFingerprintIcon;
if (state != mLastState || mDeviceInteractive != mLastDeviceInteractive
|| mScreenOn != mLastScreenOn) {
boolean isAnim = true;
@@ -107,6 +109,16 @@
mDeviceInteractive, mLastScreenOn, mScreenOn);
if (iconRes == R.drawable.lockscreen_fingerprint_draw_off_animation) {
anyFingerprintIcon = true;
+ useAdditionalPadding = true;
+ trustHidden = true;
+ } else if (iconRes == R.drawable.trusted_state_to_error_animation) {
+ anyFingerprintIcon = true;
+ useAdditionalPadding = false;
+ trustHidden = true;
+ } else if (iconRes == R.drawable.error_to_trustedstate_animation) {
+ anyFingerprintIcon = true;
+ useAdditionalPadding = false;
+ trustHidden = false;
}
if (iconRes == -1) {
iconRes = getIconForState(state, mScreenOn, mDeviceInteractive);
@@ -124,7 +136,7 @@
|| icon.getIntrinsicWidth() != iconWidth)) {
icon = new IntrinsicSizeDrawable(icon, iconWidth, iconHeight);
}
- setPaddingRelative(0, 0, 0, anyFingerprintIcon
+ setPaddingRelative(0, 0, 0, useAdditionalPadding
? getResources().getDimensionPixelSize(
R.dimen.fingerprint_icon_additional_padding)
: 0);
@@ -145,7 +157,7 @@
}
// Hide trust circle when fingerprint is running.
- boolean trustManaged = mUnlockMethodCache.isTrustManaged() && !anyFingerprintIcon;
+ boolean trustManaged = mUnlockMethodCache.isTrustManaged() && !trustHidden;
mTrustDrawable.setTrustManaged(trustManaged);
updateClickability();
}
@@ -154,10 +166,13 @@
if (mAccessibilityController == null) {
return;
}
+ boolean trustManagedOrFingerprintAllowed = mUnlockMethodCache.isTrustManaged()
+ || KeyguardUpdateMonitor.getInstance(mContext).isUnlockingWithFingerprintAllowed();
+
boolean clickToUnlock = mAccessibilityController.isTouchExplorationEnabled();
- boolean clickToForceLock = mUnlockMethodCache.isTrustManaged()
+ boolean clickToForceLock = trustManagedOrFingerprintAllowed
&& !mAccessibilityController.isAccessibilityEnabled();
- boolean longClickToForceLock = mUnlockMethodCache.isTrustManaged()
+ boolean longClickToForceLock = trustManagedOrFingerprintAllowed
&& !clickToForceLock;
setClickable(clickToForceLock || clickToUnlock);
setLongClickable(longClickToForceLock);
@@ -208,6 +223,10 @@
boolean oldScreenOn, boolean screenOn) {
if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_ERROR) {
return R.drawable.lockscreen_fingerprint_fp_to_error_state_animation;
+ } else if (oldState == STATE_LOCK_OPEN && newState == STATE_FINGERPRINT_ERROR) {
+ return R.drawable.trusted_state_to_error_animation;
+ } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_LOCK_OPEN) {
+ return R.drawable.error_to_trustedstate_animation;
} else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_FINGERPRINT) {
return R.drawable.lockscreen_fingerprint_error_state_to_fp_animation;
} else if (oldState == STATE_FINGERPRINT && newState == STATE_LOCK_OPEN
@@ -225,10 +244,10 @@
KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
boolean unlockingAllowed = updateMonitor.isUnlockingWithFingerprintAllowed();
- if (mUnlockMethodCache.canSkipBouncer()) {
- return STATE_LOCK_OPEN;
- } else if (mTransientFpError) {
+ if (mTransientFpError) {
return STATE_FINGERPRINT_ERROR;
+ } else if (mUnlockMethodCache.canSkipBouncer()) {
+ return STATE_LOCK_OPEN;
} else if (fingerprintRunning && unlockingAllowed) {
return STATE_FINGERPRINT;
} else if (mUnlockMethodCache.isFaceUnlockRunning()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
index 645baf3..5c01f01 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
@@ -97,11 +97,16 @@
}
};
- public NavigationBarApps(Context context, AttributeSet attrs) {
- super(context, attrs);
+ public static NavigationBarAppsModel getModel(Context context) {
if (sAppsModel == null) {
sAppsModel = new NavigationBarAppsModel(context);
}
+ return sAppsModel;
+ }
+
+ public NavigationBarApps(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ getModel(context);
mPackageManager = context.getPackageManager();
mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
mLayoutInflater = LayoutInflater.from(context);
@@ -419,7 +424,6 @@
}
// "Move" the dragged app by removing it and adding it back at the target location.
- int dragViewIndex = indexOfChild(mDragView);
int targetIndex = indexOfChild(target);
// This works, but is subtle:
// * If dragViewIndex > targetIndex then the dragged app is moving from right to left and
@@ -513,8 +517,7 @@
if (mDragView == null) {
return;
}
- int index = indexOfChild(mDragView);
- removeViewAt(index);
+ removeView(mDragView);
endDrag();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java
index 3bfa4d5..7ff56ba 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java
@@ -151,7 +151,7 @@
button.setOnLongClickListener(mAppLongClickListener);
addView(button);
- ComponentName activityName = getRealActivityForTask(task);
+ ComponentName activityName = getActivityForTask(task);
CharSequence appLabel = NavigationBarApps.getAppLabel(mPackageManager, activityName);
button.setContentDescription(appLabel);
@@ -180,8 +180,17 @@
});
}
- private static ComponentName getRealActivityForTask(RecentTaskInfo task) {
- // Prefer the activity that started the task.
+ private static ComponentName getActivityForTask(RecentTaskInfo task) {
+ // If the task was started from an alias, return the actual activity component that was
+ // initially started.
+ if (task.origActivity != null) {
+ return task.origActivity;
+ }
+ // Prefer the first activity of the task.
+ if (task.baseActivity != null) {
+ return task.baseActivity;
+ }
+ // Then goes the activity that started the task.
if (task.realActivity != null) {
return task.realActivity;
}
@@ -257,16 +266,28 @@
// The drag will go to the pinned section, which wants to launch the main activity
// for the task's package.
RecentTaskInfo task = (RecentTaskInfo) v.getTag();
- String packageName = getRealActivityForTask(task).getPackageName();
- ComponentName component = getLaunchComponentForPackage(packageName, task.userId);
- if (component == null) {
- return false;
+ ComponentName componentName = getActivityForTask(task);
+ UserHandle taskUser = new UserHandle(task.userId);
+ AppInfo appInfo = new AppInfo(componentName, taskUser);
+
+ if (NavigationBarApps.getModel(mContext).buildAppLaunchIntent(appInfo) == null) {
+ // If task's activity is not launcheable, fall back to a launch component of the
+ // task's package.
+ ComponentName component = getLaunchComponentForPackage(
+ componentName.getPackageName(), task.userId);
+
+ if (component == null) {
+ return false;
+ }
+
+ appInfo = new AppInfo(component, taskUser);
}
- if (DEBUG) Slog.d(TAG, "Start drag with " + component);
+ if (DEBUG) {
+ Slog.d(TAG, "Start drag with " + appInfo.getComponentName().flattenToString());
+ }
- NavigationBarApps.startAppDrag(
- icon, new AppInfo(component, new UserHandle(task.userId)));
+ NavigationBarApps.startAppDrag(icon, appInfo);
return true;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 3ad7246..814a65e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -21,7 +21,10 @@
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
+import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -62,6 +65,8 @@
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.StackStateAnimator;
+import java.util.List;
+
public class NotificationPanelView extends PanelView implements
ExpandableView.OnHeightChangedListener, ObservableScrollView.Listener,
View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener,
@@ -2462,7 +2467,28 @@
getCenterIcon().setLaunchingAffordance(launchingAffordance);
}
- public boolean canCameraGestureBeLaunched() {
- return !mAfforanceHelper.isSwipingInProgress();
+ /**
+ * Whether the camera application can be launched for the camera launch gesture.
+ *
+ * @param keyguardIsShowing whether keyguard is being shown
+ */
+ public boolean canCameraGestureBeLaunched(boolean keyguardIsShowing) {
+ ResolveInfo resolveInfo = mKeyguardBottomArea.resolveCameraIntent();
+ String packageToLaunch = (resolveInfo == null || resolveInfo.activityInfo == null)
+ ? null : resolveInfo.activityInfo.packageName;
+ return packageToLaunch != null &&
+ (keyguardIsShowing || !isForegroundApp(packageToLaunch)) &&
+ !mAfforanceHelper.isSwipingInProgress();
+ }
+
+ /**
+ * Return true if the applications with the package name is running in foreground.
+ *
+ * @param pkgName application package name.
+ */
+ private boolean isForegroundApp(String pkgName) {
+ ActivityManager am = getContext().getSystemService(ActivityManager.class);
+ List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
+ return !tasks.isEmpty() && pkgName.equals(tasks.get(0).topActivity.getPackageName());
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 7b04da0..ab1b597 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -4150,7 +4150,8 @@
@Override
public void onCameraLaunchGestureDetected() {
- if (!mNotificationPanel.canCameraGestureBeLaunched()) {
+ if (!mNotificationPanel.canCameraGestureBeLaunched(
+ mStatusBarKeyguardViewManager.isShowing() && mExpandedVisible)) {
return;
}
if (!mDeviceInteractive) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
index 12434ac..385c5d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
@@ -36,6 +36,11 @@
import com.android.systemui.qs.tiles.HotspotTile;
import com.android.systemui.qs.tiles.IntentTile;
import com.android.systemui.qs.tiles.LocationTile;
+import com.android.systemui.qs.tiles.QAirplaneTile;
+import com.android.systemui.qs.tiles.QBluetoothTile;
+import com.android.systemui.qs.tiles.QFlashlightTile;
+import com.android.systemui.qs.tiles.QRotationLockTile;
+import com.android.systemui.qs.tiles.QWifiTile;
import com.android.systemui.qs.tiles.RotationLockTile;
import com.android.systemui.qs.tiles.WifiTile;
import com.android.systemui.statusbar.policy.BluetoothController;
@@ -64,7 +69,7 @@
private static final String TAG = "QSTileHost";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- protected static final String TILES_SETTING = "sysui_qs_tiles";
+ public static final String TILES_SETTING = "sysui_qs_tiles";
private final Context mContext;
private final PhoneStatusBar mStatusBar;
@@ -243,8 +248,8 @@
}
protected QSTile<?> createTile(String tileSpec) {
- if (tileSpec.equals("wifi")) return new WifiTile(this);
- else if (tileSpec.equals("bt")) return new BluetoothTile(this);
+ if (tileSpec.equals("wifi")) return new WifiTile(this, false);
+ else if (tileSpec.equals("bt")) return new BluetoothTile(this, false);
else if (tileSpec.equals("inversion")) return new ColorInversionTile(this);
else if (tileSpec.equals("cell")) return new CellularTile(this);
else if (tileSpec.equals("airplane")) return new AirplaneModeTile(this);
@@ -254,6 +259,16 @@
else if (tileSpec.equals("location")) return new LocationTile(this);
else if (tileSpec.equals("cast")) return new CastTile(this);
else if (tileSpec.equals("hotspot")) return new HotspotTile(this);
+ // Detail only versions of wifi and bluetooth.
+ else if (tileSpec.equals("dwifi")) return new WifiTile(this, true);
+ else if (tileSpec.equals("dbt")) return new BluetoothTile(this, true);
+ // Quick tiles, no text.
+ else if (tileSpec.equals("qwifi")) return new QWifiTile(this);
+ else if (tileSpec.equals("qbt")) return new QBluetoothTile(this);
+ else if (tileSpec.equals("qairplane")) return new QAirplaneTile(this);
+ else if (tileSpec.equals("qrotation")) return new QRotationLockTile(this);
+ else if (tileSpec.equals("qflashlight")) return new QFlashlightTile(this);
+ // Intent tiles.
else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec);
else throw new IllegalArgumentException("Bad tile spec: " + tileSpec);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
index 6d791bf..0f9dd5c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
@@ -36,6 +36,7 @@
import android.util.Log;
import android.util.SparseArray;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnInfo;
@@ -62,8 +63,9 @@
private final IConnectivityManager mConnectivityManagerService;
private final DevicePolicyManager mDevicePolicyManager;
private final UserManager mUserManager;
- private final ArrayList<SecurityControllerCallback> mCallbacks
- = new ArrayList<SecurityControllerCallback>();
+
+ @GuardedBy("mCallbacks")
+ private final ArrayList<SecurityControllerCallback> mCallbacks = new ArrayList<>();
private SparseArray<VpnConfig> mCurrentVpns = new SparseArray<>();
private int mCurrentUserId;
@@ -161,16 +163,20 @@
@Override
public void removeCallback(SecurityControllerCallback callback) {
- if (callback == null) return;
- if (DEBUG) Log.d(TAG, "removeCallback " + callback);
- mCallbacks.remove(callback);
+ synchronized (mCallbacks) {
+ if (callback == null) return;
+ if (DEBUG) Log.d(TAG, "removeCallback " + callback);
+ mCallbacks.remove(callback);
+ }
}
@Override
public void addCallback(SecurityControllerCallback callback) {
- if (callback == null || mCallbacks.contains(callback)) return;
- if (DEBUG) Log.d(TAG, "addCallback " + callback);
- mCallbacks.add(callback);
+ synchronized (mCallbacks) {
+ if (callback == null || mCallbacks.contains(callback)) return;
+ if (DEBUG) Log.d(TAG, "addCallback " + callback);
+ mCallbacks.add(callback);
+ }
}
@Override
@@ -203,8 +209,10 @@
}
private void fireCallbacks() {
- for (SecurityControllerCallback callback : mCallbacks) {
- callback.onStateChanged();
+ synchronized (mCallbacks) {
+ for (SecurityControllerCallback callback : mCallbacks) {
+ callback.onStateChanged();
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java
new file mode 100644
index 0000000..343a231
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java
@@ -0,0 +1,26 @@
+package com.android.systemui.tuner;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.util.AttributeSet;
+
+import com.android.systemui.statusbar.phone.QSTileHost;
+
+public class QSPagingSwitch extends TunerSwitch {
+
+ private static final String QS_PAGE_TILES =
+ "dwifi,dbt,inversion,dnd,cell,airplane,rotation,flashlight,location,"
+ + "hotspot,qwifi,qbt,qrotation,qflashlight,qairplane,cast";
+
+ public QSPagingSwitch(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected boolean persistBoolean(boolean value) {
+ Settings.Secure.putString(getContext().getContentResolver(), QSTileHost.TILES_SETTING,
+ value ? QS_PAGE_TILES : "default");
+ return super.persistBoolean(value);
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java b/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java
index 37ac098..772f866 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java
@@ -389,10 +389,11 @@
mView = super.createTileView(context);
return mView;
}
-
+
@Override
- public boolean supportsDualTargets() {
- return "wifi".equals(mSpec) || "bt".equals(mSpec);
+ public int getTileType() {
+ return "wifi".equals(mSpec) || "bt".equals(mSpec) ? QSTileView.QS_TYPE_DUAL
+ : QSTileView.QS_TYPE_NORMAL;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
index 96ad756..920f875 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
@@ -36,6 +36,8 @@
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
+import com.android.systemui.qs.QSPanel;
+import com.android.systemui.tuner.TunerService.Tunable;
import static com.android.systemui.BatteryMeterView.SHOW_PERCENT_SETTING;
@@ -55,6 +57,8 @@
private SwitchPreference mBatteryPct;
+ private Preference mQsTuner;
+
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -62,7 +66,8 @@
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
setHasOptionsMenu(true);
- findPreference(KEY_QS_TUNER).setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ mQsTuner = findPreference(KEY_QS_TUNER);
+ mQsTuner.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
@@ -96,6 +101,13 @@
}
}).show();
}
+ TunerService.get(getContext()).addTunable(mQsPaging, QSPanel.QS_PAGED_PANEL);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ TunerService.get(getContext()).removeTunable(mQsPaging);
}
@Override
@@ -167,4 +179,12 @@
return true;
}
};
+
+ private final Tunable mQsPaging = new Tunable() {
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ // Only enable QS rearranging when paging is off, because its very broken.
+ mQsTuner.setEnabled(newValue == null || Integer.parseInt(newValue) == 0);
+ }
+ };
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
index 0740e08..54078b0 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
@@ -1,16 +1,23 @@
package com.android.systemui.tuner;
import android.content.Context;
+import android.content.res.TypedArray;
import android.preference.SwitchPreference;
import android.provider.Settings;
import android.util.AttributeSet;
+import com.android.systemui.R;
import com.android.systemui.tuner.TunerService.Tunable;
public class TunerSwitch extends SwitchPreference implements Tunable {
+ private final boolean mDefault;
+
public TunerSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TunerSwitch);
+ mDefault = a.getBoolean(R.styleable.TunerSwitch_defValue, false);
}
@Override
@@ -27,7 +34,7 @@
@Override
public void onTuningChanged(String key, String newValue) {
- setChecked(newValue != null && Integer.parseInt(newValue) != 0);
+ setChecked(newValue != null ? Integer.parseInt(newValue) != 0 : mDefault);
}
@Override
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 4288fa2..882899e 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -177,7 +177,7 @@
private static final long DEFAULT_MIN_FUTURITY = 5 * 1000;
private static final long DEFAULT_MIN_INTERVAL = 60 * 1000;
- private static final long DEFAULT_ALLOW_WHILE_IDLE_SHORT_TIME = 60*1000;
+ private static final long DEFAULT_ALLOW_WHILE_IDLE_SHORT_TIME = DEFAULT_MIN_FUTURITY;
private static final long DEFAULT_ALLOW_WHILE_IDLE_LONG_TIME = 15*60*1000;
private static final long DEFAULT_ALLOW_WHILE_IDLE_WHITELIST_DURATION = 10*1000;
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 468ead0..885c765 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -307,6 +307,7 @@
intentFilter.addAction(Intent.ACTION_USER_SWITCHED);
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
+ intentFilter.addAction(Intent.ACTION_SHUTDOWN);
mContext.registerReceiverAsUser(new BroadcastReceiver() {
@Override
@@ -317,12 +318,36 @@
} else if (Intent.ACTION_MANAGED_PROFILE_ADDED.equals(action)
|| Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) {
updateUserProfiles(mCurrentUserId);
+ } else if (Intent.ACTION_SHUTDOWN.equals(action)) {
+ shutdownComponents();
}
}
}, UserHandle.ALL, intentFilter, null, mLocationHandler);
}
/**
+ * Provides a way for components held by the {@link LocationManagerService} to clean-up
+ * gracefully on system's shutdown.
+ *
+ * NOTES:
+ * 1) Only provides a chance to clean-up on an opt-in basis. This guarantees back-compat
+ * support for components that do not wish to handle such event.
+ */
+ private void shutdownComponents() {
+ if(D) Log.d(TAG, "Shutting down components...");
+
+ LocationProviderInterface gpsProvider = mProvidersByName.get(LocationManager.GPS_PROVIDER);
+ if (gpsProvider != null && gpsProvider.isEnabled()) {
+ gpsProvider.disable();
+ }
+
+ FlpHardwareProvider flpHardwareProvider = FlpHardwareProvider.getInstance(mContext);
+ if (FlpHardwareProvider.isSupported() && flpHardwareProvider != null) {
+ flpHardwareProvider.cleanup();
+ }
+ }
+
+ /**
* Makes a list of userids that are related to the current user. This is
* relevant when using managed profiles. Otherwise the list only contains
* the current user.
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 4aef23b..c0ffb56 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -17411,8 +17411,10 @@
}
// Can't call out of the system process with a lock held, so post a message.
- mHandler.obtainMessage(SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG,
- app.instrumentationUiAutomationConnection).sendToTarget();
+ if (app.instrumentationUiAutomationConnection != null) {
+ mHandler.obtainMessage(SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG,
+ app.instrumentationUiAutomationConnection).sendToTarget();
+ }
app.instrumentationWatcher = null;
app.instrumentationUiAutomationConnection = null;
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index f50df3a..37ddd4d 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -3975,8 +3975,7 @@
* for whatever reason. Ensures the HistoryRecord is updated with the
* correct configuration and all other bookkeeping is handled.
*/
- final boolean ensureActivityConfigurationLocked(ActivityRecord r,
- int globalChanges) {
+ final boolean ensureActivityConfigurationLocked(ActivityRecord r, int globalChanges) {
if (mConfigWillChange) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Skipping config check (will change): " + r);
@@ -4589,25 +4588,19 @@
void addConfigOverride(ActivityRecord r, TaskRecord task) {
final Rect bounds = task.getLaunchBounds();
- final Configuration config =
- mWindowManager.addAppToken(task.mActivities.indexOf(r), r.appToken,
- r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,
- (r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0, r.userId,
- r.info.configChanges, task.voiceSession != null, r.mLaunchTaskBehind,
- bounds);
- if (config != null) {
- task.updateOverrideConfiguration(config, bounds);
- }
+ final Configuration config = task.updateOverrideConfiguration(mStackId, bounds);
+ mWindowManager.addAppToken(task.mActivities.indexOf(r), r.appToken,
+ r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,
+ (r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0, r.userId,
+ r.info.configChanges, task.voiceSession != null, r.mLaunchTaskBehind,
+ bounds, config);
r.taskConfigOverride = task.mOverrideConfig;
}
private void setAppTask(ActivityRecord r, TaskRecord task) {
final Rect bounds = task.getLaunchBounds();
- final Configuration config =
- mWindowManager.setAppTask(r.appToken, task.taskId, task.getLaunchBounds());
- if (config != null) {
- task.updateOverrideConfiguration(config, bounds);
- }
+ final Configuration config = task.updateOverrideConfiguration(mStackId, bounds);
+ mWindowManager.setAppTask(r.appToken, task.taskId, task.getLaunchBounds(), config);
r.taskConfigOverride = task.mOverrideConfig;
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index c86056b..33e0ef8 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -97,7 +97,6 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.EventLog;
-import android.util.IntArray;
import android.util.Slog;
import android.util.SparseArray;
@@ -334,6 +333,9 @@
// temp. rect used during resize calculation so we don't need to create a new object each time.
private final Rect tempRect = new Rect();
+ private final SparseArray<Configuration> mTmpConfigs = new SparseArray<>();
+ private final SparseArray<Rect> mTmpBounds = new SparseArray<>();
+
/**
* Description of a request to start a new activity, which has been held
* due to app switches being disabled.
@@ -2917,19 +2919,19 @@
ActivityRecord r = stack.topRunningActivityLocked(null);
final boolean resizeTasks = r != null && r.task.mResizeable;
- final IntArray changedTaskIds = new IntArray(stack.numTasks());
- final List<Configuration> newTaskConfigs = new ArrayList<>(stack.numTasks());
- stack.mFullscreen = mWindowManager.resizeStack(
- stackId, bounds, resizeTasks, changedTaskIds, newTaskConfigs);
- for (int i = changedTaskIds.size() - 1; i >= 0; i--) {
- final TaskRecord task = anyTaskForIdLocked(changedTaskIds.get(i), false);
- if (task == null) {
- Slog.wtf(TAG, "Task in WindowManager, but not in ActivityManager???");
- continue;
+ mTmpBounds.clear();
+ mTmpConfigs.clear();
+ if (resizeTasks) {
+ ArrayList<TaskRecord> tasks = stack.getAllTasks();
+ for (int i = tasks.size() - 1; i >= 0; i--) {
+ TaskRecord task = tasks.get(i);
+ task.updateOverrideConfiguration(stackId, bounds);
+ mTmpConfigs.put(task.taskId, task.mOverrideConfig);
+ mTmpBounds.put(task.taskId, task.mBounds);
}
- task.updateOverrideConfiguration(newTaskConfigs.get(i), bounds);
}
-
+ stack.mFullscreen = mWindowManager.resizeStack(stackId, bounds, resizeTasks, mTmpConfigs,
+ mTmpBounds);
if (stack.mStackId == DOCKED_STACK_ID) {
// Dock stack funness...Yay!
if (stack.mFullscreen) {
@@ -3024,25 +3026,27 @@
stackId = FREEFORM_WORKSPACE_STACK_ID;
}
if (stackId != task.stack.mStackId) {
- final String reason = "resizeTask";
- final ActivityStack stack =
- moveTaskToStackUncheckedLocked(task, stackId, ON_TOP, !FORCE_FOCUS, reason);
+ moveTaskToStackUncheckedLocked(task, stackId, ON_TOP, !FORCE_FOCUS, "resizeTask");
}
- final Configuration overrideConfig = mWindowManager.resizeTask(task.taskId, bounds);
- if (task.updateOverrideConfiguration(overrideConfig, bounds)) {
+ final Configuration overrideConfig = task.updateOverrideConfiguration(stackId, bounds);
+ // This variable holds information whether the configuration didn't change in a signficant
+ // way and the activity was kept the way it was. If it's false, it means the activity had
+ // to be relaunched due to configuration change.
+ boolean kept = true;
+ if (overrideConfig != null) {
ActivityRecord r = task.topRunningActivityLocked(null);
if (r != null) {
final ActivityStack stack = task.stack;
- final boolean updated = stack.ensureActivityConfigurationLocked(r, 0);
- // And we need to make sure at this point that all other activities
- // are made visible with the correct configuration.
+ kept = stack.ensureActivityConfigurationLocked(r, 0);
+ // All other activities must be made visible with their correct configuration.
ensureActivitiesVisibleLocked(r, 0);
- if (!updated) {
+ if (!kept) {
resumeTopActivitiesLocked(stack, null, null);
}
}
}
+ mWindowManager.resizeTask(task.taskId, bounds, task.mOverrideConfig, kept);
}
ActivityStack createStackOnDisplay(int stackId, int displayId, boolean onTop) {
diff --git a/services/core/java/com/android/server/am/LaunchingTaskPositioner.java b/services/core/java/com/android/server/am/LaunchingTaskPositioner.java
index 5c4fd13..735c06f 100644
--- a/services/core/java/com/android/server/am/LaunchingTaskPositioner.java
+++ b/services/core/java/com/android/server/am/LaunchingTaskPositioner.java
@@ -16,6 +16,7 @@
package com.android.server.am;
+import static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -234,7 +235,7 @@
break;
}
}
- task.setInitialBounds(proposal);
+ task.updateOverrideConfiguration(FREEFORM_WORKSPACE_STACK_ID, proposal);
}
private boolean shiftedToFar(Rect start, int shiftPolicy) {
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 9cbaec5..12c7b86 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -20,6 +20,7 @@
import static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.HOME_STACK_ID;
+import static android.app.ActivityManager.INVALID_STACK_ID;
import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
import static android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS;
import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS;
@@ -52,6 +53,7 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.service.voice.IVoiceInteractionSession;
+import android.util.DisplayMetrics;
import android.util.Slog;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.util.XmlUtils;
@@ -63,6 +65,7 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Objects;
final class TaskRecord {
private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskRecord" : TAG_AM;
@@ -106,6 +109,13 @@
static final int INVALID_TASK_ID = -1;
+ // The height/width divide used when fitting a task within a bounds with method
+ // {@link #fitWithinBounds}.
+ // We always want the task to to be visible in the bounds without affecting its size when
+ // fitting. To make sure this is the case, we don't adjust the task left or top side pass
+ // the input bounds right or bottom side minus the width or height divided by this value.
+ private static final int FIT_WITHIN_BOUNDS_DIVIDER = 3;
+
final int taskId; // Unique identifier for this task.
String affinity; // The affinity name for this task, or null; may change identity.
String rootAffinity; // Initial base affinity, or null; does not change from initial root.
@@ -218,6 +228,8 @@
Configuration mOverrideConfig = Configuration.EMPTY;
+ private Rect mTmpRect = new Rect();
+
TaskRecord(ActivityManagerService service, int _taskId, ActivityInfo info, Intent _intent,
IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) {
mService = service;
@@ -271,8 +283,7 @@
long _firstActiveTime, long _lastActiveTime, long lastTimeMoved,
boolean neverRelinquishIdentity, TaskDescription _lastTaskDescription,
int taskAffiliation, int prevTaskId, int nextTaskId, int taskAffiliationColor,
- int callingUid, String callingPackage, boolean resizeable, boolean privileged,
- Rect bounds) {
+ int callingUid, String callingPackage, boolean resizeable, boolean privileged) {
mService = service;
mFilename = String.valueOf(_taskId) + TASK_THUMBNAIL_SUFFIX +
TaskPersister.IMAGE_EXTENSION;
@@ -309,7 +320,6 @@
mCallingPackage = callingPackage;
mResizeable = resizeable;
mPrivileged = privileged;
- mBounds = mLastNonFullscreenBounds = bounds;
}
void touchActiveTime() {
@@ -1163,7 +1173,8 @@
autoRemoveRecents, askedCompatMode, taskType, userId, effectiveUid, lastDescription,
activities, firstActiveTime, lastActiveTime, lastTimeOnTop, neverRelinquishIdentity,
taskDescription, taskAffiliation, prevTaskId, nextTaskId, taskAffiliationColor,
- callingUid, callingPackage, resizeable, privileged, bounds);
+ callingUid, callingPackage, resizeable, privileged);
+ task.updateOverrideConfiguration(INVALID_STACK_ID, bounds);
for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) {
activities.get(activityNdx).task = task;
@@ -1173,25 +1184,51 @@
return task;
}
- boolean updateOverrideConfiguration(Configuration newConfig, Rect bounds) {
+ /**
+ * Update task's override configuration based on the bounds.
+ * @return Update configuration or null if there is no change.
+ */
+ Configuration updateOverrideConfiguration(int stackId, Rect bounds) {
+ if (stackId == FREEFORM_WORKSPACE_STACK_ID) {
+ // For freeform stack we don't adjust the size of the tasks to match that of the
+ // stack, but we do try to make sure the tasks are still contained with the
+ // bounds of the stack.
+ bounds = fitWithinBounds(bounds);
+ }
+ if (Objects.equals(mBounds, bounds)) {
+ return null;
+ }
Configuration oldConfig = mOverrideConfig;
- mOverrideConfig = (newConfig == null) ? Configuration.EMPTY : newConfig;
- // We override the configuration only when the task's dimensions are different from the
- // display. In this manner, we know that if the override configuration is empty, the task
- // is necessarily fullscreen.
- mFullscreen = Configuration.EMPTY.equals(mOverrideConfig);
+
+ mFullscreen = bounds == null;
if (mFullscreen) {
if (mBounds != null && stack.mStackId != DOCKED_STACK_ID) {
mLastNonFullscreenBounds = mBounds;
}
mBounds = null;
+ mOverrideConfig = Configuration.EMPTY;
} else {
mBounds = new Rect(bounds);
if (stack.mStackId != DOCKED_STACK_ID) {
mLastNonFullscreenBounds = mBounds;
}
+
+ final Configuration serviceConfig = mService.mConfiguration;
+ mOverrideConfig = new Configuration(serviceConfig);
+ // TODO(multidisplay): Update Dp to that of display stack is on.
+ final float density = serviceConfig.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
+ mOverrideConfig.screenWidthDp =
+ Math.min((int)(mBounds.width() / density), serviceConfig.screenWidthDp);
+ mOverrideConfig.screenHeightDp =
+ Math.min((int)(mBounds.height() / density), serviceConfig.screenHeightDp);
+ mOverrideConfig.smallestScreenWidthDp =
+ Math.min(mOverrideConfig.screenWidthDp, mOverrideConfig.screenHeightDp);
+ mOverrideConfig.orientation =
+ (mOverrideConfig.screenWidthDp <= mOverrideConfig.screenHeightDp)
+ ? Configuration.ORIENTATION_PORTRAIT
+ : Configuration.ORIENTATION_LANDSCAPE;
}
- return !mOverrideConfig.equals(oldConfig);
+ return !mOverrideConfig.equals(oldConfig) ? mOverrideConfig : null;
}
/** Returns the stack that should be used to launch this task. */
@@ -1225,12 +1262,39 @@
return mLastNonFullscreenBounds;
}
- void setInitialBounds(Rect rect) {
- if (mBounds == null) {
- mBounds = new Rect();
+ /** Fits the tasks within the input bounds adjusting the task bounds as needed.
+ * @param bounds Bounds to fit the task within. Nothing is done if null.
+ * @return Returns final configuration after updating with the adjusted bounds.
+ * */
+ Rect fitWithinBounds(Rect bounds) {
+ if (bounds == null || mBounds == null || bounds.contains(mBounds)) {
+ return bounds;
}
- mBounds.set(rect);
- mLastNonFullscreenBounds = mBounds;
+ mTmpRect.set(mBounds);
+
+ if (mBounds.left < bounds.left || mBounds.right > bounds.right) {
+ final int maxRight = bounds.right - (bounds.width() / FIT_WITHIN_BOUNDS_DIVIDER);
+ int horizontalDiff = bounds.left - mBounds.left;
+ if ((horizontalDiff < 0 && mBounds.left >= maxRight)
+ || (mBounds.left + horizontalDiff >= maxRight)) {
+ horizontalDiff = maxRight - mBounds.left;
+ }
+ mTmpRect.left += horizontalDiff;
+ mTmpRect.right += horizontalDiff;
+ }
+
+ if (mBounds.top < bounds.top || mBounds.bottom > bounds.bottom) {
+ final int maxBottom = bounds.bottom - (bounds.height() / FIT_WITHIN_BOUNDS_DIVIDER);
+ int verticalDiff = bounds.top - mBounds.top;
+ if ((verticalDiff < 0 && mBounds.top >= maxBottom)
+ || (mBounds.top + verticalDiff >= maxBottom)) {
+ verticalDiff = maxBottom - mBounds.top;
+ }
+ mTmpRect.top += verticalDiff;
+ mTmpRect.bottom += verticalDiff;
+ }
+
+ return mTmpRect;
}
void dump(PrintWriter pw, String prefix) {
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 470bd5a..cbb3c39 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -24,7 +24,9 @@
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
+import android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback;
import android.os.Binder;
+import android.os.DeadObjectException;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
@@ -51,7 +53,6 @@
import android.hardware.fingerprint.IFingerprintDaemon;
import android.hardware.fingerprint.IFingerprintDaemonCallback;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.view.Display;
import static android.Manifest.permission.MANAGE_FINGERPRINT;
import static android.Manifest.permission.RESET_FINGERPRINT_LOCKOUT;
@@ -60,6 +61,7 @@
import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -83,6 +85,8 @@
private ClientMonitor mAuthClient = null;
private ClientMonitor mEnrollClient = null;
private ClientMonitor mRemoveClient = null;
+ private final ArrayList<FingerprintServiceLockoutResetMonitor> mLockoutMonitors =
+ new ArrayList<>();
private final AppOpsManager mAppOps;
private static final long MS_PER_SEC = 1000;
@@ -129,7 +133,7 @@
public void binderDied() {
Slog.v(TAG, "fingerprintd died");
mDaemon = null;
- dispatchError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
+ handleError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
}
public IFingerprintDaemon getFingerprintDaemon() {
@@ -157,7 +161,7 @@
return mDaemon;
}
- protected void dispatchEnumerate(long deviceId, int[] fingerIds, int[] groupIds) {
+ protected void handleEnumerate(long deviceId, int[] fingerIds, int[] groupIds) {
if (fingerIds.length != groupIds.length) {
Slog.w(TAG, "fingerIds and groupIds differ in length: f[]="
+ fingerIds + ", g[]=" + groupIds);
@@ -167,7 +171,7 @@
// TODO: update fingerprint/name pairs
}
- protected void dispatchRemoved(long deviceId, int fingerId, int groupId) {
+ protected void handleRemoved(long deviceId, int fingerId, int groupId) {
final ClientMonitor client = mRemoveClient;
if (fingerId != 0) {
removeTemplateForUser(mRemoveClient, fingerId);
@@ -177,7 +181,7 @@
}
}
- protected void dispatchError(long deviceId, int error) {
+ protected void handleError(long deviceId, int error) {
if (mEnrollClient != null) {
final IBinder token = mEnrollClient.token;
if (mEnrollClient.sendError(error)) {
@@ -193,7 +197,7 @@
}
}
- protected void dispatchAuthenticated(long deviceId, int fingerId, int groupId) {
+ protected void handleAuthenticated(long deviceId, int fingerId, int groupId) {
if (mAuthClient != null) {
final IBinder token = mAuthClient.token;
if (mAuthClient.sendAuthenticated(fingerId, groupId)) {
@@ -203,7 +207,7 @@
}
}
- protected void dispatchAcquired(long deviceId, int acquiredInfo) {
+ protected void handleAcquired(long deviceId, int acquiredInfo) {
if (mEnrollClient != null) {
if (mEnrollClient.sendAcquired(acquiredInfo)) {
removeClient(mEnrollClient);
@@ -215,16 +219,7 @@
}
}
- private void userActivity() {
- long now = SystemClock.uptimeMillis();
- mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
- }
-
- void handleUserSwitching(int userId) {
- updateActiveGroup(userId);
- }
-
- protected void dispatchEnrollResult(long deviceId, int fingerId, int groupId, int remaining) {
+ protected void handleEnrollResult(long deviceId, int fingerId, int groupId, int remaining) {
if (mEnrollClient != null) {
if (mEnrollClient.sendEnrollResult(fingerId, groupId, remaining)) {
if (remaining == 0) {
@@ -235,6 +230,15 @@
}
}
+ private void userActivity() {
+ long now = SystemClock.uptimeMillis();
+ mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+ }
+
+ void handleUserSwitching(int userId) {
+ updateActiveGroup(userId);
+ }
+
private void removeClient(ClientMonitor client) {
if (client == null) return;
client.destroy();
@@ -259,6 +263,7 @@
// If we're asked to reset failed attempts externally (i.e. from Keyguard), the runnable
// may still be in the queue; remove it.
mHandler.removeCallbacks(mLockoutReset);
+ notifyLockoutResetMonitors();
}
private boolean handleFailedAttempt(ClientMonitor clientMonitor) {
@@ -298,7 +303,7 @@
final int result = daemon.enroll(cryptoToken, groupId, timeout);
if (result != 0) {
Slog.w(TAG, "startEnroll failed, result=" + result);
- dispatchError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
+ handleError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
}
} catch (RemoteException e) {
Slog.e(TAG, "startEnroll failed", e);
@@ -392,7 +397,7 @@
final int result = daemon.authenticate(opId, groupId);
if (result != 0) {
Slog.w(TAG, "startAuthentication failed, result=" + result);
- dispatchError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
+ handleError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
}
} catch (RemoteException e) {
Slog.e(TAG, "startAuthentication failed", e);
@@ -442,7 +447,7 @@
final int result = daemon.remove(fingerId, userId);
if (result != 0) {
Slog.w(TAG, "startRemove with id = " + fingerId + " failed, result=" + result);
- dispatchError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
+ handleError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
}
} catch (RemoteException e) {
Slog.e(TAG, "startRemove failed", e);
@@ -499,6 +504,23 @@
opPackageName) == AppOpsManager.MODE_ALLOWED;
}
+ private void addLockoutResetMonitor(FingerprintServiceLockoutResetMonitor monitor) {
+ if (!mLockoutMonitors.contains(monitor)) {
+ mLockoutMonitors.add(monitor);
+ }
+ }
+
+ private void removeLockoutResetCallback(
+ FingerprintServiceLockoutResetMonitor monitor) {
+ mLockoutMonitors.remove(monitor);
+ }
+
+ private void notifyLockoutResetMonitors() {
+ for (int i = 0; i < mLockoutMonitors.size(); i++) {
+ mLockoutMonitors.get(i).sendLockoutReset();
+ }
+ }
+
private class ClientMonitor implements IBinder.DeathRecipient {
IBinder token;
IFingerprintServiceReceiver receiver;
@@ -614,7 +636,7 @@
FingerprintUtils.vibrateFingerprintSuccess(getContext());
}
result |= true; // we have a valid fingerprint
- mLockoutReset.run();
+ mHandler.post(mLockoutReset);
}
return result;
}
@@ -654,36 +676,97 @@
}
}
+ private class FingerprintServiceLockoutResetMonitor {
+
+ private final IFingerprintServiceLockoutResetCallback mCallback;
+
+ public FingerprintServiceLockoutResetMonitor(
+ IFingerprintServiceLockoutResetCallback callback) {
+ mCallback = callback;
+ }
+
+ public void sendLockoutReset() {
+ if (mCallback != null) {
+ try {
+ mCallback.onLockoutReset(mHalDeviceId);
+ } catch (DeadObjectException e) {
+ Slog.w(TAG, "Death object while invoking onLockoutReset: ", e);
+ mHandler.post(mRemoveCallbackRunnable);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to invoke onLockoutReset: ", e);
+ }
+ }
+ }
+
+ private final Runnable mRemoveCallbackRunnable = new Runnable() {
+ @Override
+ public void run() {
+ removeLockoutResetCallback(FingerprintServiceLockoutResetMonitor.this);
+ }
+ };
+ }
+
private IFingerprintDaemonCallback mDaemonCallback = new IFingerprintDaemonCallback.Stub() {
@Override
- public void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining) {
- dispatchEnrollResult(deviceId, fingerId, groupId, remaining);
+ public void onEnrollResult(final long deviceId, final int fingerId, final int groupId,
+ final int remaining) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ handleEnrollResult(deviceId, fingerId, groupId, remaining);
+ }
+ });
}
@Override
- public void onAcquired(long deviceId, int acquiredInfo) {
- dispatchAcquired(deviceId, acquiredInfo);
+ public void onAcquired(final long deviceId, final int acquiredInfo) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ handleAcquired(deviceId, acquiredInfo);
+ }
+ });
}
@Override
- public void onAuthenticated(long deviceId, int fingerId, int groupId) {
- dispatchAuthenticated(deviceId, fingerId, groupId);
+ public void onAuthenticated(final long deviceId, final int fingerId, final int groupId) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ handleAuthenticated(deviceId, fingerId, groupId);
+ }
+ });
}
@Override
- public void onError(long deviceId, int error) {
- dispatchError(deviceId, error);
+ public void onError(final long deviceId, final int error) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ handleError(deviceId, error);
+ }
+ });
}
@Override
- public void onRemoved(long deviceId, int fingerId, int groupId) {
- dispatchRemoved(deviceId, fingerId, groupId);
+ public void onRemoved(final long deviceId, final int fingerId, final int groupId) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ handleRemoved(deviceId, fingerId, groupId);
+ }
+ });
}
@Override
- public void onEnumerate(long deviceId, int[] fingerIds, int[] groupIds) {
- dispatchEnumerate(deviceId, fingerIds, groupIds);
+ public void onEnumerate(final long deviceId, final int[] fingerIds, final int[] groupIds) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ handleEnumerate(deviceId, fingerIds, groupIds);
+ }
+ });
}
};
@@ -891,7 +974,19 @@
public void resetTimeout(byte [] token) {
checkPermission(RESET_FINGERPRINT_LOCKOUT);
// TODO: confirm security token when we move timeout management into the HAL layer.
- mLockoutReset.run();
+ mHandler.post(mLockoutReset);
+ }
+
+ @Override
+ public void addLockoutResetCallback(final IFingerprintServiceLockoutResetCallback callback)
+ throws RemoteException {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ addLockoutResetMonitor(
+ new FingerprintServiceLockoutResetMonitor(callback));
+ }
+ });
}
}
diff --git a/services/core/java/com/android/server/location/FlpHardwareProvider.java b/services/core/java/com/android/server/location/FlpHardwareProvider.java
index d4f3c4d..6d08c36 100644
--- a/services/core/java/com/android/server/location/FlpHardwareProvider.java
+++ b/services/core/java/com/android/server/location/FlpHardwareProvider.java
@@ -16,19 +16,18 @@
package com.android.server.location;
+import android.content.Context;
import android.hardware.location.GeofenceHardware;
import android.hardware.location.GeofenceHardwareImpl;
import android.hardware.location.GeofenceHardwareRequestParcelable;
import android.hardware.location.IFusedLocationHardware;
import android.hardware.location.IFusedLocationHardwareSink;
-import android.location.IFusedGeofenceHardware;
import android.location.FusedBatchOptions;
+import android.location.IFusedGeofenceHardware;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationRequest;
-
-import android.content.Context;
import android.os.Bundle;
import android.os.Looper;
import android.os.RemoteException;
@@ -301,7 +300,6 @@
private native void nativeRequestBatchedLocation(int lastNLocations);
private native void nativeFlushBatchedLocations();
private native void nativeInjectLocation(Location location);
- // TODO [Fix] sort out the lifetime of the instance
private native void nativeCleanup();
// FlpDiagnosticsInterface members
@@ -341,6 +339,11 @@
return mGeofenceHardwareService;
}
+ public void cleanup() {
+ Log.i(TAG, "Calling nativeCleanup()");
+ nativeCleanup();
+ }
+
private final IFusedLocationHardware mLocationHardware = new IFusedLocationHardware.Stub() {
@Override
public void registerSink(IFusedLocationHardwareSink eventSink) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 8cec7eb..e1f3528 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1146,23 +1146,24 @@
// need to do anything. The pending install
// will be processed later on.
if (!mBound) {
- try {
- Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "bindMCS",
- System.identityHashCode(params));
- // If this is the only one pending we might
- // have to bind to the service again.
- if (!connectToService()) {
- Slog.e(TAG, "Failed to bind to media container service");
- params.serviceError();
- return;
- } else {
- // Once we bind to the service, the first
- // pending request will be processed.
- mPendingInstalls.add(idx, params);
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",
+ System.identityHashCode(mHandler));
+ // If this is the only one pending we might
+ // have to bind to the service again.
+ if (!connectToService()) {
+ Slog.e(TAG, "Failed to bind to media container service");
+ params.serviceError();
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",
+ System.identityHashCode(mHandler));
+ if (params.traceMethod != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, params.traceMethod,
+ params.traceCookie);
}
- } finally {
- Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "bindMCS",
- System.identityHashCode(params));
+ return;
+ } else {
+ // Once we bind to the service, the first
+ // pending request will be processed.
+ mPendingInstalls.add(idx, params);
}
} else {
mPendingInstalls.add(idx, params);
@@ -1178,6 +1179,8 @@
if (DEBUG_INSTALL) Slog.i(TAG, "mcs_bound");
if (msg.obj != null) {
mContainerService = (IMediaContainerService) msg.obj;
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",
+ System.identityHashCode(mHandler));
}
if (mContainerService == null) {
if (!mBound) {
@@ -1189,6 +1192,11 @@
params.serviceError();
Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
System.identityHashCode(params));
+ if (params.traceMethod != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER,
+ params.traceMethod, params.traceCookie);
+ }
+ return;
}
mPendingInstalls.clear();
} else {
@@ -1197,6 +1205,9 @@
} else if (mPendingInstalls.size() > 0) {
HandlerParams params = mPendingInstalls.get(0);
if (params != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
+ System.identityHashCode(params));
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "startCopy");
if (params.startCopy()) {
// We are done... look for more work or to
// go idle.
@@ -1225,9 +1236,8 @@
mHandler.sendEmptyMessage(MCS_BOUND);
}
}
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
- Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
- System.identityHashCode(params));
} else {
// Should never happen ideally.
Slog.w(TAG, "Empty queue");
@@ -1468,6 +1478,11 @@
Slog.i(TAG, "Observer no longer exists.");
}
}
+ if (args.traceMethod != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, args.traceMethod,
+ args.traceCookie);
+ }
+ return;
} else {
Slog.e(TAG, "Bogus post-install token " + msg.arg1);
}
@@ -1551,11 +1566,12 @@
state.getInstallArgs().getUser());
}
+ Trace.asyncTraceEnd(
+ TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);
+
processPendingInstall(args, ret);
mHandler.sendEmptyMessage(MCS_UNBIND);
}
- Trace.asyncTraceEnd(
- TRACE_TAG_PACKAGE_MANAGER, "pendingVerification", verificationId);
break;
}
case PACKAGE_VERIFIED: {
@@ -1591,8 +1607,10 @@
ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
}
- processPendingInstall(args, ret);
+ Trace.asyncTraceEnd(
+ TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);
+ processPendingInstall(args, ret);
mHandler.sendEmptyMessage(MCS_UNBIND);
}
@@ -4248,16 +4266,18 @@
if (ri != null) {
return ri;
}
+ ri = new ResolveInfo(mResolveInfo);
+ ri.activityInfo = new ActivityInfo(ri.activityInfo);
+ ri.activityInfo.applicationInfo = new ApplicationInfo(
+ ri.activityInfo.applicationInfo);
if (userId != 0) {
- ri = new ResolveInfo(mResolveInfo);
- ri.activityInfo = new ActivityInfo(ri.activityInfo);
- ri.activityInfo.applicationInfo = new ApplicationInfo(
- ri.activityInfo.applicationInfo);
ri.activityInfo.applicationInfo.uid = UserHandle.getUid(userId,
UserHandle.getAppId(ri.activityInfo.applicationInfo.uid));
- return ri;
}
- return mResolveInfo;
+ // Make sure that the resolver is displayable in car mode
+ if (ri.activityInfo.metaData == null) ri.activityInfo.metaData = new Bundle();
+ ri.activityInfo.metaData.putBoolean(Intent.METADATA_DOCK_HOME, true);
+ return ri;
}
}
return null;
@@ -6262,10 +6282,26 @@
@Override
public boolean performDexOptIfNeeded(String packageName, String instructionSet) {
- return performDexOpt(packageName, instructionSet, false);
+ return performDexOptTraced(packageName, instructionSet, false);
}
- public boolean performDexOpt(String packageName, String instructionSet, boolean backgroundDexopt) {
+ public boolean performDexOpt(
+ String packageName, String instructionSet, boolean backgroundDexopt) {
+ return performDexOptTraced(packageName, instructionSet, backgroundDexopt);
+ }
+
+ private boolean performDexOptTraced(
+ String packageName, String instructionSet, boolean backgroundDexopt) {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+ try {
+ return performDexOptInternal(packageName, instructionSet, backgroundDexopt);
+ } finally {
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ }
+ }
+
+ private boolean performDexOptInternal(
+ String packageName, String instructionSet, boolean backgroundDexopt) {
boolean dexopt = mLazyDexOpt || backgroundDexopt;
boolean updateUsage = !backgroundDexopt; // Don't update usage if this is just a backgroundDexopt
if (!dexopt && !updateUsage) {
@@ -6345,8 +6381,13 @@
synchronized (mInstallLock) {
final String[] instructionSets = new String[] {
getPrimaryInstructionSet(pkg.applicationInfo) };
+
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+
final int res = mPackageDexOptimizer.performDexOpt(pkg, instructionSets,
true /*forceDex*/, false /* defer */, true /* inclDependencies */);
+
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
if (res != PackageDexOptimizer.DEX_OPT_PERFORMED) {
throw new IllegalStateException("Failed to dexopt: " + res);
}
@@ -7232,19 +7273,24 @@
// We also need to dexopt any apps that are dependent on this library. Note that
// if these fail, we should abort the install since installing the library will
// result in some apps being broken.
- if (clientLibPkgs != null) {
- if ((scanFlags & SCAN_NO_DEX) == 0) {
- for (int i = 0; i < clientLibPkgs.size(); i++) {
- PackageParser.Package clientPkg = clientLibPkgs.get(i);
- int result = mPackageDexOptimizer.performDexOpt(clientPkg,
- null /* instruction sets */, forceDex,
- (scanFlags & SCAN_DEFER_DEX) != 0, false);
- if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
- throw new PackageManagerException(INSTALL_FAILED_DEXOPT,
- "scanPackageLI failed to dexopt clientLibPkgs");
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+ try {
+ if (clientLibPkgs != null) {
+ if ((scanFlags & SCAN_NO_DEX) == 0) {
+ for (int i = 0; i < clientLibPkgs.size(); i++) {
+ PackageParser.Package clientPkg = clientLibPkgs.get(i);
+ int result = mPackageDexOptimizer.performDexOpt(clientPkg,
+ null /* instruction sets */, forceDex,
+ (scanFlags & SCAN_DEFER_DEX) != 0, false);
+ if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
+ throw new PackageManagerException(INSTALL_FAILED_DEXOPT,
+ "scanPackageLI failed to dexopt clientLibPkgs");
+ }
}
}
}
+ } finally {
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
// Request the ActivityManager to kill the process(only for existing packages)
@@ -7854,8 +7900,12 @@
ps.pkg.applicationInfo.primaryCpuAbi = adjustedAbi;
Slog.i(TAG, "Adjusting ABI for : " + ps.name + " to " + adjustedAbi);
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+
int result = mPackageDexOptimizer.performDexOpt(ps.pkg,
null /* instruction sets */, forceDexOpt, deferDexOpt, true);
+
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
ps.primaryCpuAbiString = null;
ps.pkg.applicationInfo.primaryCpuAbi = null;
@@ -9638,16 +9688,24 @@
final OriginInfo origin = OriginInfo.fromUntrustedFile(originFile);
final Message msg = mHandler.obtainMessage(INIT_COPY);
- msg.obj = new InstallParams(origin, null, observer, installFlags, installerPackageName,
- null, verificationParams, user, packageAbiOverride, null);
+ final InstallParams params = new InstallParams(origin, null, observer, installFlags,
+ installerPackageName, null, verificationParams, user, packageAbiOverride, null);
+ params.setTraceMethod("installAsUser").setTraceCookie(System.identityHashCode(params));
+ msg.obj = params;
+
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installAsUser",
+ System.identityHashCode(msg.obj));
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
+ System.identityHashCode(msg.obj));
+
mHandler.sendMessage(msg);
}
void installStage(String packageName, File stagedDir, String stagedCid,
- IPackageInstallObserver2 observer, PackageInstaller.SessionParams params,
+ IPackageInstallObserver2 observer, PackageInstaller.SessionParams sessionParams,
String installerPackageName, int installerUid, UserHandle user) {
- final VerificationParams verifParams = new VerificationParams(null, params.originatingUri,
- params.referrerUri, installerUid, null);
+ final VerificationParams verifParams = new VerificationParams(
+ null, sessionParams.originatingUri, sessionParams.referrerUri, installerUid, null);
verifParams.setInstallerUid(installerUid);
final OriginInfo origin;
@@ -9658,10 +9716,15 @@
}
final Message msg = mHandler.obtainMessage(INIT_COPY);
- msg.obj = new InstallParams(origin, null, observer, params.installFlags,
- installerPackageName, params.volumeUuid, verifParams, user, params.abiOverride,
- params.grantedRuntimePermissions);
+ final InstallParams params = new InstallParams(origin, null, observer,
+ sessionParams.installFlags, installerPackageName, sessionParams.volumeUuid,
+ verifParams, user, sessionParams.abiOverride,
+ sessionParams.grantedRuntimePermissions);
+ params.setTraceMethod("installStage").setTraceCookie(System.identityHashCode(params));
+ msg.obj = params;
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStage",
+ System.identityHashCode(msg.obj));
Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
System.identityHashCode(msg.obj));
@@ -9990,6 +10053,7 @@
if (DEBUG_INSTALL) {
Slog.v(TAG, "BM finishing package install for " + token);
}
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
final Message msg = mHandler.obtainMessage(POST_INSTALL, token, 0);
mHandler.sendMessage(msg);
@@ -10286,8 +10350,6 @@
} catch (Exception e) {
Slog.e(TAG, "Exception trying to enqueue restore", e);
doRestore = false;
- } finally {
- Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
}
} else {
Slog.e(TAG, "Backup Manager not found!");
@@ -10320,6 +10382,8 @@
/** User handle for the user requesting the information or installation. */
private final UserHandle mUser;
+ String traceMethod;
+ int traceCookie;
HandlerParams(UserHandle user) {
mUser = user;
@@ -10329,6 +10393,16 @@
return mUser;
}
+ HandlerParams setTraceMethod(String traceMethod) {
+ this.traceMethod = traceMethod;
+ return this;
+ }
+
+ HandlerParams setTraceCookie(int traceCookie) {
+ this.traceCookie = traceCookie;
+ return this;
+ }
+
final boolean startCopy() {
boolean res;
try {
@@ -10553,7 +10627,6 @@
final String packageAbiOverride;
final String[] grantedRuntimePermissions;
-
InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
int installFlags, String installerPackageName, String volumeUuid,
VerificationParams verificationParams, UserHandle user, String packageAbiOverride,
@@ -10861,7 +10934,7 @@
if (ret == PackageManager.INSTALL_SUCCEEDED
&& mRequiredVerifierPackage != null) {
Trace.asyncTraceBegin(
- TRACE_TAG_PACKAGE_MANAGER, "pendingVerification", verificationId);
+ TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);
/*
* Send the intent to the required verification agent,
* but only start the verification timeout after the
@@ -10999,6 +11072,9 @@
final UserHandle user;
final String abiOverride;
final String[] installGrantPermissions;
+ /** If non-null, drop an async trace when the install completes */
+ final String traceMethod;
+ final int traceCookie;
// The list of instruction sets supported by this app. This is currently
// only used during the rmdex() phase to clean up resources. We can get rid of this
@@ -11008,7 +11084,8 @@
InstallArgs(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
int installFlags, String installerPackageName, String volumeUuid,
ManifestDigest manifestDigest, UserHandle user, String[] instructionSets,
- String abiOverride, String[] installGrantPermissions) {
+ String abiOverride, String[] installGrantPermissions,
+ String traceMethod, int traceCookie) {
this.origin = origin;
this.move = move;
this.installFlags = installFlags;
@@ -11020,6 +11097,8 @@
this.instructionSets = instructionSets;
this.abiOverride = abiOverride;
this.installGrantPermissions = installGrantPermissions;
+ this.traceMethod = traceMethod;
+ this.traceCookie = traceCookie;
}
abstract int copyApk(IMediaContainerService imcs, boolean temp) throws RemoteException;
@@ -11113,7 +11192,8 @@
super(params.origin, params.move, params.observer, params.installFlags,
params.installerPackageName, params.volumeUuid, params.getManifestDigest(),
params.getUser(), null /* instruction sets */, params.packageAbiOverride,
- params.grantedRuntimePermissions);
+ params.grantedRuntimePermissions,
+ params.traceMethod, params.traceCookie);
if (isFwdLocked()) {
throw new IllegalArgumentException("Forward locking only supported in ASEC");
}
@@ -11122,7 +11202,7 @@
/** Existing install */
FileInstallArgs(String codePath, String resourcePath, String[] instructionSets) {
super(OriginInfo.fromNothing(), null, null, 0, null, null, null, null, instructionSets,
- null, null);
+ null, null, null, 0);
this.codeFile = (codePath != null) ? new File(codePath) : null;
this.resourceFile = (resourcePath != null) ? new File(resourcePath) : null;
}
@@ -11348,7 +11428,8 @@
super(params.origin, params.move, params.observer, params.installFlags,
params.installerPackageName, params.volumeUuid, params.getManifestDigest(),
params.getUser(), null /* instruction sets */, params.packageAbiOverride,
- params.grantedRuntimePermissions);
+ params.grantedRuntimePermissions,
+ params.traceMethod, params.traceCookie);
}
/** Existing install */
@@ -11356,7 +11437,7 @@
boolean isExternal, boolean isForwardLocked) {
super(OriginInfo.fromNothing(), null, null, (isExternal ? INSTALL_EXTERNAL : 0)
| (isForwardLocked ? INSTALL_FORWARD_LOCK : 0), null, null, null, null,
- instructionSets, null, null);
+ instructionSets, null, null, null, 0);
// Hackily pretend we're still looking at a full code path
if (!fullCodePath.endsWith(RES_FILE_NAME)) {
fullCodePath = new File(fullCodePath, RES_FILE_NAME).getAbsolutePath();
@@ -11373,7 +11454,7 @@
AsecInstallArgs(String cid, String[] instructionSets, boolean isForwardLocked) {
super(OriginInfo.fromNothing(), null, null, (isAsecExternal(cid) ? INSTALL_EXTERNAL : 0)
| (isForwardLocked ? INSTALL_FORWARD_LOCK : 0), null, null, null, null,
- instructionSets, null, null);
+ instructionSets, null, null, null, 0);
this.cid = cid;
setMountPath(PackageHelper.getSdDir(cid));
}
@@ -11641,7 +11722,8 @@
super(params.origin, params.move, params.observer, params.installFlags,
params.installerPackageName, params.volumeUuid, params.getManifestDigest(),
params.getUser(), null /* instruction sets */, params.packageAbiOverride,
- params.grantedRuntimePermissions);
+ params.grantedRuntimePermissions,
+ params.traceMethod, params.traceCookie);
}
int copyApk(IMediaContainerService imcs, boolean temp) {
@@ -12201,7 +12283,9 @@
//note that the new package setting would have already been
//added to mPackages. It hasn't been persisted yet.
mSettings.setInstallStatus(pkgName, PackageSettingBase.PKG_INSTALL_INCOMPLETE);
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "writeSettings");
mSettings.writeLPr();
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
if (DEBUG_INSTALL) Slog.d(TAG, "New package installed in " + newPackage.codePath);
@@ -12253,7 +12337,9 @@
mSettings.setInstallerPackageName(pkgName, installerPackageName);
res.returnCode = PackageManager.INSTALL_SUCCEEDED;
//to update install status
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "writeSettings");
mSettings.writeLPr();
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
@@ -12502,9 +12588,13 @@
}
// Run dexopt before old package gets removed, to minimize time when app is unavailable
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+
int result = mPackageDexOptimizer
.performDexOpt(pkg, null /* instruction sets */, false /* forceDex */,
false /* defer */, false /* inclDependencies */);
+
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
res.setError(INSTALL_FAILED_DEXOPT, "Dexopt failed for " + pkg.codePath);
return;
@@ -16199,8 +16289,16 @@
final Message msg = mHandler.obtainMessage(INIT_COPY);
final OriginInfo origin = OriginInfo.fromExistingFile(codeFile);
- msg.obj = new InstallParams(origin, move, installObserver, installFlags,
+ final InstallParams params = new InstallParams(origin, move, installObserver, installFlags,
installerPackageName, volumeUuid, null, user, packageAbiOverride, null);
+ params.setTraceMethod("movePackage").setTraceCookie(System.identityHashCode(params));
+ msg.obj = params;
+
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "movePackage",
+ System.identityHashCode(msg.obj));
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
+ System.identityHashCode(msg.obj));
+
mHandler.sendMessage(msg);
}
diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java
index c75a1d3..66170d4 100644
--- a/services/core/java/com/android/server/pm/SELinuxMMAC.java
+++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java
@@ -136,9 +136,6 @@
case "signer":
policies.add(readSignerOrThrow(parser));
break;
- case "default":
- policies.add(readDefaultOrThrow(parser));
- break;
default:
skip(parser);
}
@@ -233,45 +230,6 @@
}
/**
- * Loop over a default element looking for seinfo child tags. A {@link Policy}
- * instance will be created and returned in the process. All other tags encountered
- * will be skipped.
- *
- * @param parser an XmlPullParser object representing a default element.
- * @return the constructed {@link Policy} instance
- * @throws IOException
- * @throws XmlPullParserException
- * @throws IllegalArgumentException if any of the validation checks fail while
- * parsing tag values.
- * @throws IllegalStateException if any of the invariants fail when constructing
- * the {@link Policy} instance.
- */
- private static Policy readDefaultOrThrow(XmlPullParser parser) throws IOException,
- XmlPullParserException {
-
- parser.require(XmlPullParser.START_TAG, null, "default");
- Policy.PolicyBuilder pb = new Policy.PolicyBuilder();
- pb.setAsDefaultPolicy();
-
- while (parser.next() != XmlPullParser.END_TAG) {
- if (parser.getEventType() != XmlPullParser.START_TAG) {
- continue;
- }
-
- String tagName = parser.getName();
- if ("seinfo".equals(tagName)) {
- String seinfo = parser.getAttributeValue(null, "value");
- pb.setGlobalSeinfoOrThrow(seinfo);
- readSeinfo(parser);
- } else {
- skip(parser);
- }
- }
-
- return pb.build();
- }
-
- /**
* Loop over a package element looking for seinfo child tags. If found return the
* value attribute of the seinfo tag, otherwise return null. All other tags encountered
* will be skipped.
@@ -337,35 +295,28 @@
/**
* Applies a security label to a package based on an seinfo tag taken from a matched
- * policy. All signature based policy stanzas are consulted first and, if no match
- * is found, the default policy stanza is then consulted. The security label is
- * attached to the ApplicationInfo instance of the package in the event that a matching
- * policy was found.
+ * policy. All signature based policy stanzas are consulted and, if no match is
+ * found, the default seinfo label of 'default' (set in ApplicationInfo object) is
+ * used. The security label is attached to the ApplicationInfo instance of the package
+ * in the event that a matching policy was found.
*
* @param pkg object representing the package to be labeled.
- * @return boolean which determines whether a non null seinfo label was assigned
- * to the package. A null value simply represents that no policy matched.
*/
- public static boolean assignSeinfoValue(PackageParser.Package pkg) {
+ public static void assignSeinfoValue(PackageParser.Package pkg) {
synchronized (sPolicies) {
for (Policy policy : sPolicies) {
String seinfo = policy.getMatchedSeinfo(pkg);
if (seinfo != null) {
pkg.applicationInfo.seinfo = seinfo;
- if (DEBUG_POLICY_INSTALL) {
- Slog.i(TAG, "package (" + pkg.packageName + ") labeled with " +
- "seinfo=" + seinfo);
- }
- return true;
+ break;
}
}
}
if (DEBUG_POLICY_INSTALL) {
- Slog.i(TAG, "package (" + pkg.packageName + ") doesn't match any policy; " +
- "seinfo will remain null");
+ Slog.i(TAG, "package (" + pkg.packageName + ") labeled with " +
+ "seinfo=" + pkg.applicationInfo.seinfo);
}
- return false;
}
/**
@@ -506,30 +457,16 @@
* .build();
* }
* </pre>
- * <p>
- * The following is an example of how to use {@link Policy.PolicyBuilder} to create a
- * default based Policy instance.
- * </p>
- * <pre>
- * {@code
- * Policy policy = new Policy.PolicyBuilder()
- * .setAsDefaultPolicy()
- * .setGlobalSeinfoOrThrow("default")
- * .build();
- * }
- * </pre>
*/
final class Policy {
private final String mSeinfo;
- private final boolean mDefaultStanza;
private final Set<Signature> mCerts;
private final Map<String, String> mPkgMap;
// Use the PolicyBuilder pattern to instantiate
private Policy(PolicyBuilder builder) {
mSeinfo = builder.mSeinfo;
- mDefaultStanza = builder.mDefaultStanza;
mCerts = Collections.unmodifiableSet(builder.mCerts);
mPkgMap = Collections.unmodifiableMap(builder.mPkgMap);
}
@@ -545,15 +482,6 @@
}
/**
- * Return whether this policy object represents a default stanza.
- *
- * @return A boolean indicating if this object represents a default policy stanza.
- */
- public boolean isDefaultStanza() {
- return mDefaultStanza;
- }
-
- /**
* Return whether this policy object contains package name mapping refinements.
*
* @return A boolean indicating if this object has inner package name mappings.
@@ -584,10 +512,6 @@
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
- if (mDefaultStanza) {
- sb.append("defaultStanza=true ");
- }
-
for (Signature cert : mCerts) {
sb.append("cert=" + cert.toCharsString().substring(0, 11) + "... ");
}
@@ -609,22 +533,15 @@
* is determined using the following steps:
* </p>
* <ul>
- * <li> If this Policy instance is defined as a default stanza:
- * <ul><li>Return the global seinfo value</li></ul>
+ * <li> All certs used to sign the apk and all certs stored with this policy
+ * instance are tested for set equality. If this fails then null is returned.
* </li>
- * <li> If this Policy instance is defined as a signer stanza:
- * <ul>
- * <li> All certs used to sign the apk and all certs stored with this policy
- * instance are tested for set equality. If this fails then null is returned.
- * </li>
- * <li> If all certs match then an appropriate inner package stanza is
- * searched based on package name alone. If matched, the stored seinfo
- * value for that mapping is returned.
- * </li>
- * <li> If all certs matched and no inner package stanza matches then return
- * the global seinfo value. The returned value can be null in this case.
- * </li>
- * </ul>
+ * <li> If all certs match then an appropriate inner package stanza is
+ * searched based on package name alone. If matched, the stored seinfo
+ * value for that mapping is returned.
+ * </li>
+ * <li> If all certs matched and no inner package stanza matches then return
+ * the global seinfo value. The returned value can be null in this case.
* </li>
* </ul>
* <p>
@@ -636,37 +553,34 @@
* A value of null can also be returned if no match occured.
*/
public String getMatchedSeinfo(PackageParser.Package pkg) {
- if (!mDefaultStanza) {
- // Check for exact signature matches across all certs.
- Signature[] certs = mCerts.toArray(new Signature[0]);
- if (!Signature.areExactMatch(certs, pkg.mSignatures)) {
- return null;
- }
-
- // Check for inner package name matches given that the
- // signature checks already passed.
- String seinfoValue = mPkgMap.get(pkg.packageName);
- if (seinfoValue != null) {
- return seinfoValue;
- }
+ // Check for exact signature matches across all certs.
+ Signature[] certs = mCerts.toArray(new Signature[0]);
+ if (!Signature.areExactMatch(certs, pkg.mSignatures)) {
+ return null;
}
- // Return the global seinfo value (even if it's null).
+ // Check for inner package name matches given that the
+ // signature checks already passed.
+ String seinfoValue = mPkgMap.get(pkg.packageName);
+ if (seinfoValue != null) {
+ return seinfoValue;
+ }
+
+ // Return the global seinfo value.
return mSeinfo;
}
/**
* A nested builder class to create {@link Policy} instances. A {@link Policy}
* class instance represents one valid policy stanza found in a mac_permissions.xml
- * file. A valid policy stanza is defined to be either a signer or default stanza
- * which obeys the rules outlined in external/sepolicy/mac_permissions.xml. The
- * {@link #build} method ensures a set of invariants are upheld enforcing the correct
- * stanza structure before returning a valid Policy object.
+ * file. A valid policy stanza is defined to be a signer stanza which obeys the rules
+ * outlined in external/sepolicy/mac_permissions.xml. The {@link #build} method
+ * ensures a set of invariants are upheld enforcing the correct stanza structure
+ * before returning a valid Policy object.
*/
public static final class PolicyBuilder {
private String mSeinfo;
- private boolean mDefaultStanza;
private final Set<Signature> mCerts;
private final Map<String, String> mPkgMap;
@@ -676,19 +590,6 @@
}
/**
- * Sets this stanza as a default stanza. All policy stanzas are assumed to
- * be signer stanzas unless this method is explicitly called. Default stanzas
- * are treated differently with respect to allowable child tags, ordering and
- * when and how policy decisions are enforced.
- *
- * @return The reference to this PolicyBuilder.
- */
- public PolicyBuilder setAsDefaultPolicy() {
- mDefaultStanza = true;
- return this;
- }
-
- /**
* Adds a signature to the set of certs used for validation checks. The purpose
* being that all contained certs will need to be matched against all certs
* contained with an apk.
@@ -710,11 +611,8 @@
/**
* Set the global seinfo tag for this policy stanza. The global seinfo tag
- * represents the seinfo element that is used in one of two ways depending on
- * its context. When attached to a signer tag the global seinfo represents an
- * assignment when there isn't a further inner package refinement in policy.
- * When used with a default tag, it represents the only allowable assignment
- * value.
+ * when attached to a signer tag represents the assignment when there isn't a
+ * further inner package refinement in policy.
*
* @param seinfo the seinfo value given as a String.
* @return The reference to this PolicyBuilder.
@@ -740,9 +638,7 @@
/**
* Create a package name to seinfo value mapping. Each mapping represents
* the seinfo value that will be assigned to the described package name.
- * These localized mappings allow the global seinfo to be overriden. This
- * mapping provides no value when used in conjunction with a default stanza;
- * enforced through the {@link #build} method.
+ * These localized mappings allow the global seinfo to be overriden.
*
* @param pkgName the android package name given to the app
* @param seinfo the seinfo value that will be assigned to the passed pkgName
@@ -799,51 +695,25 @@
* about the expected structure of a policy stanza.
* Those invariants are:
* </p>
- * <ul>
- * <li> If a default stanza
- * <ul>
- * <li> an attached global seinfo tag must be present </li>
- * <li> no signatures and no package names can be present </li>
- * </ul>
- * </li>
- * <li> If a signer stanza
- * <ul>
- * <li> at least one cert must be found </li>
- * <li> either a global seinfo value is present OR at least one
- * inner package mapping must be present BUT not both. </li>
- * </ul>
- * </li>
- * </ul>
- *
+ * <ul>
+ * <li> at least one cert must be found </li>
+ * <li> either a global seinfo value is present OR at least one
+ * inner package mapping must be present BUT not both. </li>
+ * </ul>
* @return an instance of {@link Policy} with the options set from this builder
* @throws IllegalStateException if an invariant is violated.
*/
public Policy build() {
Policy p = new Policy(this);
- if (p.mDefaultStanza) {
- if (p.mSeinfo == null) {
- String err = "Missing global seinfo tag with default stanza.";
- throw new IllegalStateException(err);
- }
- if (p.mCerts.size() != 0) {
- String err = "Certs not allowed with default stanza.";
- throw new IllegalStateException(err);
- }
- if (!p.mPkgMap.isEmpty()) {
- String err = "Inner package mappings not allowed with default stanza.";
- throw new IllegalStateException(err);
- }
- } else {
- if (p.mCerts.size() == 0) {
- String err = "Missing certs with signer tag. Expecting at least one.";
- throw new IllegalStateException(err);
- }
- if (!(p.mSeinfo == null ^ p.mPkgMap.isEmpty())) {
- String err = "Only seinfo tag XOR package tags are allowed within " +
- "a signer stanza.";
- throw new IllegalStateException(err);
- }
+ if (p.mCerts.isEmpty()) {
+ String err = "Missing certs with signer tag. Expecting at least one.";
+ throw new IllegalStateException(err);
+ }
+ if (!(p.mSeinfo == null ^ p.mPkgMap.isEmpty())) {
+ String err = "Only seinfo tag XOR package tags are allowed within " +
+ "a signer stanza.";
+ throw new IllegalStateException(err);
}
return p;
@@ -858,7 +728,6 @@
* <ul>
* <li> signer stanzas with inner package mappings </li>
* <li> signer stanzas with global seinfo tags </li>
- * <li> default stanza </li>
* </ul>
* This comparison also checks for duplicate entries on the input selectors. Any
* found duplicates will be flagged and can be checked with {@link #foundDuplicate}.
@@ -875,11 +744,6 @@
@Override
public int compare(Policy p1, Policy p2) {
- // Give precedence to signature stanzas over default stanzas
- if (p1.isDefaultStanza() != p2.isDefaultStanza()) {
- return p1.isDefaultStanza() ? 1 : -1;
- }
-
// Give precedence to stanzas with inner package mappings
if (p1.hasInnerPackages() != p2.hasInnerPackages()) {
return p1.hasInnerPackages() ? -1 : 1;
@@ -887,7 +751,7 @@
// Check for duplicate entries
if (p1.getSignatures().equals(p2.getSignatures())) {
- // Checks if default stanza or a signer w/o inner package names
+ // Checks if signer w/o inner package names
if (p1.hasGlobalSeinfo()) {
duplicateFound = true;
Slog.e(SELinuxMMAC.TAG, "Duplicate policy entry: " + p1.toString());
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 9ddbcca..48e205f 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -4462,7 +4462,7 @@
if (mAppsToBeHidden.isEmpty()) {
if (dismissKeyguard && !mKeyguardSecure) {
mAppsThatDismissKeyguard.add(appToken);
- } else if (win.isDrawnLw()) {
+ } else if (win.isDrawnLw() || win.hasAppShownWindows()) {
mWinShowWhenLocked = win;
mHideLockScreen = true;
mForceStatusBarFromKeyguard = false;
@@ -4496,7 +4496,8 @@
mWinDismissingKeyguard = win;
mSecureDismissingKeyguard = mKeyguardSecure;
mForceStatusBarFromKeyguard = mShowingLockscreen && mKeyguardSecure;
- } else if (mAppsToBeHidden.isEmpty() && showWhenLocked && win.isDrawnLw()) {
+ } else if (mAppsToBeHidden.isEmpty() && showWhenLocked
+ && (win.isDrawnLw() || win.hasAppShownWindows())) {
if (DEBUG_LAYOUT) Slog.v(TAG,
"Setting mHideLockScreen to true by win " + win);
mHideLockScreen = true;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 554af28..666d902 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -23,7 +23,6 @@
import android.content.res.Configuration;
import android.graphics.Rect;
-import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Slog;
import android.util.SparseArray;
@@ -41,13 +40,6 @@
* when no window animation is driving it. */
private static final int DEFAULT_DIM_DURATION = 200;
- // The amount we divide the height/width of the bounds we are trying to fit the task within
- // when using the method {@link #fitWithinBounds}.
- // We always want the task to to be visible in the bounds without affecting its size when
- // fitting. To make sure this is the case, we don't adjust the task left or top side pass
- // the input bounds right or bottom side minus the width or height divided by this value.
- private static final int FIT_WITHIN_BOUNDS_DIVIDER = 3;
-
TaskStack mStack;
final AppTokenList mAppTokens = new AppTokenList();
final int mTaskId;
@@ -84,13 +76,13 @@
// of creating a new object per fullscreen task on a display.
private static final SparseArray<DimLayer> sSharedFullscreenDimLayers = new SparseArray<>();
- Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds) {
+ Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
+ Configuration config) {
mTaskId = taskId;
mStack = stack;
mUserId = userId;
mService = service;
- mOverrideConfig = Configuration.EMPTY;
- setBounds(bounds);
+ setBounds(bounds, config);
}
DisplayContent getDisplayContent() {
@@ -172,43 +164,18 @@
}
}
- /** Fits the tasks within the input bounds adjusting the task bounds as needed.
- * @param bounds Bounds to fit the task within. Nothing is done if null.
- * @return Returns true if the task bounds was adjusted in any way.
- * */
- boolean fitWithinBounds(Rect bounds) {
- if (bounds == null || bounds.contains(mBounds)) {
- return false;
- }
- mTmpRect2.set(mBounds);
-
- if (mBounds.left < bounds.left || mBounds.right > bounds.right) {
- final int maxRight = bounds.right - (bounds.width() / FIT_WITHIN_BOUNDS_DIVIDER);
- int horizontalDiff = bounds.left - mBounds.left;
- if ((horizontalDiff < 0 && mBounds.left >= maxRight)
- || (mBounds.left + horizontalDiff >= maxRight)) {
- horizontalDiff = maxRight - mBounds.left;
- }
- mTmpRect2.left += horizontalDiff;
- mTmpRect2.right += horizontalDiff;
- }
-
- if (mBounds.top < bounds.top || mBounds.bottom > bounds.bottom) {
- final int maxBottom = bounds.bottom - (bounds.height() / FIT_WITHIN_BOUNDS_DIVIDER);
- int verticalDiff = bounds.top - mBounds.top;
- if ((verticalDiff < 0 && mBounds.top >= maxBottom)
- || (mBounds.top + verticalDiff >= maxBottom)) {
- verticalDiff = maxBottom - mBounds.top;
- }
- mTmpRect2.top += verticalDiff;
- mTmpRect2.bottom += verticalDiff;
- }
-
- return setBounds(mTmpRect2);
- }
-
/** Set the task bounds. Passing in null sets the bounds to fullscreen. */
- boolean setBounds(Rect bounds) {
+ boolean setBounds(Rect bounds, Configuration config) {
+ if (config == null) {
+ config = Configuration.EMPTY;
+ }
+ if (bounds == null && !Configuration.EMPTY.equals(config)) {
+ throw new IllegalArgumentException("null bounds but non empty configuration: "
+ + config);
+ }
+ if (bounds != null && Configuration.EMPTY.equals(config)) {
+ throw new IllegalArgumentException("non null bounds, but empty configuration");
+ }
boolean oldFullscreen = mFullscreen;
int rotation = Surface.ROTATION_0;
final DisplayContent displayContent = mStack.getDisplayContent();
@@ -241,7 +208,7 @@
mBounds.set(bounds);
mRotation = rotation;
updateDimLayer();
- updateOverrideConfiguration();
+ mOverrideConfig = mFullscreen ? Configuration.EMPTY : config;
return true;
}
@@ -249,36 +216,12 @@
out.set(mBounds);
}
- private void updateOverrideConfiguration() {
- final Configuration serviceConfig = mService.mCurConfiguration;
- if (mFullscreen) {
- mOverrideConfig = Configuration.EMPTY;
- return;
- }
-
- if (mOverrideConfig == Configuration.EMPTY) {
- mOverrideConfig = new Configuration();
- }
-
- // TODO(multidisplay): Update Dp to that of display stack is on.
- final float density = serviceConfig.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
- mOverrideConfig.screenWidthDp =
- Math.min((int)(mBounds.width() / density), serviceConfig.screenWidthDp);
- mOverrideConfig.screenHeightDp =
- Math.min((int)(mBounds.height() / density), serviceConfig.screenHeightDp);
- mOverrideConfig.smallestScreenWidthDp =
- Math.min(mOverrideConfig.screenWidthDp, mOverrideConfig.screenHeightDp);
- mOverrideConfig.orientation =
- (mOverrideConfig.screenWidthDp <= mOverrideConfig.screenHeightDp)
- ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
- }
-
void updateDisplayInfo(final DisplayContent displayContent) {
if (displayContent == null) {
return;
}
if (mFullscreen) {
- setBounds(null);
+ setBounds(null, Configuration.EMPTY);
return;
}
final int newRotation = displayContent.getDisplayInfo().rotation;
@@ -313,7 +256,7 @@
mTmpRect2.bottom = mTmpRect2.top + mBounds.width();
break;
}
- setBounds(mTmpRect2);
+ setBounds(mTmpRect2, mOverrideConfig);
}
/** Updates the dim layer bounds, recreating it if needed. */
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 25a71d9..a7ef2f8 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -27,6 +27,7 @@
import android.util.EventLog;
import android.util.IntArray;
import android.util.Slog;
+import android.util.SparseArray;
import android.view.DisplayInfo;
import com.android.server.EventLogTags;
@@ -96,15 +97,15 @@
/**
* Set the bounds of the stack and its containing tasks.
- * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
+ * @param stackBounds New stack bounds. Passing in null sets the bounds to fullscreen.
* @param resizeTasks If true, the tasks within the stack will also be resized.
- * @param changedTaskIds Output list of Ids of tasks that changed in bounds.
- * @param newTaskConfigs Output list of new Configuation of the tasks that changed.
+ * @param configs Configuration for individual tasks, keyed by task id.
+ * @param taskBounds Bounds for individual tasks, keyed by task id.
* @return True if the stack bounds was changed.
* */
- boolean setBounds(Rect bounds, boolean resizeTasks, IntArray changedTaskIds,
- List<Configuration> newTaskConfigs) {
- if (!setBounds(bounds)) {
+ boolean setBounds(Rect stackBounds, boolean resizeTasks, SparseArray<Configuration> configs,
+ SparseArray<Rect> taskBounds) {
+ if (!setBounds(stackBounds)) {
return false;
}
@@ -113,20 +114,17 @@
}
// Update bounds of containing tasks.
- final Rect newBounds = mFullscreen ? null : mBounds;
for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
final Task task = mTasks.get(taskNdx);
- if (mStackId == FREEFORM_WORKSPACE_STACK_ID) {
- // For freeform stack we don't adjust the size of the tasks to match that of the
- // stack, but we do try to make sure the tasks are still contained with the
- // bounds of the stack.
- if (task.fitWithinBounds(newBounds)) {
- changedTaskIds.add(task.mTaskId);
- newTaskConfigs.add(task.mOverrideConfig);
+ Configuration config = configs.get(task.mTaskId);
+ if (config != null) {
+ Rect bounds = taskBounds.get(task.mTaskId);
+ if (bounds == null) {
+ bounds = stackBounds;
}
- } else if (task.setBounds(newBounds)) {
- changedTaskIds.add(task.mTaskId);
- newTaskConfigs.add(task.mOverrideConfig);
+ task.setBounds(bounds, config);
+ } else {
+ Slog.wtf(TAG, "No config for task: " + task + ", is there a mismatch with AM?");
}
}
return true;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index cf690a5..bf7d1e7 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3041,8 +3041,8 @@
Binder.restoreCallingIdentity(origId);
}
- private Task createTaskLocked(
- int taskId, int stackId, int userId, AppWindowToken atoken, Rect bounds) {
+ private Task createTaskLocked(int taskId, int stackId, int userId, AppWindowToken atoken,
+ Rect bounds, Configuration config) {
if (DEBUG_STACK) Slog.i(TAG, "createTaskLocked: taskId=" + taskId + " stackId=" + stackId
+ " atoken=" + atoken + " bounds=" + bounds);
final TaskStack stack = mStackIdToStack.get(stackId);
@@ -3050,17 +3050,17 @@
throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId);
}
EventLog.writeEvent(EventLogTags.WM_TASK_CREATED, taskId, stackId);
- Task task = new Task(taskId, stack, userId, this, bounds);
+ Task task = new Task(taskId, stack, userId, this, bounds, config);
mTaskIdToTask.put(taskId, task);
stack.addTask(task, !atoken.mLaunchTaskBehind /* toTop */, atoken.showForAllUsers);
return task;
}
@Override
- public Configuration addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
+ public void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
int requestedOrientation, boolean fullscreen, boolean showForAllUsers, int userId,
int configChanges, boolean voiceInteraction, boolean launchTaskBehind,
- Rect taskBounds) {
+ Rect taskBounds, Configuration config) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"addAppToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
@@ -3084,7 +3084,7 @@
AppWindowToken atoken = findAppWindowToken(token.asBinder());
if (atoken != null) {
Slog.w(TAG, "Attempted to add existing app token: " + token);
- return null;
+ return;
}
atoken = new AppWindowToken(this, token, voiceInteraction);
atoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
@@ -3098,10 +3098,8 @@
+ " to stack=" + stackId + " task=" + taskId + " at " + addPos);
Task task = mTaskIdToTask.get(taskId);
- Configuration outConfig = null;
if (task == null) {
- task = createTaskLocked(taskId, stackId, userId, atoken, taskBounds);
- outConfig = task.mOverrideConfig;
+ task = createTaskLocked(taskId, stackId, userId, atoken, taskBounds, config);
}
task.addAppToken(addPos, atoken);
@@ -3110,13 +3108,11 @@
// Application tokens start out hidden.
atoken.hidden = true;
atoken.hiddenRequested = true;
-
- return outConfig;
}
}
@Override
- public Configuration setAppTask(IBinder token, int taskId, Rect taskBounds) {
+ public void setAppTask(IBinder token, int taskId, Rect taskBounds, Configuration config) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"setAppTask()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
@@ -3126,20 +3122,18 @@
final AppWindowToken atoken = findAppWindowToken(token);
if (atoken == null) {
Slog.w(TAG, "Attempted to set task id of non-existing app token: " + token);
- return null;
+ return;
}
final Task oldTask = atoken.mTask;
oldTask.removeAppToken(atoken);
Task newTask = mTaskIdToTask.get(taskId);
- Configuration outConfig = null;
if (newTask == null) {
newTask = createTaskLocked(
- taskId, oldTask.mStack.mStackId, oldTask.mUserId, atoken, taskBounds);
- outConfig = newTask.mOverrideConfig;
+ taskId, oldTask.mStack.mStackId, oldTask.mUserId, atoken, taskBounds,
+ config);
}
newTask.addAppToken(Integer.MAX_VALUE /* at top */, atoken);
- return outConfig;
}
}
@@ -4599,19 +4593,19 @@
* @param stackId Id of stack to resize.
* @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
* @param resizeTasks If true, the tasks within the stack will also be resized.
- * @param changedTaskIds Output list of Ids of tasks that changed in bounds due to resize.
- * @param newTaskConfigs Output list of new Configuation of the tasks that changed.
+ * @param configs Configurations for tasks in the resized stack, keyed by task id.
+ * @param taskBounds Bounds for tasks in the resized stack, keyed by task id.
* @return True if the stack is now fullscreen.
* */
public boolean resizeStack(int stackId, Rect bounds, boolean resizeTasks,
- IntArray changedTaskIds, List<Configuration> newTaskConfigs) {
+ SparseArray<Configuration> configs, SparseArray<Rect> taskBounds) {
synchronized (mWindowMap) {
final TaskStack stack = mStackIdToStack.get(stackId);
if (stack == null) {
throw new IllegalArgumentException("resizeStack: stackId " + stackId
+ " not found.");
}
- if (stack.setBounds(bounds, resizeTasks, changedTaskIds, newTaskConfigs)) {
+ if (stack.setBounds(bounds, resizeTasks, configs, taskBounds)) {
stack.resizeWindows();
stack.getDisplayContent().layoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
@@ -4648,19 +4642,20 @@
* Returns a {@link Configuration} object that contains configurations settings
* that should be overridden due to the operation.
*/
- public Configuration resizeTask(int taskId, Rect bounds) {
+ public void resizeTask(int taskId, Rect bounds, Configuration configuration, boolean relayout) {
synchronized (mWindowMap) {
Task task = mTaskIdToTask.get(taskId);
if (task == null) {
throw new IllegalArgumentException("resizeTask: taskId " + taskId
+ " not found.");
}
- if (task.setBounds(bounds)) {
+ if (task.setBounds(bounds, configuration)) {
task.resizeWindows();
- task.getDisplayContent().layoutNeeded = true;
- performLayoutAndPlaceSurfacesLocked();
+ if (relayout) {
+ task.getDisplayContent().layoutNeeded = true;
+ performLayoutAndPlaceSurfacesLocked();
+ }
}
- return new Configuration(task.mOverrideConfig);
}
}
diff --git a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
index 2ca5f5a..c0a0c9c 100644
--- a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
+++ b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
@@ -840,16 +840,6 @@
env->DeleteGlobalRef(sCallbacksObj);
sCallbacksObj = NULL;
}
-
- sFlpInterface = NULL;
- sFlpDiagnosticInterface = NULL;
- sFlpDeviceContextInterface = NULL;
- sFlpGeofencingInterface = NULL;
-
- if(sHardwareDevice != NULL) {
- sHardwareDevice->close(sHardwareDevice);
- sHardwareDevice = NULL;
- }
}
static void GetBatchedLocation(JNIEnv* env, jobject /* object */, jint lastNLocations) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 00a3c5c..b57e3ea 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -45,7 +45,6 @@
import android.app.admin.IDevicePolicyManager;
import android.app.admin.SystemUpdatePolicy;
import android.app.backup.IBackupManager;
-import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -279,7 +278,7 @@
NotificationManager mNotificationManager;
// Stores and loads state on device and profile owners.
- private final DeviceOwner mDeviceOwner;
+ private final Owners mOwners;
private final Binder mToken = new Binder();
@@ -1044,7 +1043,7 @@
*/
public DevicePolicyManagerService(Context context) {
mContext = context;
- mDeviceOwner = new DeviceOwner(mContext);
+ mOwners = new Owners(mContext);
mUserManager = UserManager.get(mContext);
mHasFeature = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_DEVICE_ADMIN);
@@ -1120,8 +1119,8 @@
Slog.w(LOG_TAG, "Tried to remove device policy file for user 0! Ignoring.");
return;
}
- mDeviceOwner.removeProfileOwner(userHandle);
- mDeviceOwner.writeProfileOwner(userHandle);
+ mOwners.removeProfileOwner(userHandle);
+ mOwners.writeProfileOwner(userHandle);
DevicePolicyData policy = mUserData.get(userHandle);
if (policy != null) {
@@ -1137,7 +1136,7 @@
void loadDeviceOwner() {
synchronized (this) {
- mDeviceOwner.load();
+ mOwners.load();
updateDeviceOwnerLocked();
}
}
@@ -1805,7 +1804,7 @@
Set<Integer> usersWithProfileOwners;
Set<Integer> usersWithData;
synchronized(this) {
- usersWithProfileOwners = mDeviceOwner.getProfileOwnerKeys();
+ usersWithProfileOwners = mOwners.getProfileOwnerKeys();
usersWithData = new HashSet<Integer>();
for (int i = 0; i < mUserData.size(); i++) {
usersWithData.add(mUserData.keyAt(i));
@@ -4116,7 +4115,7 @@
return false;
}
if (packageName == null
- || !DeviceOwner.isInstalled(packageName, mContext.getPackageManager())) {
+ || !Owners.isInstalled(packageName, mContext.getPackageManager())) {
throw new IllegalArgumentException("Invalid package name " + packageName
+ " for device owner");
}
@@ -4135,8 +4134,8 @@
Binder.restoreCallingIdentity(ident);
}
- mDeviceOwner.setDeviceOwner(packageName, ownerName);
- mDeviceOwner.writeDeviceOwner();
+ mOwners.setDeviceOwner(packageName, ownerName);
+ mOwners.writeDeviceOwner();
updateDeviceOwnerLocked();
Intent intent = new Intent(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED);
@@ -4156,8 +4155,8 @@
return false;
}
synchronized (this) {
- return mDeviceOwner.hasDeviceOwner()
- && mDeviceOwner.getDeviceOwnerPackageName().equals(packageName);
+ return mOwners.hasDeviceOwner()
+ && mOwners.getDeviceOwnerPackageName().equals(packageName);
}
}
@@ -4167,7 +4166,7 @@
return null;
}
synchronized (this) {
- return mDeviceOwner.getDeviceOwnerPackageName();
+ return mOwners.getDeviceOwnerPackageName();
}
}
@@ -4178,10 +4177,10 @@
}
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null);
synchronized (this) {
- if (!mDeviceOwner.hasDeviceOwner()) {
+ if (!mOwners.hasDeviceOwner()) {
return null;
}
- String deviceOwnerPackage = mDeviceOwner.getDeviceOwnerPackageName();
+ String deviceOwnerPackage = mOwners.getDeviceOwnerPackageName();
return getApplicationLabel(deviceOwnerPackage, UserHandle.USER_OWNER);
}
}
@@ -4221,8 +4220,8 @@
synchronized (this) {
clearUserPoliciesLocked(new UserHandle(UserHandle.USER_OWNER));
- mDeviceOwner.clearDeviceOwner();
- mDeviceOwner.writeDeviceOwner();
+ mOwners.clearDeviceOwner();
+ mOwners.writeDeviceOwner();
updateDeviceOwnerLocked();
// Reactivate backup service.
long ident = Binder.clearCallingIdentity();
@@ -4243,7 +4242,7 @@
if (!mHasFeature) {
return false;
}
- if (initializer == null || !DeviceOwner.isInstalled(
+ if (initializer == null || !Owners.isInstalled(
initializer.getPackageName(), mContext.getPackageManager())) {
throw new IllegalArgumentException("Invalid component name " + initializer
+ " for device initializer");
@@ -4262,15 +4261,15 @@
synchronized (this) {
enforceCanSetDeviceInitializer(who);
- if (mDeviceOwner.hasDeviceInitializer()) {
+ if (mOwners.hasDeviceInitializer()) {
throw new IllegalStateException(
"Trying to set device initializer but device initializer is already set.");
}
- mDeviceOwner.setDeviceInitializer(initializer);
+ mOwners.setDeviceInitializer(initializer);
addDeviceInitializerToLockTaskPackagesLocked(UserHandle.USER_OWNER);
- mDeviceOwner.writeDeviceOwner();
+ mOwners.writeDeviceOwner();
return true;
}
}
@@ -4294,8 +4293,8 @@
return false;
}
synchronized (this) {
- return mDeviceOwner.hasDeviceInitializer()
- && mDeviceOwner.getDeviceInitializerPackageName().equals(packageName);
+ return mOwners.hasDeviceInitializer()
+ && mOwners.getDeviceInitializerPackageName().equals(packageName);
}
}
@@ -4305,8 +4304,8 @@
return null;
}
synchronized (this) {
- if (mDeviceOwner.hasDeviceInitializer()) {
- return mDeviceOwner.getDeviceInitializerPackageName();
+ if (mOwners.hasDeviceInitializer()) {
+ return mOwners.getDeviceInitializerPackageName();
}
}
return null;
@@ -4318,8 +4317,8 @@
return null;
}
synchronized (this) {
- if (mDeviceOwner.hasDeviceInitializer()) {
- return mDeviceOwner.getDeviceInitializerComponent();
+ if (mOwners.hasDeviceInitializer()) {
+ return mOwners.getDeviceInitializerComponent();
}
}
return null;
@@ -4347,8 +4346,8 @@
synchronized (this) {
long ident = Binder.clearCallingIdentity();
try {
- mDeviceOwner.clearDeviceInitializer();
- mDeviceOwner.writeDeviceOwner();
+ mOwners.clearDeviceInitializer();
+ mOwners.writeDeviceOwner();
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -4361,14 +4360,14 @@
return false;
}
if (who == null
- || !DeviceOwner.isInstalledForUser(who.getPackageName(), userHandle)) {
+ || !Owners.isInstalledForUser(who.getPackageName(), userHandle)) {
throw new IllegalArgumentException("Component " + who
+ " not installed for userId:" + userHandle);
}
synchronized (this) {
enforceCanSetProfileOwner(userHandle);
- mDeviceOwner.setProfileOwner(who, ownerName, userHandle);
- mDeviceOwner.writeProfileOwner(userHandle);
+ mOwners.setProfileOwner(who, ownerName, userHandle);
+ mOwners.writeProfileOwner(userHandle);
return true;
}
}
@@ -4384,8 +4383,8 @@
synchronized (this) {
clearUserPoliciesLocked(callingUser);
final int userId = callingUser.getIdentifier();
- mDeviceOwner.removeProfileOwner(userId);
- mDeviceOwner.writeProfileOwner(userId);
+ mOwners.removeProfileOwner(userId);
+ mOwners.writeProfileOwner(userId);
}
}
@@ -4542,14 +4541,14 @@
}
synchronized (this) {
- return mDeviceOwner.getProfileOwnerComponent(userHandle);
+ return mOwners.getProfileOwnerComponent(userHandle);
}
}
// Returns the active profile owner for this user or null if the current user has no
// profile owner.
private ActiveAdmin getProfileOwnerAdmin(int userHandle) {
- ComponentName profileOwner = mDeviceOwner.getProfileOwnerComponent(userHandle);
+ ComponentName profileOwner = mOwners.getProfileOwnerComponent(userHandle);
if (profileOwner == null) {
return null;
}
@@ -4650,7 +4649,7 @@
* except for adb if no accounts or additional users are present on the device.
*/
private void enforceCanSetDeviceOwner() {
- if (mDeviceOwner != null && mDeviceOwner.hasDeviceOwner()) {
+ if (mOwners != null && mOwners.hasDeviceOwner()) {
throw new IllegalStateException("Trying to set the device owner, but device owner "
+ "is already set.");
}
@@ -4751,7 +4750,7 @@
synchronized (this) {
p.println("Current Device Policy Manager state:");
- mDeviceOwner.dump(" ", pw);
+ mOwners.dump(" ", pw);
int userCount = mUserData.size();
for (int u = 0; u < userCount; u++) {
DevicePolicyData policy = getUserData(mUserData.keyAt(u));
@@ -6238,10 +6237,10 @@
@Override
public List<String> getCrossProfileWidgetProviders(int profileId) {
synchronized (DevicePolicyManagerService.this) {
- if (mDeviceOwner == null) {
+ if (mOwners == null) {
return Collections.emptyList();
}
- ComponentName ownerComponent = mDeviceOwner.getProfileOwnerComponent(profileId);
+ ComponentName ownerComponent = mOwners.getProfileOwnerComponent(profileId);
if (ownerComponent == null) {
return Collections.emptyList();
}
@@ -6311,11 +6310,11 @@
synchronized (this) {
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
if (policy == null) {
- mDeviceOwner.clearSystemUpdatePolicy();
+ mOwners.clearSystemUpdatePolicy();
} else {
- mDeviceOwner.setSystemUpdatePolicy(policy);
+ mOwners.setSystemUpdatePolicy(policy);
}
- mDeviceOwner.writeDeviceOwner();
+ mOwners.writeDeviceOwner();
}
mContext.sendBroadcastAsUser(
new Intent(DevicePolicyManager.ACTION_SYSTEM_UPDATE_POLICY_CHANGED),
@@ -6325,7 +6324,7 @@
@Override
public SystemUpdatePolicy getSystemUpdatePolicy() {
synchronized (this) {
- SystemUpdatePolicy policy = mDeviceOwner.getSystemUpdatePolicy();
+ SystemUpdatePolicy policy = mOwners.getSystemUpdatePolicy();
if (policy != null && !policy.isValid()) {
Slog.w(LOG_TAG, "Stored system update policy is invalid, return null instead.");
return null;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
similarity index 98%
rename from services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java
rename to services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
index 791d0dd..e841f85 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
@@ -55,7 +55,7 @@
* Stores and restores state for the Device and Profile owners. By definition there can be
* only one device owner, but there may be a profile owner for each user.
*/
-class DeviceOwner {
+class Owners {
private static final String TAG = "DevicePolicyManagerService";
private static final String DEVICE_OWNER_XML_LEGACY = "device_owner.xml";
@@ -92,7 +92,7 @@
// Local system update policy controllable by device owner.
private SystemUpdatePolicy mSystemUpdatePolicy;
- public DeviceOwner(Context context) {
+ public Owners(Context context) {
mContext = context;
mUserManager = UserManager.get(mContext);
}
@@ -120,9 +120,9 @@
// No legacy file, read from the new format files.
new DeviceOwnerReadWriter().readFromFileLocked();
- final List<UserInfo> users = mUserManager.getUsers(); // XXX double check this is the correct profile set.
+ final List<UserInfo> users = mUserManager.getUsers();
for (UserInfo ui : users) {
- new ProfileOwnerReadWriter(ui.id).readFromFileLocked(); // XXX double check ID is the right one.
+ new ProfileOwnerReadWriter(ui.id).readFromFileLocked();
}
}
}
@@ -393,6 +393,7 @@
Slog.e(TAG, "Invalid root tag: " + tag);
return;
}
+ continue;
}
// readInner() will only see START_TAG at depth >= 2.
if (!readInner(parser, depth, tag)) {
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DeviceOwnerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
similarity index 83%
rename from services/tests/servicestests/src/com/android/server/devicepolicy/DeviceOwnerTest.java
rename to services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
index 8ad7eea..03e8d69 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DeviceOwnerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
@@ -16,13 +16,9 @@
package com.android.server.devicepolicy;
-import android.content.ComponentName;
import android.content.Context;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.File;
/**
@@ -32,14 +28,14 @@
* runtest --path frameworks/base/services/tests/servicestests/ \
* src/com/android/server/devicepolicy/DeviceOwnerTest.java
*/
-public class DeviceOwnerTest extends AndroidTestCase {
+public class OwnersTest extends AndroidTestCase {
- private static class DeviceOwnerSub extends DeviceOwner{
+ private static class OwnersSub extends Owners {
private final File mLegacyFile;
private final File mDeviceOwnerFile;
private final File mProfileOwnerBase;
- public DeviceOwnerSub(Context context, File legacyFile, File deviceOwnerFile,
+ public OwnersSub(Context context, File legacyFile, File deviceOwnerFile,
File profileOwnerBase) {
super(context);
mLegacyFile = legacyFile;
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 2d31a78..8a1a553 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -206,8 +206,14 @@
*/
public static final int CAPABILITY_CAN_PAUSE_VIDEO = 0x00100000;
+ /**
+ * Call sends responses through connection.
+ * @hide
+ */
+ public static final int CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION = 0x00400000;
+
//******************************************************************************************
- // Next CAPABILITY value: 0x00004000
+ // Next CAPABILITY value: 0x00800000
//******************************************************************************************
/**
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 7b277c5..430760a 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -248,8 +248,15 @@
*/
public static final int CAPABILITY_CONFERENCE_HAS_NO_CHILDREN = 0x00200000;
+ /**
+ * Indicates that the connection itself wants to handle any sort of reply response, rather than
+ * relying on SMS.
+ * @hide
+ */
+ public static final int CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION = 0x00400000;
+
//**********************************************************************************************
- // Next CAPABILITY value: 0x00400000
+ // Next CAPABILITY value: 0x00800000
//**********************************************************************************************
/**
@@ -388,6 +395,10 @@
if (can(capabilities, CAPABILITY_CONFERENCE_HAS_NO_CHILDREN)) {
builder.append(" CAPABILITY_SINGLE_PARTY_CONFERENCE");
}
+ if (can(capabilities, CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION)) {
+ builder.append(" CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION");
+ }
+
builder.append("]");
return builder.toString();
}
@@ -1763,6 +1774,13 @@
public void onReject() {}
/**
+ * Notifies ths Connection of a request reject with a message.
+ *
+ * @hide
+ */
+ public void onReject(String replyMessage) {}
+
+ /**
* Notifies this Connection whether the user wishes to proceed with the post-dial DTMF codes.
*/
public void onPostDialContinue(boolean proceed) {}
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index 383e45b..4e330bdb 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -101,6 +101,7 @@
private static final int MSG_ANSWER_VIDEO = 17;
private static final int MSG_MERGE_CONFERENCE = 18;
private static final int MSG_SWAP_CONFERENCE = 19;
+ private static final int MSG_REJECT_WITH_MESSAGE = 20;
private static Connection sNullConnection;
@@ -166,6 +167,14 @@
}
@Override
+ public void rejectWithMessage(String callId, String message) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = callId;
+ args.arg2 = message;
+ mHandler.obtainMessage(MSG_REJECT_WITH_MESSAGE, args).sendToTarget();
+ }
+
+ @Override
public void disconnect(String callId) {
mHandler.obtainMessage(MSG_DISCONNECT, callId).sendToTarget();
}
@@ -296,6 +305,15 @@
case MSG_REJECT:
reject((String) msg.obj);
break;
+ case MSG_REJECT_WITH_MESSAGE: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ reject((String) args.arg1, (String) args.arg2);
+ } finally {
+ args.recycle();
+ }
+ break;
+ }
case MSG_DISCONNECT:
disconnect((String) msg.obj);
break;
@@ -681,6 +699,11 @@
findConnectionForAction(callId, "reject").onReject();
}
+ private void reject(String callId, String rejectWithMessage) {
+ Log.d(this, "reject %s with message", callId);
+ findConnectionForAction(callId, "reject").onReject(rejectWithMessage);
+ }
+
private void disconnect(String callId) {
Log.d(this, "disconnect %s", callId);
if (mConnectionById.containsKey(callId)) {
diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
index c2e8530..dd253cf 100644
--- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
+++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
@@ -50,6 +50,8 @@
void reject(String callId);
+ void rejectWithMessage(String callId, String message);
+
void disconnect(String callId);
void hold(String callId);
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index e3f3c75..aa750ef 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -372,6 +372,12 @@
public static final String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
/**
+ * Determine whether user can toggle Enhanced 4G LTE Mode in Settings.
+ * @hide
+ */
+ public static final String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool";
+
+ /**
* If this is true, the SIM card (through Customer Service Profile EF file) will be able to
* prevent manual operator selection. If false, this SIM setting will be ignored and manual
* operator selection will always be available. See CPHS4_2.WW6, CPHS B.4.7.1 for more
@@ -413,6 +419,15 @@
public static final String KEY_MMS_UA_PROF_URL_STRING = "uaProfUrl";
public static final String KEY_MMS_USER_AGENT_STRING = "userAgent";
+ /**
+ * Determines whether the carrier supports making non-emergency phone calls while the phone is
+ * in emergency callback mode. Default value is {@code true}, meaning that non-emergency calls
+ * are allowed in emergency callback mode.
+ * @hide
+ */
+ public static final String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL =
+ "allow_non_emergency_calls_in_ecm_bool";
+
/** The default value for every variable. */
private final static PersistableBundle sDefaults;
@@ -473,6 +488,7 @@
sDefaults.putInt(KEY_IMS_DTMF_TONE_DELAY_INT, 0);
sDefaults.putInt(KEY_CDMA_DTMF_TONE_DELAY_INT, 100);
sDefaults.putBoolean(KEY_SUPPORT_CONFERENCE_CALL_BOOL, true);
+ sDefaults.putBoolean(KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, true);
// MMS defaults
sDefaults.putBoolean(KEY_MMS_ALIAS_ENABLED_BOOL, false);
@@ -506,6 +522,7 @@
sDefaults.putString(KEY_MMS_UA_PROF_TAG_NAME_STRING, "x-wap-profile");
sDefaults.putString(KEY_MMS_UA_PROF_URL_STRING, "");
sDefaults.putString(KEY_MMS_USER_AGENT_STRING, "");
+ sDefaults.putBoolean(KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL, true);
}
/**
diff --git a/tests/UiBench/Android.mk b/tests/UiBench/Android.mk
index 1e5b117..24df85b 100644
--- a/tests/UiBench/Android.mk
+++ b/tests/UiBench/Android.mk
@@ -10,14 +10,18 @@
# regressions are reflected in test data
LOCAL_RESOURCE_DIR := \
$(LOCAL_PATH)/res \
- frameworks/support/v7/appcompat/res
+ frameworks/support/v7/appcompat/res \
+ frameworks/support/v7/cardview/res
LOCAL_AAPT_FLAGS := \
- --extra-packages android.support.v7.appcompat
+ --auto-add-overlay \
+ --extra-packages android.support.v7.appcompat \
+ --extra-packages android.support.v7.cardview
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-v4 \
- android-support-v7-appcompat
+ android-support-v7-appcompat \
+ android-support-v7-cardview
LOCAL_PACKAGE_NAME := UiBench
diff --git a/tests/UiBench/AndroidManifest.xml b/tests/UiBench/AndroidManifest.xml
index 6677e0d..d9df9f8 100644
--- a/tests/UiBench/AndroidManifest.xml
+++ b/tests/UiBench/AndroidManifest.xml
@@ -32,10 +32,10 @@
</intent-filter>
</activity>
- <!-- Tests -->
+ <!-- General -->
<activity
android:name=".GlTextureViewActivity"
- android:label="Microbenchmarks/GL TextureView" >
+ android:label="General/GL TextureView" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.android.test.uibench.TEST" />
@@ -43,7 +43,15 @@
</activity>
<activity
android:name=".FullscreenOverdrawActivity"
- android:label="Microbenchmarks/Fullscreen Overdraw" >
+ android:label="General/Fullscreen Overdraw" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.uibench.TEST" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name=".InvalidateActivity"
+ android:label="General/Invalidate" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.android.test.uibench.TEST" />
@@ -51,7 +59,7 @@
</activity>
<activity
android:name=".TrivialAnimationActivity"
- android:label="Microbenchmarks/Trivial Animation" >
+ android:label="General/Trivial Animation" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.android.test.uibench.TEST" />
@@ -59,7 +67,27 @@
</activity>
<activity
android:name=".TrivialListActivity"
- android:label="Microbenchmarks/Trivial ListView" >
+ android:label="General/Trivial ListView" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.uibench.TEST" />
+ </intent-filter>
+ </activity>
+
+ <!-- GPU -->
+ <activity
+ android:name=".BitmapUploadActivity"
+ android:label="GPU/Bitmap Upload" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.uibench.TEST" />
+ </intent-filter>
+ </activity>
+
+ <!-- Text -->
+ <activity
+ android:name=".EditTextTypeActivity"
+ android:label="Text/EditText Typing" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.android.test.uibench.TEST" />
diff --git a/tests/UiBench/build.gradle b/tests/UiBench/build.gradle
index bf0ed11..deecbb6 100644
--- a/tests/UiBench/build.gradle
+++ b/tests/UiBench/build.gradle
@@ -34,4 +34,5 @@
// Dependencies enumerated specifically for platform-independent / reproducible builds.
compile 'com.android.support:support-v4:23.0.0'
compile 'com.android.support:appcompat-v7:23.0.0'
+ compile 'com.android.support:cardview-v7:23.0.0'
}
diff --git a/tests/UiBench/res/layout/activity_bitmap_upload.xml b/tests/UiBench/res/layout/activity_bitmap_upload.xml
new file mode 100644
index 0000000..70faa07a
--- /dev/null
+++ b/tests/UiBench/res/layout/activity_bitmap_upload.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/upload_root"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:padding="10dp"
+ android:clipToPadding="false">
+ <android.support.v7.widget.CardView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+ <view class="com.android.test.uibench.BitmapUploadActivity$UploadView"
+ android:id="@+id/upload_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+ </android.support.v7.widget.CardView>
+
+ <android.support.v4.widget.Space
+ android:layout_height="10dp"
+ android:layout_width="match_parent" />
+
+ <android.support.v7.widget.CardView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <android.support.v4.widget.Space
+ android:layout_height="10dp"
+ android:layout_width="match_parent" />
+
+ <android.support.v7.widget.CardView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/UiBench/res/layout/activity_invalidate.xml b/tests/UiBench/res/layout/activity_invalidate.xml
new file mode 100644
index 0000000..34bcca9
--- /dev/null
+++ b/tests/UiBench/res/layout/activity_invalidate.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/invalidate_root"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+ <include layout="@layout/invalidate_row"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/UiBench/res/layout/invalidate_row.xml b/tests/UiBench/res/layout/invalidate_row.xml
new file mode 100644
index 0000000..9feefde
--- /dev/null
+++ b/tests/UiBench/res/layout/invalidate_row.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+ <view class="com.android.test.uibench.InvalidateActivity$ColorView"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java b/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java
new file mode 100644
index 0000000..e2bf897
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench;
+
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.View;
+
+public class BitmapUploadActivity extends AppCompatActivity {
+ public static class UploadView extends View {
+ private int mColorValue;
+ private Bitmap mBitmap;
+ private final DisplayMetrics mMetrics = new DisplayMetrics();
+ private final Rect mRect = new Rect();
+
+ public UploadView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @SuppressWarnings("unused")
+ public void setColorValue(int colorValue) {
+ if (colorValue == mColorValue) return;
+
+ mColorValue = colorValue;
+
+ // modify the bitmap's color to ensure it's uploaded to the GPU
+ mBitmap.eraseColor(Color.rgb(mColorValue, 255 - mColorValue, 255));
+
+ invalidate();
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ getDisplay().getMetrics(mMetrics);
+ int minDisplayDimen = Math.min(mMetrics.widthPixels, mMetrics.heightPixels);
+ int bitmapSize = Math.min((int) (minDisplayDimen * 0.75), 720);
+ if (mBitmap == null
+ || mBitmap.getWidth() != bitmapSize
+ || mBitmap.getHeight() != bitmapSize) {
+ mBitmap = Bitmap.createBitmap(bitmapSize, bitmapSize, Bitmap.Config.ARGB_8888);
+ }
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mBitmap != null) {
+ mRect.set(0, 0, getWidth(), getHeight());
+ canvas.drawBitmap(mBitmap, null, mRect, null);
+ }
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_bitmap_upload);
+
+ // animate color to force bitmap uploads
+ UploadView uploadView = (UploadView) findViewById(R.id.upload_view);
+ ObjectAnimator colorValueAnimator = ObjectAnimator.ofInt(uploadView, "colorValue", 0, 255);
+ colorValueAnimator.setRepeatMode(ValueAnimator.REVERSE);
+ colorValueAnimator.setRepeatCount(ValueAnimator.INFINITE);
+ colorValueAnimator.start();
+
+ // animate scene root to guarantee there's a minimum amount of GPU rendering work
+ View uploadRoot = findViewById(R.id.upload_root);
+ ObjectAnimator yAnimator = ObjectAnimator.ofFloat(uploadRoot, "translationY", 0, 100);
+ yAnimator.setRepeatMode(ValueAnimator.REVERSE);
+ yAnimator.setRepeatCount(ValueAnimator.INFINITE);
+ yAnimator.start();
+ }
+}
diff --git a/tests/UiBench/src/com/android/test/uibench/EditTextTypeActivity.java b/tests/UiBench/src/com/android/test/uibench/EditTextTypeActivity.java
new file mode 100644
index 0000000..08ab510
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/EditTextTypeActivity.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench;
+
+import android.app.Instrumentation;
+import android.os.Bundle;
+import android.os.Looper;
+import android.os.MessageQueue;
+import android.support.v7.app.AppCompatActivity;
+import android.view.KeyEvent;
+import android.widget.EditText;
+
+import java.util.concurrent.Semaphore;
+
+/**
+ * Note: currently incomplete, complexity of input continuously grows, instead of looping
+ * over a stable amount of work.
+ *
+ * Simulates typing continuously into an EditText.
+ */
+public class EditTextTypeActivity extends AppCompatActivity {
+ Thread mThread;
+
+ private static String sSeedText = "";
+ static {
+ final int count = 100;
+ final String string = "hello ";
+
+ StringBuilder builder = new StringBuilder(count * string.length());
+ for (int i = 0; i < count; i++) {
+ builder.append(string);
+ }
+ sSeedText = builder.toString();
+ }
+
+ final Object mLock = new Object();
+ boolean mShouldStop = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ EditText editText = new EditText(this);
+ editText.setText(sSeedText);
+ setContentView(editText);
+
+ final Instrumentation instrumentation = new Instrumentation();
+ final Semaphore sem = new Semaphore(0);
+ MessageQueue.IdleHandler handler = new MessageQueue.IdleHandler() {
+ @Override
+ public boolean queueIdle() {
+ // TODO: consider other signaling approaches
+ sem.release();
+ return true;
+ }
+ };
+ Looper.myQueue().addIdleHandler(handler);
+ synchronized (mLock) {
+ mShouldStop = false;
+ }
+ mThread = new Thread(new Runnable() {
+ int codes[] = { KeyEvent.KEYCODE_H, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_L,
+ KeyEvent.KEYCODE_L, KeyEvent.KEYCODE_O, KeyEvent.KEYCODE_SPACE };
+ int i = 0;
+ @Override
+ public void run() {
+ while (true) {
+ try {
+ sem.acquire();
+ } catch (InterruptedException e) {
+ // TODO, maybe
+ }
+ int code = codes[i % codes.length];
+ if (i % 100 == 99) code = KeyEvent.KEYCODE_ENTER;
+
+ synchronized (mLock) {
+ if (mShouldStop) break;
+ }
+
+ // TODO: bit of a race here, since the event can arrive after pause/stop.
+ // (Can't synchronize on key send, since it's synchronous.)
+ instrumentation.sendKeyDownUpSync(code);
+ i++;
+ }
+ }
+ });
+ mThread.start();
+ }
+
+ @Override
+ protected void onPause() {
+ synchronized (mLock) {
+ mShouldStop = true;
+ }
+ super.onPause();
+ }
+}
diff --git a/tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java b/tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java
index ce79259..a12742d 100644
--- a/tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java
@@ -18,39 +18,19 @@
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
import android.graphics.SurfaceTexture;
-import android.opengl.GLUtils;
import android.os.Bundle;
-import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.TextureView;
-import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
-import javax.microedition.khronos.egl.EGL10;
-import javax.microedition.khronos.egl.EGLConfig;
-import javax.microedition.khronos.egl.EGLContext;
-import javax.microedition.khronos.egl.EGLDisplay;
-import javax.microedition.khronos.egl.EGLSurface;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.FloatBuffer;
-
-import static android.opengl.GLES20.*;
+import com.android.test.uibench.opengl.ImageFlipRenderThread;
public class GlTextureViewActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {
- private RenderThread mRenderThread;
+ private ImageFlipRenderThread mRenderThread;
private TextureView mTextureView;
@Override
@@ -66,7 +46,7 @@
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
- mRenderThread = new RenderThread(getResources(), surface);
+ mRenderThread = new ImageFlipRenderThread(getResources(), surface);
mRenderThread.start();
mTextureView.setCameraDistance(5000);
@@ -94,7 +74,7 @@
try {
mRenderThread.join();
} catch (InterruptedException e) {
- Log.e(RenderThread.LOG_TAG, "Could not wait for render thread");
+ Log.e(ImageFlipRenderThread.LOG_TAG, "Could not wait for render thread");
}
return true;
}
@@ -103,311 +83,4 @@
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
- private static class RenderThread extends Thread {
- private static final String LOG_TAG = "GLTextureView";
-
- static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
- static final int EGL_OPENGL_ES2_BIT = 4;
-
- private volatile boolean mFinished;
-
- private final Resources mResources;
- private final SurfaceTexture mSurface;
-
- private EGL10 mEgl;
- private EGLDisplay mEglDisplay;
- private EGLConfig mEglConfig;
- private EGLContext mEglContext;
- private EGLSurface mEglSurface;
-
- RenderThread(Resources resources, SurfaceTexture surface) {
- mResources = resources;
- mSurface = surface;
- }
-
- private static final String sSimpleVS =
- "attribute vec4 position;\n" +
- "attribute vec2 texCoords;\n" +
- "varying vec2 outTexCoords;\n" +
- "\nvoid main(void) {\n" +
- " outTexCoords = texCoords;\n" +
- " gl_Position = position;\n" +
- "}\n\n";
- private static final String sSimpleFS =
- "precision mediump float;\n\n" +
- "varying vec2 outTexCoords;\n" +
- "uniform sampler2D texture;\n" +
- "\nvoid main(void) {\n" +
- " gl_FragColor = texture2D(texture, outTexCoords);\n" +
- "}\n\n";
-
- private static final int FLOAT_SIZE_BYTES = 4;
- private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
- private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
- private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
- private final float[] mTriangleVerticesData = {
- // X, Y, Z, U, V
- -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
- 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- };
-
- @Override
- public void run() {
- initGL();
-
- FloatBuffer triangleVertices = ByteBuffer.allocateDirect(mTriangleVerticesData.length
- * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
- triangleVertices.put(mTriangleVerticesData).position(0);
-
- int texture = loadTexture(R.drawable.large_photo);
- int program = buildProgram(sSimpleVS, sSimpleFS);
-
- int attribPosition = glGetAttribLocation(program, "position");
- checkGlError();
-
- int attribTexCoords = glGetAttribLocation(program, "texCoords");
- checkGlError();
-
- int uniformTexture = glGetUniformLocation(program, "texture");
- checkGlError();
-
- glBindTexture(GL_TEXTURE_2D, texture);
- checkGlError();
-
- glUseProgram(program);
- checkGlError();
-
- glEnableVertexAttribArray(attribPosition);
- checkGlError();
-
- glEnableVertexAttribArray(attribTexCoords);
- checkGlError();
-
- glUniform1i(uniformTexture, 0);
- checkGlError();
-
- // drawQuad
- triangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
- glVertexAttribPointer(attribPosition, 3, GL_FLOAT, false,
- TRIANGLE_VERTICES_DATA_STRIDE_BYTES, triangleVertices);
- checkGlError();
-
- triangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
- glVertexAttribPointer(attribTexCoords, 3, GL_FLOAT, false,
- TRIANGLE_VERTICES_DATA_STRIDE_BYTES, triangleVertices);
- checkGlError();
-
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- checkGlError();
-
- while (!mFinished) {
- checkCurrent();
-
- glClear(GL_COLOR_BUFFER_BIT);
- checkGlError();
-
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- checkGlError();
-
- if (!mEgl.eglSwapBuffers(mEglDisplay, mEglSurface)) {
- throw new RuntimeException("Cannot swap buffers");
- }
- checkEglError();
-
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- // Ignore
- }
- }
-
- finishGL();
- }
-
- private int loadTexture(int resource) {
- int[] textures = new int[1];
-
- glActiveTexture(GL_TEXTURE0);
- glGenTextures(1, textures, 0);
- checkGlError();
-
- int texture = textures[0];
- glBindTexture(GL_TEXTURE_2D, texture);
- checkGlError();
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- Bitmap bitmap = BitmapFactory.decodeResource(mResources, resource);
-
- GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0);
- checkGlError();
-
- bitmap.recycle();
-
- return texture;
- }
-
- private static int buildProgram(String vertex, String fragment) {
- int vertexShader = buildShader(vertex, GL_VERTEX_SHADER);
- if (vertexShader == 0) return 0;
-
- int fragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER);
- if (fragmentShader == 0) return 0;
-
- int program = glCreateProgram();
- glAttachShader(program, vertexShader);
- checkGlError();
-
- glAttachShader(program, fragmentShader);
- checkGlError();
-
- glLinkProgram(program);
- checkGlError();
-
- int[] status = new int[1];
- glGetProgramiv(program, GL_LINK_STATUS, status, 0);
- if (status[0] != GL_TRUE) {
- String error = glGetProgramInfoLog(program);
- Log.d(LOG_TAG, "Error while linking program:\n" + error);
- glDeleteShader(vertexShader);
- glDeleteShader(fragmentShader);
- glDeleteProgram(program);
- return 0;
- }
-
- return program;
- }
-
- private static int buildShader(String source, int type) {
- int shader = glCreateShader(type);
-
- glShaderSource(shader, source);
- checkGlError();
-
- glCompileShader(shader);
- checkGlError();
-
- int[] status = new int[1];
- glGetShaderiv(shader, GL_COMPILE_STATUS, status, 0);
- if (status[0] != GL_TRUE) {
- String error = glGetShaderInfoLog(shader);
- Log.d(LOG_TAG, "Error while compiling shader:\n" + error);
- glDeleteShader(shader);
- return 0;
- }
-
- return shader;
- }
-
- private void checkEglError() {
- int error = mEgl.eglGetError();
- if (error != EGL10.EGL_SUCCESS) {
- Log.w(LOG_TAG, "EGL error = 0x" + Integer.toHexString(error));
- }
- }
-
- private static void checkGlError() {
- int error = glGetError();
- if (error != GL_NO_ERROR) {
- Log.w(LOG_TAG, "GL error = 0x" + Integer.toHexString(error));
- }
- }
-
- private void finishGL() {
- mEgl.eglDestroyContext(mEglDisplay, mEglContext);
- mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
- }
-
- private void checkCurrent() {
- if (!mEglContext.equals(mEgl.eglGetCurrentContext()) ||
- !mEglSurface.equals(mEgl.eglGetCurrentSurface(EGL10.EGL_DRAW))) {
- if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) {
- throw new RuntimeException("eglMakeCurrent failed "
- + GLUtils.getEGLErrorString(mEgl.eglGetError()));
- }
- }
- }
-
- private void initGL() {
- mEgl = (EGL10) EGLContext.getEGL();
-
- mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
- if (mEglDisplay == EGL10.EGL_NO_DISPLAY) {
- throw new RuntimeException("eglGetDisplay failed "
- + GLUtils.getEGLErrorString(mEgl.eglGetError()));
- }
-
- int[] version = new int[2];
- if (!mEgl.eglInitialize(mEglDisplay, version)) {
- throw new RuntimeException("eglInitialize failed " +
- GLUtils.getEGLErrorString(mEgl.eglGetError()));
- }
-
- mEglConfig = chooseEglConfig();
- if (mEglConfig == null) {
- throw new RuntimeException("eglConfig not initialized");
- }
-
- mEglContext = createContext(mEgl, mEglDisplay, mEglConfig);
-
- mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, mEglConfig, mSurface, null);
-
- if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE) {
- int error = mEgl.eglGetError();
- if (error == EGL10.EGL_BAD_NATIVE_WINDOW) {
- Log.e(LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW.");
- return;
- }
- throw new RuntimeException("createWindowSurface failed "
- + GLUtils.getEGLErrorString(error));
- }
-
- if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) {
- throw new RuntimeException("eglMakeCurrent failed "
- + GLUtils.getEGLErrorString(mEgl.eglGetError()));
- }
- }
-
-
- EGLContext createContext(EGL10 egl, EGLDisplay eglDisplay, EGLConfig eglConfig) {
- int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
- return egl.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
- }
-
- private EGLConfig chooseEglConfig() {
- int[] configsCount = new int[1];
- EGLConfig[] configs = new EGLConfig[1];
- int[] configSpec = getConfig();
- if (!mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1, configsCount)) {
- throw new IllegalArgumentException("eglChooseConfig failed " +
- GLUtils.getEGLErrorString(mEgl.eglGetError()));
- } else if (configsCount[0] > 0) {
- return configs[0];
- }
- return null;
- }
-
- private static int[] getConfig() {
- return new int[] {
- EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL10.EGL_RED_SIZE, 8,
- EGL10.EGL_GREEN_SIZE, 8,
- EGL10.EGL_BLUE_SIZE, 8,
- EGL10.EGL_ALPHA_SIZE, 8,
- EGL10.EGL_DEPTH_SIZE, 0,
- EGL10.EGL_STENCIL_SIZE, 0,
- EGL10.EGL_NONE
- };
- }
-
- void finish() {
- mFinished = true;
- }
- }
}
\ No newline at end of file
diff --git a/tests/UiBench/src/com/android/test/uibench/InvalidateActivity.java b/tests/UiBench/src/com/android/test/uibench/InvalidateActivity.java
new file mode 100644
index 0000000..93d67a6
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/InvalidateActivity.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench;
+
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.annotation.ColorInt;
+import android.support.v7.app.AppCompatActivity;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Tests invalidation performance by invalidating a large number of easily rendered views,
+ */
+public class InvalidateActivity extends AppCompatActivity {
+ public static class ColorView extends View {
+ @ColorInt
+ public int mColor;
+
+ public ColorView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public void setColor(@ColorInt int color) {
+ mColor = color;
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ canvas.drawColor(mColor);
+ }
+ }
+
+ ColorView[][] mColorViews;
+
+ @SuppressWarnings("unused")
+ public void setColorValue(int colorValue) {
+ @ColorInt int a = Color.rgb(colorValue, 255 - colorValue, 255);
+ @ColorInt int b = Color.rgb(255, colorValue, 255 - colorValue);
+ for (int y = 0; y < mColorViews.length; y++) {
+ for (int x = 0; x < mColorViews[y].length; x++) {
+ mColorViews[y][x].setColor((x + y) % 2 == 0 ? a : b);
+ }
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_invalidate);
+
+ ViewGroup root = (ViewGroup) findViewById(R.id.invalidate_root);
+ for (int y = 0; y < root.getChildCount(); y++) {
+ ViewGroup row = (ViewGroup) root.getChildAt(y);
+ if (mColorViews == null) {
+ mColorViews = new ColorView[root.getChildCount()][row.getChildCount()];
+ }
+
+ for (int x = 0; x < row.getChildCount(); x++) {
+ mColorViews[y][x] = (ColorView) row.getChildAt(x);
+ }
+ }
+
+ ObjectAnimator animator = ObjectAnimator.ofInt(this, "colorValue", 0, 255);
+ animator.setRepeatMode(ValueAnimator.REVERSE);
+ animator.setRepeatCount(ValueAnimator.INFINITE);
+ animator.start();
+ }
+}
diff --git a/tests/UiBench/src/com/android/test/uibench/opengl/ImageFlipRenderThread.java b/tests/UiBench/src/com/android/test/uibench/opengl/ImageFlipRenderThread.java
new file mode 100644
index 0000000..119ce52
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/opengl/ImageFlipRenderThread.java
@@ -0,0 +1,389 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench.opengl;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLUtils;
+import android.util.Log;
+
+import com.android.test.uibench.R;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.microedition.khronos.egl.EGL10;
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.egl.EGLContext;
+import javax.microedition.khronos.egl.EGLDisplay;
+import javax.microedition.khronos.egl.EGLSurface;
+
+import static android.opengl.GLES20.GL_CLAMP_TO_EDGE;
+import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
+import static android.opengl.GLES20.GL_COMPILE_STATUS;
+import static android.opengl.GLES20.GL_FLOAT;
+import static android.opengl.GLES20.GL_FRAGMENT_SHADER;
+import static android.opengl.GLES20.GL_LINEAR;
+import static android.opengl.GLES20.GL_LINK_STATUS;
+import static android.opengl.GLES20.GL_NO_ERROR;
+import static android.opengl.GLES20.GL_RGBA;
+import static android.opengl.GLES20.GL_TEXTURE0;
+import static android.opengl.GLES20.GL_TEXTURE_2D;
+import static android.opengl.GLES20.GL_TEXTURE_MAG_FILTER;
+import static android.opengl.GLES20.GL_TEXTURE_MIN_FILTER;
+import static android.opengl.GLES20.GL_TEXTURE_WRAP_S;
+import static android.opengl.GLES20.GL_TEXTURE_WRAP_T;
+import static android.opengl.GLES20.GL_TRIANGLE_STRIP;
+import static android.opengl.GLES20.GL_TRUE;
+import static android.opengl.GLES20.GL_UNSIGNED_BYTE;
+import static android.opengl.GLES20.GL_VERTEX_SHADER;
+import static android.opengl.GLES20.glActiveTexture;
+import static android.opengl.GLES20.glAttachShader;
+import static android.opengl.GLES20.glBindTexture;
+import static android.opengl.GLES20.glClear;
+import static android.opengl.GLES20.glClearColor;
+import static android.opengl.GLES20.glCompileShader;
+import static android.opengl.GLES20.glCreateProgram;
+import static android.opengl.GLES20.glCreateShader;
+import static android.opengl.GLES20.glDeleteProgram;
+import static android.opengl.GLES20.glDeleteShader;
+import static android.opengl.GLES20.glDrawArrays;
+import static android.opengl.GLES20.glEnableVertexAttribArray;
+import static android.opengl.GLES20.glGenTextures;
+import static android.opengl.GLES20.glGetAttribLocation;
+import static android.opengl.GLES20.glGetError;
+import static android.opengl.GLES20.glGetProgramInfoLog;
+import static android.opengl.GLES20.glGetProgramiv;
+import static android.opengl.GLES20.glGetShaderInfoLog;
+import static android.opengl.GLES20.glGetShaderiv;
+import static android.opengl.GLES20.glGetUniformLocation;
+import static android.opengl.GLES20.glLinkProgram;
+import static android.opengl.GLES20.glShaderSource;
+import static android.opengl.GLES20.glTexParameteri;
+import static android.opengl.GLES20.glUniform1i;
+import static android.opengl.GLES20.glUseProgram;
+import static android.opengl.GLES20.glVertexAttribPointer;
+
+public class ImageFlipRenderThread extends Thread {
+ public static final String LOG_TAG = "GLTextureView";
+
+ static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
+ static final int EGL_OPENGL_ES2_BIT = 4;
+
+ private volatile boolean mFinished;
+
+ private final Resources mResources;
+ private final SurfaceTexture mSurface;
+
+ private EGL10 mEgl;
+ private EGLDisplay mEglDisplay;
+ private EGLConfig mEglConfig;
+ private EGLContext mEglContext;
+ private EGLSurface mEglSurface;
+
+ public ImageFlipRenderThread(Resources resources, SurfaceTexture surface) {
+ mResources = resources;
+ mSurface = surface;
+ }
+
+ private static final String sSimpleVS =
+ "attribute vec4 position;\n" +
+ "attribute vec2 texCoords;\n" +
+ "varying vec2 outTexCoords;\n" +
+ "\nvoid main(void) {\n" +
+ " outTexCoords = texCoords;\n" +
+ " gl_Position = position;\n" +
+ "}\n\n";
+ private static final String sSimpleFS =
+ "precision mediump float;\n\n" +
+ "varying vec2 outTexCoords;\n" +
+ "uniform sampler2D texture;\n" +
+ "\nvoid main(void) {\n" +
+ " gl_FragColor = texture2D(texture, outTexCoords);\n" +
+ "}\n\n";
+
+ private static final int FLOAT_SIZE_BYTES = 4;
+ private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+ private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
+ private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
+ private final float[] mTriangleVerticesData = {
+ // X, Y, Z, U, V
+ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
+ 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
+ -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
+ 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+ };
+
+ @Override
+ public void run() {
+ initGL();
+
+ FloatBuffer triangleVertices = ByteBuffer.allocateDirect(mTriangleVerticesData.length
+ * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
+ triangleVertices.put(mTriangleVerticesData).position(0);
+
+ int texture = loadTexture(R.drawable.large_photo);
+ int program = buildProgram(sSimpleVS, sSimpleFS);
+
+ int attribPosition = glGetAttribLocation(program, "position");
+ checkGlError();
+
+ int attribTexCoords = glGetAttribLocation(program, "texCoords");
+ checkGlError();
+
+ int uniformTexture = glGetUniformLocation(program, "texture");
+ checkGlError();
+
+ glBindTexture(GL_TEXTURE_2D, texture);
+ checkGlError();
+
+ glUseProgram(program);
+ checkGlError();
+
+ glEnableVertexAttribArray(attribPosition);
+ checkGlError();
+
+ glEnableVertexAttribArray(attribTexCoords);
+ checkGlError();
+
+ glUniform1i(uniformTexture, 0);
+ checkGlError();
+
+ // drawQuad
+ triangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
+ glVertexAttribPointer(attribPosition, 3, GL_FLOAT, false,
+ TRIANGLE_VERTICES_DATA_STRIDE_BYTES, triangleVertices);
+ checkGlError();
+
+ triangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
+ glVertexAttribPointer(attribTexCoords, 3, GL_FLOAT, false,
+ TRIANGLE_VERTICES_DATA_STRIDE_BYTES, triangleVertices);
+ checkGlError();
+
+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ checkGlError();
+
+ while (!mFinished) {
+ checkCurrent();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+ checkGlError();
+
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ checkGlError();
+
+ if (!mEgl.eglSwapBuffers(mEglDisplay, mEglSurface)) {
+ throw new RuntimeException("Cannot swap buffers");
+ }
+ checkEglError();
+
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ }
+
+ finishGL();
+ }
+
+ private int loadTexture(int resource) {
+ int[] textures = new int[1];
+
+ glActiveTexture(GL_TEXTURE0);
+ glGenTextures(1, textures, 0);
+ checkGlError();
+
+ int texture = textures[0];
+ glBindTexture(GL_TEXTURE_2D, texture);
+ checkGlError();
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ Bitmap bitmap = BitmapFactory.decodeResource(mResources, resource);
+
+ GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0);
+ checkGlError();
+
+ bitmap.recycle();
+
+ return texture;
+ }
+
+ private static int buildProgram(String vertex, String fragment) {
+ int vertexShader = buildShader(vertex, GL_VERTEX_SHADER);
+ if (vertexShader == 0) return 0;
+
+ int fragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER);
+ if (fragmentShader == 0) return 0;
+
+ int program = glCreateProgram();
+ glAttachShader(program, vertexShader);
+ checkGlError();
+
+ glAttachShader(program, fragmentShader);
+ checkGlError();
+
+ glLinkProgram(program);
+ checkGlError();
+
+ int[] status = new int[1];
+ glGetProgramiv(program, GL_LINK_STATUS, status, 0);
+ if (status[0] != GL_TRUE) {
+ String error = glGetProgramInfoLog(program);
+ Log.d(LOG_TAG, "Error while linking program:\n" + error);
+ glDeleteShader(vertexShader);
+ glDeleteShader(fragmentShader);
+ glDeleteProgram(program);
+ return 0;
+ }
+
+ return program;
+ }
+
+ private static int buildShader(String source, int type) {
+ int shader = glCreateShader(type);
+
+ glShaderSource(shader, source);
+ checkGlError();
+
+ glCompileShader(shader);
+ checkGlError();
+
+ int[] status = new int[1];
+ glGetShaderiv(shader, GL_COMPILE_STATUS, status, 0);
+ if (status[0] != GL_TRUE) {
+ String error = glGetShaderInfoLog(shader);
+ Log.d(LOG_TAG, "Error while compiling shader:\n" + error);
+ glDeleteShader(shader);
+ return 0;
+ }
+
+ return shader;
+ }
+
+ private void checkEglError() {
+ int error = mEgl.eglGetError();
+ if (error != EGL10.EGL_SUCCESS) {
+ Log.w(LOG_TAG, "EGL error = 0x" + Integer.toHexString(error));
+ }
+ }
+
+ private static void checkGlError() {
+ int error = glGetError();
+ if (error != GL_NO_ERROR) {
+ Log.w(LOG_TAG, "GL error = 0x" + Integer.toHexString(error));
+ }
+ }
+
+ private void finishGL() {
+ mEgl.eglDestroyContext(mEglDisplay, mEglContext);
+ mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
+ }
+
+ private void checkCurrent() {
+ if (!mEglContext.equals(mEgl.eglGetCurrentContext()) ||
+ !mEglSurface.equals(mEgl.eglGetCurrentSurface(EGL10.EGL_DRAW))) {
+ if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) {
+ throw new RuntimeException("eglMakeCurrent failed "
+ + GLUtils.getEGLErrorString(mEgl.eglGetError()));
+ }
+ }
+ }
+
+ private void initGL() {
+ mEgl = (EGL10) EGLContext.getEGL();
+
+ mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
+ if (mEglDisplay == EGL10.EGL_NO_DISPLAY) {
+ throw new RuntimeException("eglGetDisplay failed "
+ + GLUtils.getEGLErrorString(mEgl.eglGetError()));
+ }
+
+ int[] version = new int[2];
+ if (!mEgl.eglInitialize(mEglDisplay, version)) {
+ throw new RuntimeException("eglInitialize failed " +
+ GLUtils.getEGLErrorString(mEgl.eglGetError()));
+ }
+
+ mEglConfig = chooseEglConfig();
+ if (mEglConfig == null) {
+ throw new RuntimeException("eglConfig not initialized");
+ }
+
+ mEglContext = createContext(mEgl, mEglDisplay, mEglConfig);
+
+ mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, mEglConfig, mSurface, null);
+
+ if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE) {
+ int error = mEgl.eglGetError();
+ if (error == EGL10.EGL_BAD_NATIVE_WINDOW) {
+ Log.e(LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW.");
+ return;
+ }
+ throw new RuntimeException("createWindowSurface failed "
+ + GLUtils.getEGLErrorString(error));
+ }
+
+ if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) {
+ throw new RuntimeException("eglMakeCurrent failed "
+ + GLUtils.getEGLErrorString(mEgl.eglGetError()));
+ }
+ }
+
+
+ EGLContext createContext(EGL10 egl, EGLDisplay eglDisplay, EGLConfig eglConfig) {
+ int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE};
+ return egl.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
+ }
+
+ private EGLConfig chooseEglConfig() {
+ int[] configsCount = new int[1];
+ EGLConfig[] configs = new EGLConfig[1];
+ int[] configSpec = getConfig();
+ if (!mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1, configsCount)) {
+ throw new IllegalArgumentException("eglChooseConfig failed " +
+ GLUtils.getEGLErrorString(mEgl.eglGetError()));
+ } else if (configsCount[0] > 0) {
+ return configs[0];
+ }
+ return null;
+ }
+
+ private static int[] getConfig() {
+ return new int[]{
+ EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+ EGL10.EGL_RED_SIZE, 8,
+ EGL10.EGL_GREEN_SIZE, 8,
+ EGL10.EGL_BLUE_SIZE, 8,
+ EGL10.EGL_ALPHA_SIZE, 8,
+ EGL10.EGL_DEPTH_SIZE, 0,
+ EGL10.EGL_STENCIL_SIZE, 0,
+ EGL10.EGL_NONE
+ };
+ }
+
+ public void finish() {
+ mFinished = true;
+ }
+}
diff --git a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
index 6177784..95f676e 100644
--- a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
+++ b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
@@ -32,7 +32,7 @@
*/
public class WindowManagerPermissionTests extends TestCase {
IWindowManager mWm;
-
+
@Override
protected void setUp() throws Exception {
super.setUp();
@@ -51,7 +51,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.resumeKeyDispatching(null);
fail("IWindowManager.resumeKeyDispatching did not throw SecurityException as"
@@ -61,7 +61,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.setEventDispatching(true);
fail("IWindowManager.setEventDispatching did not throw SecurityException as"
@@ -71,7 +71,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.addWindowToken(null, 0);
fail("IWindowManager.addWindowToken did not throw SecurityException as"
@@ -81,7 +81,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.removeWindowToken(null);
fail("IWindowManager.removeWindowToken did not throw SecurityException as"
@@ -91,9 +91,10 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
- mWm.addAppToken(0, null, 0, 0, 0, false, false, 0, 0, false, false, null);
+ mWm.addAppToken(0, null, 0, 0, 0, false, false, 0, 0, false, false, null,
+ Configuration.EMPTY);
fail("IWindowManager.addAppToken did not throw SecurityException as"
+ " expected");
} catch (SecurityException e) {
@@ -101,9 +102,9 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
- mWm.setAppTask(null, 0, null);
+ mWm.setAppTask(null, 0, null, null);
fail("IWindowManager.setAppGroupId did not throw SecurityException as"
+ " expected");
} catch (SecurityException e) {
@@ -111,7 +112,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.updateOrientationFromAppTokens(new Configuration(), null);
fail("IWindowManager.updateOrientationFromAppTokens did not throw SecurityException as"
@@ -121,7 +122,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.setAppOrientation(null, 0);
mWm.addWindowToken(null, 0);
@@ -132,7 +133,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.setFocusedApp(null, false);
fail("IWindowManager.setFocusedApp did not throw SecurityException as"
@@ -142,7 +143,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.prepareAppTransition(0, false);
fail("IWindowManager.prepareAppTransition did not throw SecurityException as"
@@ -152,7 +153,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.executeAppTransition();
fail("IWindowManager.executeAppTransition did not throw SecurityException as"
@@ -162,7 +163,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.setAppStartingWindow(null, "foo", 0, null, null, 0, 0, 0, 0, null, false);
fail("IWindowManager.setAppStartingWindow did not throw SecurityException as"
@@ -172,7 +173,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.setAppWillBeHidden(null);
fail("IWindowManager.setAppWillBeHidden did not throw SecurityException as"
@@ -182,7 +183,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.setAppVisibility(null, false);
fail("IWindowManager.setAppVisibility did not throw SecurityException as"
@@ -192,7 +193,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.startAppFreezingScreen(null, 0);
fail("IWindowManager.startAppFreezingScreen did not throw SecurityException as"
@@ -202,7 +203,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.stopAppFreezingScreen(null, false);
fail("IWindowManager.stopAppFreezingScreen did not throw SecurityException as"
@@ -212,7 +213,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.removeAppToken(null);
fail("IWindowManager.removeAppToken did not throw SecurityException as"
@@ -236,7 +237,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.reenableKeyguard(token);
fail("IWindowManager.reenableKeyguard did not throw SecurityException as"
@@ -246,7 +247,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.exitKeyguardSecurely(null);
fail("IWindowManager.exitKeyguardSecurely did not throw SecurityException as"
@@ -257,7 +258,7 @@
fail("Unexpected remote exception");
}
}
-
+
@SmallTest
public void testSET_ANIMATION_SCALE() {
try {
@@ -269,7 +270,7 @@
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
+
try {
mWm.setAnimationScales(new float[1]);
fail("IWindowManager.setAnimationScales did not throw SecurityException as"
@@ -280,7 +281,7 @@
fail("Unexpected remote exception");
}
}
-
+
@SmallTest
public void testSET_ORIENTATION() {
try {
diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk
index 769e2a1..b701445 100644
--- a/tools/aapt/Android.mk
+++ b/tools/aapt/Android.mk
@@ -54,7 +54,6 @@
tests/ResourceFilter_test.cpp \
tests/ResourceTable_test.cpp
-aaptHostLdLibs :=
aaptHostStaticLibs := \
libandroidfw \
libpng \
@@ -68,17 +67,13 @@
aaptCFlags := -DAAPT_VERSION=\"$(BUILD_NUMBER_FROM_FILE)\"
aaptCFlags += -Wall -Werror
-ifeq ($(HOST_OS),linux)
- aaptHostLdLibs += -lrt -ldl -lpthread
-endif
+aaptHostLdLibs_linux := -lrt -ldl -lpthread
# Statically link libz for MinGW (Win SDK under Linux),
# and dynamically link for all others.
-ifneq ($(strip $(USE_MINGW)),)
- aaptHostStaticLibs += libz
-else
- aaptHostLdLibs += -lz
-endif
+aaptHostStaticLibs_windows := libz
+aaptHostLdLibs_linux += -lz
+aaptHostLdLibs_darwin := -lz
# ==========================================================
@@ -87,13 +82,13 @@
include $(CLEAR_VARS)
LOCAL_MODULE := libaapt
-LOCAL_CFLAGS += -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags)
-LOCAL_CPPFLAGS += $(aaptCppFlags)
-ifeq (darwin,$(HOST_OS))
-LOCAL_CFLAGS += -D_DARWIN_UNLIMITED_STREAMS
-endif
+LOCAL_MODULE_HOST_OS := darwin linux windows
+LOCAL_CFLAGS := -Wno-format-y2k -DSTATIC_ANDROIDFW_FOR_TOOLS $(aaptCFlags)
+LOCAL_CPPFLAGS := $(aaptCppFlags)
+LOCAL_CFLAGS_darwin := -D_DARWIN_UNLIMITED_STREAMS
LOCAL_SRC_FILES := $(aaptSources)
-LOCAL_STATIC_LIBRARIES += $(aaptHostStaticLibs)
+LOCAL_STATIC_LIBRARIES := $(aaptHostStaticLibs)
+LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)
include $(BUILD_HOST_STATIC_LIBRARY)
@@ -103,11 +98,14 @@
include $(CLEAR_VARS)
LOCAL_MODULE := aapt
-LOCAL_CFLAGS += $(aaptCFlags)
-LOCAL_CPPFLAGS += $(aaptCppFlags)
-LOCAL_LDLIBS += $(aaptHostLdLibs)
+LOCAL_MODULE_HOST_OS := darwin linux windows
+LOCAL_CFLAGS := $(aaptCFlags)
+LOCAL_CPPFLAGS := $(aaptCppFlags)
+LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin)
+LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux)
LOCAL_SRC_FILES := $(aaptMain)
-LOCAL_STATIC_LIBRARIES += libaapt $(aaptHostStaticLibs)
+LOCAL_STATIC_LIBRARIES := libaapt $(aaptHostStaticLibs)
+LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)
include $(BUILD_HOST_EXECUTABLE)
@@ -116,15 +114,16 @@
# Build the host tests: libaapt_tests
# ==========================================================
include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_MODULE := libaapt_tests
-LOCAL_CFLAGS += $(aaptCFlags)
-LOCAL_CPPFLAGS += $(aaptCppFlags)
-LOCAL_LDLIBS += $(aaptHostLdLibs)
-LOCAL_SRC_FILES += $(aaptTests)
-LOCAL_C_INCLUDES += $(LOCAL_PATH)
-LOCAL_STATIC_LIBRARIES += libaapt $(aaptHostStaticLibs)
+LOCAL_CFLAGS := $(aaptCFlags)
+LOCAL_CPPFLAGS := $(aaptCppFlags)
+LOCAL_LDLIBS_darwin := $(aaptHostLdLibs_darwin)
+LOCAL_LDLIBS_linux := $(aaptHostLdLibs_linux)
+LOCAL_SRC_FILES := $(aaptTests)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)
+LOCAL_STATIC_LIBRARIES := libaapt $(aaptHostStaticLibs)
+LOCAL_STATIC_LIBRARIES_windows := $(aaptHostStaticLibs_windows)
include $(BUILD_HOST_NATIVE_TEST)
diff --git a/tools/aidl/AST.h b/tools/aidl/AST.h
index ead5e7a..d7bfccb 100644
--- a/tools/aidl/AST.h
+++ b/tools/aidl/AST.h
@@ -1,5 +1,5 @@
-#ifndef AIDL_AST_H
-#define AIDL_AST_H
+#ifndef AIDL_AST_H_
+#define AIDL_AST_H_
#include <string>
#include <vector>
@@ -368,4 +368,4 @@
virtual void Write(FILE* to);
};
-#endif // AIDL_AST_H
+#endif // AIDL_AST_H_
diff --git a/tools/aidl/Android.mk b/tools/aidl/Android.mk
index efd60a2..b478a4d 100644
--- a/tools/aidl/Android.mk
+++ b/tools/aidl/Android.mk
@@ -6,24 +6,64 @@
ifeq ($(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)),)
LOCAL_PATH:= $(call my-dir)
+
+# Logic shared between aidl and its unittests
include $(CLEAR_VARS)
+LOCAL_MODULE := libaidl-common
+
+LOCAL_CLANG_CFLAGS := -Wall -Werror
+# Tragically, the code is riddled with unused parameters.
+LOCAL_CLANG_CFLAGS += -Wno-unused-parameter
+# yacc dumps a lot of code *just in case*.
+LOCAL_CLANG_CFLAGS += -Wno-unused-function
+LOCAL_CLANG_CFLAGS += -Wno-unneeded-internal-declaration
+# yacc is a tool from a more civilized age.
+LOCAL_CLANG_CFLAGS += -Wno-deprecated-register
+# yacc also has a habit of using char* over const char*.
+LOCAL_CLANG_CFLAGS += -Wno-writable-strings
LOCAL_SRC_FILES := \
- aidl_language_l.l \
- aidl_language_y.y \
- aidl.cpp \
- aidl_language.cpp \
- options.cpp \
- search_path.cpp \
- AST.cpp \
- Type.cpp \
- generate_java.cpp \
- generate_java_binder.cpp \
- generate_java_rpc.cpp
+ AST.cpp \
+ Type.cpp \
+ aidl.cpp \
+ aidl_language.cpp \
+ aidl_language_l.l \
+ aidl_language_y.y \
+ generate_java.cpp \
+ generate_java_binder.cpp \
+ generate_java_rpc.cpp \
+ options.cpp \
+ search_path.cpp \
-LOCAL_CFLAGS := -g
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+
+# aidl executable
+include $(CLEAR_VARS)
LOCAL_MODULE := aidl
+LOCAL_MODULE_HOST_OS := darwin linux windows
+LOCAL_CFLAGS := -Wall -Werror
+LOCAL_SRC_FILES := main.cpp
+LOCAL_STATIC_LIBRARIES := libaidl-common
include $(BUILD_HOST_EXECUTABLE)
+
+# Unit tests
+include $(CLEAR_VARS)
+LOCAL_MODULE := aidl_unittests
+
+LOCAL_CFLAGS := -g -DUNIT_TEST -Wall -Werror
+LOCAL_SRC_FILES := \
+ options_unittest.cpp \
+ tests/test.cpp \
+
+LOCAL_STATIC_LIBRARIES := \
+ libaidl-common \
+ libgmock_host \
+ libgtest_host \
+ libBionicGtestMain
+LOCAL_LDLIBS := -lrt
+include $(BUILD_HOST_NATIVE_TEST)
+
endif # No TARGET_BUILD_APPS or TARGET_BUILD_PDK
diff --git a/tools/aidl/Type.h b/tools/aidl/Type.h
index ae12720..d799fca 100644
--- a/tools/aidl/Type.h
+++ b/tools/aidl/Type.h
@@ -1,5 +1,5 @@
-#ifndef AIDL_TYPE_H
-#define AIDL_TYPE_H
+#ifndef AIDL_TYPE_H_
+#define AIDL_TYPE_H_
#include "AST.h"
#include <string>
@@ -539,4 +539,4 @@
void register_base_types();
-#endif // AIDL_TYPE_H
+#endif // AIDL_TYPE_H_
diff --git a/tools/aidl/aidl.cpp b/tools/aidl/aidl.cpp
index 438007f..a4ecb75 100644
--- a/tools/aidl/aidl.cpp
+++ b/tools/aidl/aidl.cpp
@@ -162,11 +162,6 @@
{
}
-static ParserCallbacks g_importCallbacks = {
- &main_document_parsed,
- &import_import_parsed
-};
-
// ==========================================================
static int
check_filename(const char* filename, const char* package, buffer_type* name)
@@ -938,7 +933,7 @@
}
// ==========================================================
-static int
+int
compile_aidl(Options& options)
{
int err = 0, N;
@@ -1068,7 +1063,7 @@
return err;
}
-static int
+int
preprocess_aidl(const Options& options)
{
vector<string> lines;
@@ -1140,24 +1135,3 @@
close(fd);
return 0;
}
-
-// ==========================================================
-int
-main(int argc, const char **argv)
-{
- Options options;
- int result = parse_options(argc, argv, &options);
- if (result) {
- return result;
- }
-
- switch (options.task)
- {
- case COMPILE_AIDL:
- return compile_aidl(options);
- case PREPROCESS_AIDL:
- return preprocess_aidl(options);
- }
- fprintf(stderr, "aidl: internal error\n");
- return 1;
-}
diff --git a/tools/aidl/aidl.h b/tools/aidl/aidl.h
new file mode 100644
index 0000000..98b15f3
--- /dev/null
+++ b/tools/aidl/aidl.h
@@ -0,0 +1,9 @@
+#ifndef AIDL_AIDL_H_
+#define AIDL_AIDL_H_
+
+#include "options.h"
+
+int compile_aidl(Options& options);
+int preprocess_aidl(const Options& options);
+
+#endif // AIDL_AIDL_H_
diff --git a/tools/aidl/aidl_language.h b/tools/aidl/aidl_language.h
index de1370c..1be5a9b 100644
--- a/tools/aidl/aidl_language.h
+++ b/tools/aidl/aidl_language.h
@@ -1,5 +1,5 @@
-#ifndef DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
-#define DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
+#ifndef AIDL_AIDL_LANGUAGE_H_
+#define AIDL_AIDL_LANGUAGE_H_
typedef enum {
@@ -169,4 +169,4 @@
#endif
-#endif // DEVICE_TOOLS_AIDL_AIDL_LANGUAGE_H
+#endif // AIDL_AIDL_LANGUAGE_H_
diff --git a/tools/aidl/generate_java.h b/tools/aidl/generate_java.h
index 4bfcfeb..ae7983f 100644
--- a/tools/aidl/generate_java.h
+++ b/tools/aidl/generate_java.h
@@ -1,5 +1,5 @@
-#ifndef GENERATE_JAVA_H
-#define GENERATE_JAVA_H
+#ifndef AIDL_GENERATE_JAVA_H_
+#define AIDL_GENERATE_JAVA_H_
#include "aidl_language.h"
#include "AST.h"
@@ -29,5 +29,5 @@
int m_index;
};
-#endif // GENERATE_JAVA_H
+#endif // AIDL_GENERATE_JAVA_H_
diff --git a/tools/aidl/main.cpp b/tools/aidl/main.cpp
new file mode 100644
index 0000000..7cc2198
--- /dev/null
+++ b/tools/aidl/main.cpp
@@ -0,0 +1,23 @@
+#include "aidl.h"
+#include "options.h"
+
+#include <stdio.h>
+
+int
+main(int argc, const char **argv)
+{
+ Options options;
+ int result = parse_options(argc, argv, &options);
+ if (result) {
+ return result;
+ }
+
+ switch (options.task) {
+ case COMPILE_AIDL:
+ return compile_aidl(options);
+ case PREPROCESS_AIDL:
+ return preprocess_aidl(options);
+ }
+ fprintf(stderr, "aidl: internal error\n");
+ return 1;
+}
diff --git a/tools/aidl/options.cpp b/tools/aidl/options.cpp
index 7b2daeb..52b0972 100644
--- a/tools/aidl/options.cpp
+++ b/tools/aidl/options.cpp
@@ -48,10 +48,6 @@
return 0;
}
- options->task = COMPILE_AIDL;
- options->failOnParcelable = false;
- options->autoDepFile = false;
-
// OPTIONS
while (i < argc) {
const char* s = argv[i];
diff --git a/tools/aidl/options.h b/tools/aidl/options.h
index 387e37d..4e95e11 100644
--- a/tools/aidl/options.h
+++ b/tools/aidl/options.h
@@ -1,5 +1,5 @@
-#ifndef DEVICE_TOOLS_AIDL_H
-#define DEVICE_TOOLS_AIDL_H
+#ifndef AIDL_OPTIONS_H_
+#define AIDL_OPTIONS_H_
#include <string.h>
#include <string>
@@ -15,15 +15,15 @@
// This struct is the parsed version of the command line options
struct Options
{
- int task;
- bool failOnParcelable;
+ int task{COMPILE_AIDL};
+ bool failOnParcelable{false};
vector<string> importPaths;
vector<string> preprocessedFiles;
string inputFileName;
string outputFileName;
string outputBaseFolder;
string depFileName;
- bool autoDepFile;
+ bool autoDepFile{false};
vector<string> filesToPreprocess;
};
@@ -33,4 +33,4 @@
// It also prints the usage statement on failure.
int parse_options(int argc, const char* const* argv, Options *options);
-#endif // DEVICE_TOOLS_AIDL_H
+#endif // AIDL_OPTIONS_H_
diff --git a/tools/aidl/options_unittest.cpp b/tools/aidl/options_unittest.cpp
new file mode 100644
index 0000000..fec7f87
--- /dev/null
+++ b/tools/aidl/options_unittest.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "options.h"
+
+using std::vector;
+using std::string;
+
+const char kPreprocessCommandOutputFile[] = "output_file_name";
+const char kPreprocessCommandInput1[] = "input1";
+const char kPreprocessCommandInput2[] = "input2";
+const char kPreprocessCommandInput3[] = "input3";
+const char* kPreprocessCommand[] = {
+ "aidl", "--preprocess",
+ kPreprocessCommandOutputFile,
+ kPreprocessCommandInput1,
+ kPreprocessCommandInput2,
+ kPreprocessCommandInput3,
+};
+
+TEST(OptionsTests, ParsesPreprocess) {
+ Options options;
+ const int argc = sizeof(kPreprocessCommand) / sizeof(*kPreprocessCommand);
+ EXPECT_EQ(parse_options(argc, kPreprocessCommand, &options), 0);
+ EXPECT_EQ(options.task, PREPROCESS_AIDL);
+ EXPECT_EQ(options.failOnParcelable, false);
+ EXPECT_EQ(options.importPaths.size(), 0u);
+ EXPECT_EQ(options.preprocessedFiles.size(), 0u);
+ EXPECT_EQ(options.inputFileName, string{""});
+ EXPECT_EQ(options.outputFileName, string{kPreprocessCommandOutputFile});
+ EXPECT_EQ(options.autoDepFile, false);
+ const vector<string> expected_input{kPreprocessCommandInput1,
+ kPreprocessCommandInput2,
+ kPreprocessCommandInput3};
+ EXPECT_EQ(options.filesToPreprocess, expected_input);
+}
diff --git a/tools/aidl/os.h b/tools/aidl/os.h
index 79d2c35..752ed47 100644
--- a/tools/aidl/os.h
+++ b/tools/aidl/os.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef _FRAMEWORKS_BASE_TOOLS_AIDL_OS_SEP_H_
-#define _FRAMEWORKS_BASE_TOOLS_AIDL_OS_SEP_H_
+#ifndef AIDL_OS_H_
+#define AIDL_OS_H_
#if defined(_WIN32)
#define OS_PATH_SEPARATOR '\\'
@@ -23,4 +23,4 @@
#define OS_PATH_SEPARATOR '/'
#endif
-#endif
+#endif // AIDL_OS_H_
diff --git a/tools/aidl/search_path.h b/tools/aidl/search_path.h
index 2bf94b1..4fec257 100644
--- a/tools/aidl/search_path.h
+++ b/tools/aidl/search_path.h
@@ -1,5 +1,5 @@
-#ifndef DEVICE_TOOLS_AIDL_SEARCH_PATH_H
-#define DEVICE_TOOLS_AIDL_SEARCH_PATH_H
+#ifndef AIDL_SEARCH_PATH_H_
+#define AIDL_SEARCH_PATH_H_
#include <stdio.h>
@@ -19,5 +19,4 @@
void set_import_paths(const vector<string>& importPaths);
#endif
-#endif // DEVICE_TOOLS_AIDL_SEARCH_PATH_H
-
+#endif // AIDL_SEARCH_PATH_H_
diff --git a/tools/aidl/tests/test.cpp b/tools/aidl/tests/test.cpp
new file mode 100644
index 0000000..15ae294
--- /dev/null
+++ b/tools/aidl/tests/test.cpp
@@ -0,0 +1,3 @@
+#include <gtest/gtest.h>
+
+TEST(DummyCase, DummyTest) {}
diff --git a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java
index 1e33e3a..f1726eb 100644
--- a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java
+++ b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java
@@ -36,6 +36,7 @@
import android.annotation.NonNull;
import android.content.Context;
+import android.content.res.TypedArray;
import android.util.AttributeSet;
import java.io.File;
@@ -54,6 +55,9 @@
private ResourceReference mResourceReference;
private Map<View, String> mOpenDrawerLayouts;
+ // Keep in sync with the same value in LayoutInflater.
+ private static final int[] ATTRS_THEME = new int[] {com.android.internal.R.attr.theme };
+
/**
* List of class prefixes which are tried first by default.
* <p/>
@@ -135,11 +139,23 @@
@Override
public View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,
- boolean ignoreThemeAttrs) {
+ boolean ignoreThemeAttr) {
View view;
try {
- view = super.createViewFromTag(parent, name, context, attrs, ignoreThemeAttrs);
+ view = super.createViewFromTag(parent, name, context, attrs, ignoreThemeAttr);
} catch (InflateException e) {
+ // Creation of ContextThemeWrapper code is same as in the super method.
+ // Apply a theme wrapper, if allowed and one is specified.
+ if (!ignoreThemeAttr) {
+ final TypedArray ta = context.obtainStyledAttributes(attrs, ATTRS_THEME);
+ final int themeResId = ta.getResourceId(0, 0);
+ if (themeResId != 0) {
+ context = new ContextThemeWrapper(context, themeResId);
+ }
+ ta.recycle();
+ }
+ final Object lastContext = mConstructorArgs[0];
+ mConstructorArgs[0] = context;
// try to load the class from using the custom view loader
try {
view = loadCustomView(name, attrs);
@@ -153,6 +169,8 @@
exception.initCause(e);
}
throw exception;
+ } finally {
+ mConstructorArgs[0] = lastContext;
}
}
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index a8fd91c..ed8b56e 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -74,11 +74,10 @@
// ---- unused implementation of IWindowManager ----
@Override
- public Configuration addAppToken(int arg0, IApplicationToken arg1, int arg2, int arg3, int arg4,
+ public void addAppToken(int arg0, IApplicationToken arg1, int arg2, int arg3, int arg4,
boolean arg5, boolean arg6, int arg7, int arg8, boolean arg9, boolean arg10,
- Rect arg11) throws RemoteException {
+ Rect arg11, Configuration arg12) throws RemoteException {
// TODO Auto-generated method stub
- return Configuration.EMPTY;
}
@Override
@@ -315,9 +314,9 @@
}
@Override
- public Configuration setAppTask(IBinder arg0, int arg1, Rect arg2) throws RemoteException {
+ public void setAppTask(IBinder arg0, int arg1, Rect arg2, Configuration arg3)
+ throws RemoteException {
// TODO Auto-generated method stub
- return Configuration.EMPTY;
}
@Override
diff --git a/tools/split-select/Android.mk b/tools/split-select/Android.mk
index d9ddf08..239bed5 100644
--- a/tools/split-select/Android.mk
+++ b/tools/split-select/Android.mk
@@ -43,7 +43,6 @@
external/zlib \
frameworks/base/tools
-hostLdLibs :=
hostStaticLibs := \
libaapt \
libandroidfw \
@@ -57,17 +56,13 @@
cFlags := -Wall -Werror
-ifeq ($(HOST_OS),linux)
- hostLdLibs += -lrt -ldl -lpthread
-endif
+hostLdLibs_linux := -lrt -ldl -lpthread
# Statically link libz for MinGW (Win SDK under Linux),
# and dynamically link for all others.
-ifneq ($(strip $(USE_MINGW)),)
- hostStaticLibs += libz
-else
- hostLdLibs += -lz
-endif
+hostStaticLibs_windows := libz
+hostLdLibs_darwin := -lz
+hostLdLibs_linux += -lz
# ==========================================================
@@ -75,11 +70,12 @@
# ==========================================================
include $(CLEAR_VARS)
LOCAL_MODULE := libsplit-select
+LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_SRC_FILES := $(sources)
-LOCAL_C_INCLUDES += $(cIncludes)
-LOCAL_CFLAGS += $(cFlags) -D_DARWIN_UNLIMITED_STREAMS
+LOCAL_C_INCLUDES := $(cIncludes)
+LOCAL_CFLAGS := $(cFlags) -D_DARWIN_UNLIMITED_STREAMS
include $(BUILD_HOST_STATIC_LIBRARY)
@@ -93,10 +89,12 @@
LOCAL_SRC_FILES := $(testSources)
-LOCAL_C_INCLUDES += $(cIncludes)
-LOCAL_STATIC_LIBRARIES += libsplit-select $(hostStaticLibs)
-LOCAL_LDLIBS += $(hostLdLibs)
-LOCAL_CFLAGS += $(cFlags)
+LOCAL_C_INCLUDES := $(cIncludes)
+LOCAL_STATIC_LIBRARIES := libsplit-select $(hostStaticLibs)
+LOCAL_STATIC_LIBRARIES_windows := $(hostStaticLibs_windows)
+LOCAL_LDLIBS_darwin := $(hostLdLibs_darwin)
+LOCAL_LDLIBS_linux := $(hostLdLibs_linux)
+LOCAL_CFLAGS := $(cFlags)
include $(BUILD_HOST_NATIVE_TEST)
@@ -105,13 +103,16 @@
# ==========================================================
include $(CLEAR_VARS)
LOCAL_MODULE := split-select
+LOCAL_MODULE_HOST_OS := darwin linux windows
LOCAL_SRC_FILES := $(main)
-LOCAL_C_INCLUDES += $(cIncludes)
-LOCAL_STATIC_LIBRARIES += libsplit-select $(hostStaticLibs)
-LOCAL_LDLIBS += $(hostLdLibs)
-LOCAL_CFLAGS += $(cFlags)
+LOCAL_C_INCLUDES := $(cIncludes)
+LOCAL_STATIC_LIBRARIES := libsplit-select $(hostStaticLibs)
+LOCAL_STATIC_LIBRARIES_windows := $(hostStaticLibs_windows)
+LOCAL_LDLIBS_darwin := $(hostLdLibs_darwin)
+LOCAL_LDLIBS_linux := $(hostLdLibs_linux)
+LOCAL_CFLAGS := $(cFlags)
include $(BUILD_HOST_EXECUTABLE)