Merge "Allow acquiring ContentProviders across users." into jb-mr1-dev
diff --git a/api/current.txt b/api/current.txt
index 8896ae8..7eabad8 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6619,6 +6619,7 @@
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
+ field public static final java.lang.String FEATURE_CAMERA_ANY = "android.hardware.camera.any";
field public static final java.lang.String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
field public static final java.lang.String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash";
field public static final java.lang.String FEATURE_CAMERA_FRONT = "android.hardware.camera.front";
@@ -6769,6 +6770,7 @@
public class ResolveInfo implements android.os.Parcelable {
ctor public ResolveInfo();
+ ctor public ResolveInfo(android.content.pm.ResolveInfo);
method public int describeContents();
method public void dump(android.util.Printer, java.lang.String);
method public final int getIconResource();
@@ -18416,6 +18418,7 @@
method public static android.net.Uri getMediaScannerUri();
method public static java.lang.String getVersion(android.content.Context);
field public static final java.lang.String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
+ field public static final java.lang.String ACTION_IMAGE_CAPTURE_SECURE = "android.media.action.IMAGE_CAPTURE_SECURE";
field public static final java.lang.String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
field public static final java.lang.String AUTHORITY = "media";
field public static final java.lang.String EXTRA_DURATION_LIMIT = "android.intent.extra.durationLimit";
@@ -29005,7 +29008,6 @@
method public int describeContents();
method public int getLayoutId();
method public java.lang.String getPackage();
- method public void mergeRemoteViews(android.widget.RemoteViews);
method public boolean onLoadClass(java.lang.Class);
method public void reapply(android.content.Context, android.view.View);
method public void removeAllViews(int);
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 7870031..18503f6 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -42,10 +42,8 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.ManifestDigest;
-import android.content.pm.UserInfo;
import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
@@ -453,11 +451,17 @@
@Override
public ResolveInfo resolveActivity(Intent intent, int flags) {
+ return resolveActivityAsUser(intent, flags, UserHandle.myUserId());
+ }
+
+ @Override
+ public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) {
try {
return mPM.resolveIntent(
intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags, UserHandle.myUserId());
+ flags,
+ userId);
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
@@ -466,12 +470,12 @@
@Override
public List<ResolveInfo> queryIntentActivities(Intent intent,
int flags) {
- return queryIntentActivitiesForUser(intent, flags, UserHandle.myUserId());
+ return queryIntentActivitiesAsUser(intent, flags, UserHandle.myUserId());
}
/** @hide Same as above but for a specific user */
@Override
- public List<ResolveInfo> queryIntentActivitiesForUser(Intent intent,
+ public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
int flags, int userId) {
try {
return mPM.queryIntentActivities(
@@ -551,19 +555,24 @@
}
@Override
- public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
+ public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
try {
return mPM.queryIntentServices(
intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
flags,
- UserHandle.myUserId());
+ userId);
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
@Override
+ public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
+ return queryIntentServicesAsUser(intent, flags, UserHandle.myUserId());
+ }
+
+ @Override
public ProviderInfo resolveContentProvider(String name,
int flags) {
try {
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index c86826f..f258f17 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -226,7 +226,12 @@
if (jail == null) jail = new ParcelableSparseArray();
- super.dispatchRestoreInstanceState(jail);
+ try {
+ super.dispatchRestoreInstanceState(jail);
+ } catch (Exception e) {
+ Log.e(TAG, "failed to restoreInstanceState for widget id: " + mAppWidgetId + ", "
+ + (mInfo == null ? "null" : mInfo.provider), e);
+ }
}
/**
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index fd488ae..291726a 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -835,6 +835,14 @@
/**
* Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device has at least one camera pointing in
+ * some direction.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_CAMERA_ANY = "android.hardware.camera.any";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's camera supports flash.
*/
@SdkConstant(SdkConstantType.FEATURE)
@@ -1797,6 +1805,39 @@
public abstract ResolveInfo resolveActivity(Intent intent, int flags);
/**
+ * Determine the best action to perform for a given Intent for a given user. This
+ * is how {@link Intent#resolveActivity} finds an activity if a class has not
+ * been explicitly specified.
+ *
+ * <p><em>Note:</em> if using an implicit Intent (without an explicit ComponentName
+ * specified), be sure to consider whether to set the {@link #MATCH_DEFAULT_ONLY}
+ * only flag. You need to do so to resolve the activity in the same way
+ * that {@link android.content.Context#startActivity(Intent)} and
+ * {@link android.content.Intent#resolveActivity(PackageManager)
+ * Intent.resolveActivity(PackageManager)} do.</p>
+ *
+ * @param intent An intent containing all of the desired specification
+ * (action, data, type, category, and/or component).
+ * @param flags Additional option flags. The most important is
+ * {@link #MATCH_DEFAULT_ONLY}, to limit the resolution to only
+ * those activities that support the {@link android.content.Intent#CATEGORY_DEFAULT}.
+ * @param userId The user id.
+ *
+ * @return Returns a ResolveInfo containing the final activity intent that
+ * was determined to be the best action. Returns null if no
+ * matching activity was found. If multiple matching activities are
+ * found and there is no default set, returns a ResolveInfo
+ * containing something else, such as the activity resolver.
+ *
+ * @see #MATCH_DEFAULT_ONLY
+ * @see #GET_INTENT_FILTERS
+ * @see #GET_RESOLVED_FILTER
+ *
+ * @hide
+ */
+ public abstract ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId);
+
+ /**
* Retrieve all activities that can be performed for the given intent.
*
* @param intent The desired intent as per resolveActivity().
@@ -1836,7 +1877,7 @@
* @see #GET_RESOLVED_FILTER
* @hide
*/
- public abstract List<ResolveInfo> queryIntentActivitiesForUser(Intent intent,
+ public abstract List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
int flags, int userId);
@@ -1944,6 +1985,27 @@
int flags);
/**
+ * Retrieve all services that can match the given intent for a given user.
+ *
+ * @param intent The desired intent as per resolveService().
+ * @param flags Additional option flags.
+ * @param userId The user id.
+ *
+ * @return A List<ResolveInfo> containing one entry for each matching
+ * ServiceInfo. These are ordered from best to worst match -- that
+ * is, the first item in the list is what is returned by
+ * resolveService(). If there are no matching services, an empty
+ * list is returned.
+ *
+ * @see #GET_INTENT_FILTERS
+ * @see #GET_RESOLVED_FILTER
+ *
+ * @hide
+ */
+ public abstract List<ResolveInfo> queryIntentServicesAsUser(Intent intent,
+ int flags, int userId);
+
+ /**
* Find a single content provider by its base path name.
*
* @param name The name of the provider to find.
diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java
index e3749b4..07117fe 100644
--- a/core/java/android/content/pm/ResolveInfo.java
+++ b/core/java/android/content/pm/ResolveInfo.java
@@ -230,6 +230,21 @@
public ResolveInfo() {
}
+ public ResolveInfo(ResolveInfo orig) {
+ activityInfo = orig.activityInfo;
+ serviceInfo = orig.serviceInfo;
+ filter = orig.filter;
+ priority = orig.priority;
+ preferredOrder = orig.preferredOrder;
+ match = orig.match;
+ specificIndex = orig.specificIndex;
+ labelRes = orig.labelRes;
+ nonLocalizedLabel = orig.nonLocalizedLabel;
+ icon = orig.icon;
+ resolvePackageName = orig.resolvePackageName;
+ system = orig.system;
+ }
+
public String toString() {
ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
return "ResolveInfo{"
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index 27cabef..846443d 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -21,6 +21,7 @@
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
+import java.net.SocketException;
import java.security.KeyManagementException;
import java.security.cert.X509Certificate;
import javax.net.SocketFactory;
@@ -341,6 +342,22 @@
castToOpenSSLSocket(socket).setHostname(hostName);
}
+ /**
+ * Sets this socket's SO_SNDTIMEO write timeout in milliseconds.
+ * Use 0 for no timeout.
+ * To take effect, this option must be set before the blocking method was called.
+ *
+ * @param socket a socket created by this factory.
+ * @param timeout the desired write timeout in milliseconds.
+ * @throws IllegalArgumentException if the socket was not created by this factory.
+ *
+ * @hide
+ */
+ public void setSoWriteTimeout(Socket socket, int writeTimeoutMilliseconds)
+ throws SocketException {
+ castToOpenSSLSocket(socket).setSoWriteTimeout(writeTimeoutMilliseconds);
+ }
+
private static OpenSSLSocketImpl castToOpenSSLSocket(Socket socket) {
if (!(socket instanceof OpenSSLSocketImpl)) {
throw new IllegalArgumentException("Socket not created by this factory: "
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 3c90f1c..0e7ab52 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -255,7 +255,6 @@
*
* @see #ACTION_IMAGE_CAPTURE
* @see #EXTRA_OUTPUT
- * @hide
*/
public static final String ACTION_IMAGE_CAPTURE_SECURE =
"android.media.action.IMAGE_CAPTURE_SECURE";
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index e0e8de3..bafab21 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -149,6 +149,17 @@
"debug.hwui.show_layers_updates";
/**
+ * Turn on to show overdraw level.
+ *
+ * Possible values:
+ * "true", to enable overdraw debugging
+ * "false", to disable overdraw debugging
+ *
+ * @hide
+ */
+ public static final String DEBUG_SHOW_OVERDRAW_PROPERTY = "debug.hwui.show_overdraw";
+
+ /**
* A process can set this flag to false to prevent the use of hardware
* rendering.
*
@@ -649,6 +660,7 @@
int mProfileCurrentFrame = -PROFILE_FRAME_DATA_COUNT;
final boolean mDebugDirtyRegions;
+ final boolean mShowOverdraw;
final int mGlVersion;
final boolean mTranslucent;
@@ -698,6 +710,9 @@
if (mDebugDirtyRegions) {
Log.d(LOG_TAG, "Debugging dirty regions");
}
+
+ mShowOverdraw = SystemProperties.getBoolean(
+ HardwareRenderer.DEBUG_SHOW_OVERDRAW_PROPERTY, false);
}
@Override
@@ -1414,7 +1429,8 @@
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_DEPTH_SIZE, 0,
- EGL_STENCIL_SIZE, GLES20Canvas.getStencilSize(),
+ // TODO: Find a better way to choose the stencil size
+ EGL_STENCIL_SIZE, mShowOverdraw ? GLES20Canvas.getStencilSize() : 0,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT |
(dirtyRegions ? EGL_SWAP_BEHAVIOR_PRESERVED_BIT : 0),
EGL_NONE
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 77fd12a..732699b 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -27,6 +27,7 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.util.Log;
import android.view.IWindow;
import android.view.View;
@@ -79,6 +80,8 @@
final IAccessibilityManager mService;
+ final int mUserId;
+
final Handler mHandler;
boolean mIsEnabled;
@@ -129,35 +132,72 @@
}
/**
+ * Creates the singleton AccessibilityManager to be shared across users. This
+ * has to be called before the local AccessibilityManager is created to ensure
+ * it registers itself in the system correctly.
+ * <p>
+ * Note: Calling this method requires INTERACT_ACROSS_USERS_FULL or
+ * INTERACT_ACROSS_USERS permission.
+ * </p>
+ * @param context Context in which this manager operates.
+ * @throws IllegalStateException if not called before the local
+ * AccessibilityManager is instantiated.
+ *
+ * @hide
+ */
+ public static void createAsSharedAcrossUsers(Context context) {
+ synchronized (sInstanceSync) {
+ if (sInstance != null) {
+ throw new IllegalStateException("AccessibilityManager already created.");
+ }
+ createSingletonInstance(context, UserHandle.USER_CURRENT);
+ }
+ }
+
+ /**
* Get an AccessibilityManager instance (create one if necessary).
*
+ * @param context Context in which this manager operates.
+ *
* @hide
*/
public static AccessibilityManager getInstance(Context context) {
synchronized (sInstanceSync) {
if (sInstance == null) {
- IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
- IAccessibilityManager service = IAccessibilityManager.Stub.asInterface(iBinder);
- sInstance = new AccessibilityManager(context, service);
+ createSingletonInstance(context, UserHandle.myUserId());
}
}
return sInstance;
}
/**
+ * Creates the singleton instance.
+ *
+ * @param context Context in which this manager operates.
+ * @param userId The user id under which to operate.
+ */
+ private static void createSingletonInstance(Context context, int userId) {
+ IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
+ IAccessibilityManager service = IAccessibilityManager.Stub.asInterface(iBinder);
+ sInstance = new AccessibilityManager(context, service, userId);
+ }
+
+ /**
* Create an instance.
*
* @param context A {@link Context}.
* @param service An interface to the backing service.
+ * @param userId User id under which to run.
*
* @hide
*/
- public AccessibilityManager(Context context, IAccessibilityManager service) {
+ public AccessibilityManager(Context context, IAccessibilityManager service, int userId) {
mHandler = new MyHandler(context.getMainLooper());
mService = service;
+ mUserId = userId;
try {
- final int stateFlags = mService.addClient(mClient);
+ final int stateFlags = mService.addClient(mClient, userId);
setState(stateFlags);
} catch (RemoteException re) {
Log.e(LOG_TAG, "AccessibilityManagerService is dead", re);
@@ -222,7 +262,7 @@
// client using it is called through Binder from another process. Example: MMS
// app adds a SMS notification and the NotificationManagerService calls this method
long identityToken = Binder.clearCallingIdentity();
- doRecycle = mService.sendAccessibilityEvent(event);
+ doRecycle = mService.sendAccessibilityEvent(event, mUserId);
Binder.restoreCallingIdentity(identityToken);
if (DEBUG) {
Log.i(LOG_TAG, event + " sent");
@@ -244,7 +284,7 @@
throw new IllegalStateException("Accessibility off. Did you forget to check that?");
}
try {
- mService.interrupt();
+ mService.interrupt(mUserId);
if (DEBUG) {
Log.i(LOG_TAG, "Requested interrupt from all services");
}
@@ -280,7 +320,7 @@
public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList() {
List<AccessibilityServiceInfo> services = null;
try {
- services = mService.getInstalledAccessibilityServiceList();
+ services = mService.getInstalledAccessibilityServiceList(mUserId);
if (DEBUG) {
Log.i(LOG_TAG, "Installed AccessibilityServices " + services);
}
@@ -307,7 +347,7 @@
int feedbackTypeFlags) {
List<AccessibilityServiceInfo> services = null;
try {
- services = mService.getEnabledAccessibilityServiceList(feedbackTypeFlags);
+ services = mService.getEnabledAccessibilityServiceList(feedbackTypeFlags, mUserId);
if (DEBUG) {
Log.i(LOG_TAG, "Installed AccessibilityServices " + services);
}
@@ -385,7 +425,7 @@
public int addAccessibilityInteractionConnection(IWindow windowToken,
IAccessibilityInteractionConnection connection) {
try {
- return mService.addAccessibilityInteractionConnection(windowToken, connection);
+ return mService.addAccessibilityInteractionConnection(windowToken, connection, mUserId);
} catch (RemoteException re) {
Log.e(LOG_TAG, "Error while adding an accessibility interaction connection. ", re);
}
diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl
index 5b5134a..60238627 100644
--- a/core/java/android/view/accessibility/IAccessibilityManager.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl
@@ -34,18 +34,18 @@
*/
interface IAccessibilityManager {
- int addClient(IAccessibilityManagerClient client);
+ int addClient(IAccessibilityManagerClient client, int userId);
- boolean sendAccessibilityEvent(in AccessibilityEvent uiEvent);
+ boolean sendAccessibilityEvent(in AccessibilityEvent uiEvent, int userId);
- List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList();
+ List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId);
- List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType);
+ List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType, int userId);
- void interrupt();
+ void interrupt(int userId);
int addAccessibilityInteractionConnection(IWindow windowToken,
- in IAccessibilityInteractionConnection connection);
+ in IAccessibilityInteractionConnection connection, int userId);
void removeAccessibilityInteractionConnection(IWindow windowToken);
diff --git a/core/java/android/widget/ActivityChooserModel.java b/core/java/android/widget/ActivityChooserModel.java
index fe6c4f5..736566e4 100644
--- a/core/java/android/widget/ActivityChooserModel.java
+++ b/core/java/android/widget/ActivityChooserModel.java
@@ -21,7 +21,6 @@
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.database.DataSetObservable;
-import android.database.DataSetObserver;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
@@ -458,13 +457,18 @@
* </p>
*
* @return An {@link Intent} for launching the activity or null if the
- * policy has consumed the intent.
+ * policy has consumed the intent or there is not current intent
+ * set via {@link #setIntent(Intent)}.
*
* @see HistoricalRecord
* @see OnChooseActivityListener
*/
public Intent chooseActivity(int index) {
synchronized (mInstanceLock) {
+ if (mIntent == null) {
+ return null;
+ }
+
ensureConsistentState();
ActivityResolveInfo chosenActivity = mActivities.get(index);
diff --git a/core/java/android/widget/AppSecurityPermissions.java b/core/java/android/widget/AppSecurityPermissions.java
index 27d15f6..06dadb0 100755
--- a/core/java/android/widget/AppSecurityPermissions.java
+++ b/core/java/android/widget/AppSecurityPermissions.java
@@ -257,7 +257,7 @@
try {
pkgInfo = mPm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
} catch (NameNotFoundException e) {
- Log.w(TAG, "Could'nt retrieve permissions for package:"+packageName);
+ Log.w(TAG, "Couldn't retrieve permissions for package:"+packageName);
return;
}
// Extract all user permissions
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
index 6ddfc3b..361eca4 100644
--- a/core/java/android/widget/CalendarView.java
+++ b/core/java/android/widget/CalendarView.java
@@ -1573,7 +1573,8 @@
// If we're showing the week number calculate it based on Monday
int i = 0;
if (mShowWeekNumber) {
- mDayNumbers[0] = Integer.toString(mTempDate.get(Calendar.WEEK_OF_YEAR));
+ mDayNumbers[0] = String.format(Locale.getDefault(), "%d",
+ mTempDate.get(Calendar.WEEK_OF_YEAR));
i++;
}
@@ -1594,7 +1595,8 @@
if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) {
mDayNumbers[i] = "";
} else {
- mDayNumbers[i] = Integer.toString(mTempDate.get(Calendar.DAY_OF_MONTH));
+ mDayNumbers[i] = String.format(Locale.getDefault(), "%d",
+ mTempDate.get(Calendar.DAY_OF_MONTH));
}
mTempDate.add(Calendar.DAY_OF_MONTH, 1);
}
@@ -1658,16 +1660,34 @@
* @return True if a day was found for the given location.
*/
public boolean getDayFromLocation(float x, Calendar outCalendar) {
- int dayStart = mShowWeekNumber ? mWidth / mNumCells : 0;
- if (x < dayStart || x > mWidth) {
+ final boolean isLayoutRtl = isLayoutRtl();
+
+ int start;
+ int end;
+
+ if (isLayoutRtl) {
+ start = 0;
+ end = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
+ } else {
+ start = mShowWeekNumber ? mWidth / mNumCells : 0;
+ end = mWidth;
+ }
+
+ if (x < start || x > end) {
outCalendar.clear();
return false;
}
- // Selection is (x - start) / (pixels/day) == (x -s) * day / pixels
- int dayPosition = (int) ((x - dayStart) * mDaysPerWeek
- / (mWidth - dayStart));
+
+ // Selection is (x - start) / (pixels/day) which is (x - start) * day / pixels
+ int dayPosition = (int) ((x - start) * mDaysPerWeek / (end - start));
+
+ if (isLayoutRtl) {
+ dayPosition = mDaysPerWeek - 1 - dayPosition;
+ }
+
outCalendar.setTimeInMillis(mFirstDay.getTimeInMillis());
outCalendar.add(Calendar.DAY_OF_MONTH, dayPosition);
+
return true;
}
@@ -1692,12 +1712,25 @@
mTempRect.top = mWeekSeperatorLineWidth;
mTempRect.bottom = mHeight;
- mTempRect.left = mShowWeekNumber ? mWidth / mNumCells : 0;
- mTempRect.right = mSelectedLeft - 2;
+
+ final boolean isLayoutRtl = isLayoutRtl();
+
+ if (isLayoutRtl) {
+ mTempRect.left = 0;
+ mTempRect.right = mSelectedLeft - 2;
+ } else {
+ mTempRect.left = mShowWeekNumber ? mWidth / mNumCells : 0;
+ mTempRect.right = mSelectedLeft - 2;
+ }
canvas.drawRect(mTempRect, mDrawPaint);
- mTempRect.left = mSelectedRight + 3;
- mTempRect.right = mWidth;
+ if (isLayoutRtl) {
+ mTempRect.left = mSelectedRight + 3;
+ mTempRect.right = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
+ } else {
+ mTempRect.left = mSelectedRight + 3;
+ mTempRect.right = mWidth;
+ }
canvas.drawRect(mTempRect, mDrawPaint);
}
@@ -1707,25 +1740,41 @@
* @param canvas The canvas to draw on
*/
private void drawWeekNumbersAndDates(Canvas canvas) {
- float textHeight = mDrawPaint.getTextSize();
- int y = (int) ((mHeight + textHeight) / 2) - mWeekSeperatorLineWidth;
- int nDays = mNumCells;
+ final float textHeight = mDrawPaint.getTextSize();
+ final int y = (int) ((mHeight + textHeight) / 2) - mWeekSeperatorLineWidth;
+ final int nDays = mNumCells;
+ final int divisor = 2 * nDays;
mDrawPaint.setTextAlign(Align.CENTER);
mDrawPaint.setTextSize(mDateTextSize);
+
int i = 0;
- int divisor = 2 * nDays;
- if (mShowWeekNumber) {
- mDrawPaint.setColor(mWeekNumberColor);
- int x = mWidth / divisor;
- canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
- i++;
- }
- for (; i < nDays; i++) {
- mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
- : mUnfocusedMonthDateColor);
- int x = (2 * i + 1) * mWidth / divisor;
- canvas.drawText(mDayNumbers[i], x, y, mMonthNumDrawPaint);
+
+ if (isLayoutRtl()) {
+ for (; i < nDays - 1; i++) {
+ mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
+ : mUnfocusedMonthDateColor);
+ int x = (2 * i + 1) * mWidth / divisor;
+ canvas.drawText(mDayNumbers[nDays - 1 - i], x, y, mMonthNumDrawPaint);
+ }
+ if (mShowWeekNumber) {
+ mDrawPaint.setColor(mWeekNumberColor);
+ int x = mWidth - mWidth / divisor;
+ canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
+ }
+ } else {
+ if (mShowWeekNumber) {
+ mDrawPaint.setColor(mWeekNumberColor);
+ int x = mWidth / divisor;
+ canvas.drawText(mDayNumbers[0], x, y, mDrawPaint);
+ i++;
+ }
+ for (; i < nDays; i++) {
+ mMonthNumDrawPaint.setColor(mFocusDay[i] ? mFocusedMonthDateColor
+ : mUnfocusedMonthDateColor);
+ int x = (2 * i + 1) * mWidth / divisor;
+ canvas.drawText(mDayNumbers[i], x, y, mMonthNumDrawPaint);
+ }
}
}
@@ -1745,8 +1794,16 @@
}
mDrawPaint.setColor(mWeekSeparatorLineColor);
mDrawPaint.setStrokeWidth(mWeekSeperatorLineWidth);
- float x = mShowWeekNumber ? mWidth / mNumCells : 0;
- canvas.drawLine(x, 0, mWidth, 0, mDrawPaint);
+ float startX;
+ float stopX;
+ if (isLayoutRtl()) {
+ startX = 0;
+ stopX = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
+ } else {
+ startX = mShowWeekNumber ? mWidth / mNumCells : 0;
+ stopX = mWidth;
+ }
+ canvas.drawLine(startX, 0, stopX, 0, mDrawPaint);
}
/**
@@ -1779,15 +1836,21 @@
*/
private void updateSelectionPositions() {
if (mHasSelectedDay) {
+ final boolean isLayoutRtl = isLayoutRtl();
int selectedPosition = mSelectedDay - mFirstDayOfWeek;
if (selectedPosition < 0) {
selectedPosition += 7;
}
- if (mShowWeekNumber) {
+ if (mShowWeekNumber && !isLayoutRtl) {
selectedPosition++;
}
- mSelectedLeft = selectedPosition * mWidth / mNumCells;
- mSelectedRight = (selectedPosition + 1) * mWidth / mNumCells;
+ if (isLayoutRtl) {
+ mSelectedLeft = (mDaysPerWeek - 1 - selectedPosition) * mWidth / mNumCells;
+
+ } else {
+ mSelectedLeft = selectedPosition * mWidth / mNumCells;
+ }
+ mSelectedRight = mSelectedLeft + mWidth / mNumCells;
}
}
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index ac3bedb..07d3a7a 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -220,7 +220,7 @@
// day
mDaySpinner = (NumberPicker) findViewById(R.id.day);
- mDaySpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
+ mDaySpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
mDaySpinner.setOnLongPressUpdateInterval(100);
mDaySpinner.setOnValueChangedListener(onChangeListener);
mDaySpinnerInput = (EditText) mDaySpinner.findViewById(R.id.numberpicker_input);
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index dbc777e..704f6b6 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -51,10 +51,12 @@
import android.view.inputmethod.InputMethodManager;
import com.android.internal.R;
+import libcore.icu.LocaleData;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
/**
* A widget that enables the user to select a number form a predefined range.
@@ -138,13 +140,6 @@
private static final int DEFAULT_LAYOUT_RESOURCE_ID = R.layout.number_picker;
/**
- * The numbers accepted by the input text's {@link Filter}
- */
- private static final char[] DIGIT_CHARACTERS = new char[] {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
- };
-
- /**
* Constant for unspecified size.
*/
private static final int SIZE_UNSPECIFIED = -1;
@@ -154,23 +149,53 @@
* strings like "01". Keeping a static formatter etc. is the most efficient
* way to do this; it avoids creating temporary objects on every call to
* format().
- *
- * @hide
*/
- public static final NumberPicker.Formatter TWO_DIGIT_FORMATTER = new NumberPicker.Formatter() {
+ private static class TwoDigitFormatter implements NumberPicker.Formatter {
final StringBuilder mBuilder = new StringBuilder();
- final java.util.Formatter mFmt = new java.util.Formatter(mBuilder, java.util.Locale.US);
+ char mZeroDigit;
+ java.util.Formatter mFmt;
final Object[] mArgs = new Object[1];
+ TwoDigitFormatter() {
+ final Locale locale = Locale.getDefault();
+ init(locale);
+ }
+
+ private void init(Locale locale) {
+ mFmt = createFormatter(locale);
+ mZeroDigit = getZeroDigit(locale);
+ }
+
public String format(int value) {
+ final Locale currentLocale = Locale.getDefault();
+ if (mZeroDigit != getZeroDigit(currentLocale)) {
+ init(currentLocale);
+ }
mArgs[0] = value;
mBuilder.delete(0, mBuilder.length());
mFmt.format("%02d", mArgs);
return mFmt.toString();
}
- };
+
+ private static char getZeroDigit(Locale locale) {
+ return LocaleData.get(locale).zeroDigit;
+ }
+
+ private java.util.Formatter createFormatter(Locale locale) {
+ return new java.util.Formatter(mBuilder, locale);
+ }
+ }
+
+ private static final TwoDigitFormatter sTwoDigitFormatter = new TwoDigitFormatter();
+
+ /**
+ * @hide
+ */
+ public static final Formatter getTwoDigitFormatter() {
+ return sTwoDigitFormatter;
+ }
/**
* The increment button.
@@ -1156,7 +1181,7 @@
if (mDisplayedValues == null) {
float maxDigitWidth = 0;
for (int i = 0; i <= 9; i++) {
- final float digitWidth = mSelectorWheelPaint.measureText(String.valueOf(i));
+ final float digitWidth = mSelectorWheelPaint.measureText(formatNumberWithLocale(i));
if (digitWidth > maxDigitWidth) {
maxDigitWidth = digitWidth;
}
@@ -1689,7 +1714,7 @@
}
private String formatNumber(int value) {
- return (mFormatter != null) ? mFormatter.format(value) : String.valueOf(value);
+ return (mFormatter != null) ? mFormatter.format(value) : formatNumberWithLocale(value);
}
private void validateInputTextView(View v) {
@@ -1849,6 +1874,20 @@
}
/**
+ * The numbers accepted by the input text's {@link Filter}
+ */
+ private static final char[] DIGIT_CHARACTERS = new char[] {
+ // Latin digits are the common case
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+ // Arabic-Indic
+ '\u0660', '\u0661', '\u0662', '\u0663', '\u0664', '\u0665', '\u0666', '\u0667', '\u0668'
+ , '\u0669',
+ // Extended Arabic-Indic
+ '\u06f0', '\u06f1', '\u06f2', '\u06f3', '\u06f4', '\u06f5', '\u06f6', '\u06f7', '\u06f8'
+ , '\u06f9'
+ };
+
+ /**
* Filter for accepting only valid indices or prefixes of the string
* representation of valid indices.
*/
@@ -2493,4 +2532,8 @@
return null;
}
}
+
+ static private String formatNumberWithLocale(int value) {
+ return String.format(Locale.getDefault(), "%d", value);
+ }
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 5d65324..90f55bf 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -228,6 +228,14 @@
int viewId;
}
+ /**
+ * Merges the passed RemoteViews actions with this RemoteViews actions according to
+ * action-specific merge rules.
+ *
+ * @param newRv
+ *
+ * @hide
+ */
public void mergeRemoteViews(RemoteViews newRv) {
// We first copy the new RemoteViews, as the process of merging modifies the way the actions
// reference the bitmap cache. We don't want to modify the object as it may need to
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index cb9ed61..e6796cb 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -172,7 +172,7 @@
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setMaxValue(59);
mMinuteSpinner.setOnLongPressUpdateInterval(100);
- mMinuteSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
+ mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
updateInputState();
@@ -500,7 +500,7 @@
if (is24HourView()) {
mHourSpinner.setMinValue(0);
mHourSpinner.setMaxValue(23);
- mHourSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
+ mHourSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
} else {
mHourSpinner.setMinValue(1);
mHourSpinner.setMaxValue(12);
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index f3bef08..09457cc 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -215,36 +215,26 @@
}
public void setCurrentUser(int userId) {
- if (Process.myUid() == Process.SYSTEM_UID) {
- mCurrentUserId = userId;
- } else {
- throw new SecurityException("Only the system process can set the current user");
- }
+ mCurrentUserId = userId;
}
public int getCurrentUser() {
- if (Process.myUid() == Process.SYSTEM_UID) {
- if (mCurrentUserId != UserHandle.USER_NULL) {
- // Someone is regularly updating using setCurrentUser() use that value.
- return mCurrentUserId;
- }
- try {
- return ActivityManagerNative.getDefault().getCurrentUser().id;
- } catch (RemoteException re) {
- return UserHandle.USER_OWNER;
- }
- } else {
- throw new SecurityException("Only the system process can get the current user");
+ if (mCurrentUserId != UserHandle.USER_NULL) {
+ // Someone is regularly updating using setCurrentUser() use that value.
+ return mCurrentUserId;
+ }
+ try {
+ return ActivityManagerNative.getDefault().getCurrentUser().id;
+ } catch (RemoteException re) {
+ return UserHandle.USER_OWNER;
}
}
public void removeUser(int userId) {
- if (Process.myUid() == Process.SYSTEM_UID) {
- try {
- getLockSettings().removeUser(userId);
- } catch (RemoteException re) {
- Log.e(TAG, "Couldn't remove lock settings for user " + userId);
- }
+ try {
+ getLockSettings().removeUser(userId);
+ } catch (RemoteException re) {
+ Log.e(TAG, "Couldn't remove lock settings for user " + userId);
}
}
@@ -591,10 +581,6 @@
// Compute the hash
final byte[] hash = passwordToHash(password);
try {
- if (Process.myUid() != Process.SYSTEM_UID && userHandle != UserHandle.myUserId()) {
- throw new SecurityException(
- "Only the system process can save lock password for another user");
- }
getLockSettings().setLockPassword(hash, userHandle);
DevicePolicyManager dpm = getDevicePolicyManager();
KeyStore keyStore = KeyStore.getInstance();
@@ -1007,8 +993,8 @@
* or null if there is no next alarm.
*/
public String getNextAlarm() {
- String nextAlarm = Settings.System.getString(mContentResolver,
- Settings.System.NEXT_ALARM_FORMATTED);
+ String nextAlarm = Settings.System.getStringForUser(mContentResolver,
+ Settings.System.NEXT_ALARM_FORMATTED, UserHandle.USER_CURRENT);
if (nextAlarm == null || TextUtils.isEmpty(nextAlarm)) {
return null;
}
@@ -1035,8 +1021,9 @@
public int[] getUserDefinedWidgets() {
int appWidgetId = -1;
- String appWidgetIdString = Settings.Secure.getString(
- mContentResolver, Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID);
+ String appWidgetIdString = Settings.Secure.getStringForUser(
+ mContentResolver, Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID,
+ UserHandle.USER_CURRENT);
if (appWidgetIdString != null) {
appWidgetId = (int) Integer.decode(appWidgetIdString);
}
@@ -1046,8 +1033,9 @@
public int getStatusWidget() {
int appWidgetId = -1;
- String appWidgetIdString = Settings.Secure.getString(
- mContentResolver, Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID);
+ String appWidgetIdString = Settings.Secure.getStringForUser(
+ mContentResolver, Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID,
+ UserHandle.USER_CURRENT);
if (appWidgetIdString != null) {
appWidgetId = (int) Integer.decode(appWidgetIdString);
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 661b70c..a8bee4d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -45,6 +45,7 @@
<protected-broadcast android:name="android.intent.action.PACKAGE_NEEDS_VERIFICATION" />
<protected-broadcast android:name="android.intent.action.PACKAGE_VERIFIED" />
<protected-broadcast android:name="android.intent.action.UID_REMOVED" />
+ <protected-broadcast android:name="android.intent.action.QUERY_PACKAGE_RESTART" />
<protected-broadcast android:name="android.intent.action.CONFIGURATION_CHANGED" />
<protected-broadcast android:name="android.intent.action.LOCALE_CHANGED" />
<protected-broadcast android:name="android.intent.action.BATTERY_CHANGED" />
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index cd8b59e..27f4ed4 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Vereis dat gestoorde programdata geënkripteer word."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Deaktiveer kameras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Voorkom die gebruik van alle toestelkameras."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Deaktiveer legstukke op sleutelslot"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Voorkom gebruik van sekere of alle legstukke op sleutelslot."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Tuis"</item>
<item msgid="869923650527136615">"Mobiel"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Deel"</string>
<string name="find" msgid="4808270900322985960">"Vind"</string>
<string name="websearch" msgid="4337157977400211589">"Websoektog"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Liggingsversoek van <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Liggingsversoek"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Versoek deur <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 8c99351..a6bc6dc 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"የተከማቸ ትግበራ ውሂብ የተመሰጠረ እንዲሆን ጠይቅ።"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"ካሜራዎችን አቦዝን"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"የሁሉንም መሣሪያ ካሜራዎች መጠቀም ከልክል።"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"መግብሮችን በቁልፍ ጠባቂ ላይ አሰናክል"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"በቁልፍ ጠባቂ ላይ የአንዳንድ ወይም የሁሉም መግብሮች መጠቀምን ይከለክላል።"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"መነሻ"</item>
<item msgid="869923650527136615">"ተንቀሳቃሽ"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"አጋራ"</string>
<string name="find" msgid="4808270900322985960">"አግኝ"</string>
<string name="websearch" msgid="4337157977400211589">"ድረ ፍለጋ"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"የስፍራ ጥየቃ ቅፅ<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"የስፍራ ጥየቃ"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">" በ፡<xliff:g id="NAME">%1$s</xliff:g>(<xliff:g id="SERVICE">%2$s</xliff:g>) ተጠየቀ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 5175a59..1245d53 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"يمكنك طلب تشفير بيانات التطبيق المخزنة."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"تعطيل الكاميرات"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"يمكنك منح استخدام جميع كاميرات الجهاز."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"تعطيل الأدوات على حارس المفاتيح"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"منع استخدام بعض الأدوات أو كلها على حارس المفاتيح."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"الرئيسية"</item>
<item msgid="869923650527136615">"الجوال"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"مشاركة"</string>
<string name="find" msgid="4808270900322985960">"بحث"</string>
<string name="websearch" msgid="4337157977400211589">"بحث الويب"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"طلب الموقع من <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"طلب الموقع"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"مطلوب من <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index d4bd6a9..557263d 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Запыт на шыфраванне захаваных дадзеных прыкладанняў."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Адключыць камеры"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Забараніць выкарыстанне ўсіх камер прылады."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Адключыць вiджэты на клавіятуры"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Прадухіліць выкарыстанне некаторых ці ўсіх віджэтаў на клавіятуры."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Галоўная старонка"</item>
<item msgid="869923650527136615">"Мабільны"</item>
@@ -1261,6 +1263,10 @@
<string name="share" msgid="1778686618230011964">"Адкрыць доступ"</string>
<string name="find" msgid="4808270900322985960">"Пошук"</string>
<string name="websearch" msgid="4337157977400211589">"Вэб-пошук"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Запыт пра месцазнаходжанне ад карыстальніка <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Запыт месцазнаходжання"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Запыт ад карыстальнiка <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index cbd56f0..3cb175d 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Изисква съхраняваните данни за приложенията да бъдат шифровани."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Деактивиране на камерите"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Предотвратява употребата на камерите на всички устройства."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Приспособ. при защита на клавишите: Деактив."</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Предотвратява използването на някои или всички приспособления при защита на клавишите."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Домашен"</item>
<item msgid="869923650527136615">"Мобилен"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Споделяне"</string>
<string name="find" msgid="4808270900322985960">"Намиране"</string>
<string name="websearch" msgid="4337157977400211589">"Уеб търсене"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Заявка за местоположение от <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Заявка за местоположение"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Заявено от <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index b2f6348..5c51035 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Requereix que les dades de l\'aplicació emmagatzemades estiguin encriptades."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Desactiva les càmeres"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Impedeix l\'ús de totes les càmeres del dispositiu."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Desactivació dels widgets bloquejats"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Impedeix l\'ús de part o de la totalitat dels widgets bloquejats."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Mòbil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Comparteix"</string>
<string name="find" msgid="4808270900322985960">"Cerca"</string>
<string name="websearch" msgid="4337157977400211589">"Cerca al web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Sol·licitud d\'ubicació de <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Sol·licitud d\'ubicació"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Sol·licitat per <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index fc04f64..e644e8e 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Požadovat šifrování uložených dat aplikací."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Vypnout fotoaparáty"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Zakázat používání všech fotoaparátů zařízení."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Zakázat widgety při zamknutí"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Zakázat použití některých nebo všech widgetů při zamknuté klávesnici"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domů"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Sdílet"</string>
<string name="find" msgid="4808270900322985960">"Najít"</string>
<string name="websearch" msgid="4337157977400211589">"Vyhledat na webu"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Požadavek na informace o poloze od uživatele <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Požadavek na informace o poloze"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Požadavek od uživatele <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 292427a..ca81de0 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Kræver, at gemte appdata krypteres."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Deaktiver kameraer"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Bloker brug af alle kameraer på enheden."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Deaktiver widgets på tastaturlåsen"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Undgå brug af nogle eller alle widgets på tastaturlåsen."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hjem"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Del"</string>
<string name="find" msgid="4808270900322985960">"Find"</string>
<string name="websearch" msgid="4337157977400211589">"Websøgning"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Placeringsanmodning fra <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Placeringsanmodning"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Anmodet om af <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 43e8880..9a33c9df 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Anforderung, dass gespeicherte App-Daten verschlüsselt werden"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Kameras deaktivieren"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Nutzung sämtlicher Gerätekameras unterbinden"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Widgets auf Keyguard deakt."</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Verwendung einiger oder aller Wigets auf Keyguard verhindern"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Privat"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Teilen"</string>
<string name="find" msgid="4808270900322985960">"Suchen"</string>
<string name="websearch" msgid="4337157977400211589">"Websuche"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Standortabfrage von <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Standortabfrage"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Angefordert von <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index bbe2ed7..f565001 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Να απαιτείται η κρυπτογράφηση των αποθηκευμένων δεδομένων εφαρμογής"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Απενεργοποίηση φωτογρ. μηχανών"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Να αποτρέπεται η χρήση των φωτογραφικών μηχανών της συσκευής."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Απεν.γραφ.στοιχ.ασφ.πλήκτρ."</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Παρεμπόδιση της χρήσης ορισμένων ή όλων των γραφικών στοιχείων στην ασφάλεια πλήκτρων."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Οικία"</item>
<item msgid="869923650527136615">"Κινητό"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Κοινή χρ."</string>
<string name="find" msgid="4808270900322985960">"Εύρεση"</string>
<string name="websearch" msgid="4337157977400211589">"Αναζήτηση ιστού"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Αίτημα τοποθεσίας από <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Αίτημα τοποθεσίας"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Ζητήθηκε από <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 31a9dac..f61ccf0 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Require that stored app data be encrypted."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Disable cameras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Prevent use of all device cameras."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Disable widgets on keyguard"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Prevent use of some or all widgets on keyguard."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Home"</item>
<item msgid="869923650527136615">"Mobile"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Share"</string>
<string name="find" msgid="4808270900322985960">"Find"</string>
<string name="websearch" msgid="4337157977400211589">"Web Search"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Location request from <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Location request"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Requested by <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 81797e4..3e9e818 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exige que se encripten los datos de la aplicación almacenados."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Desactivar cámaras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Evita el uso de todas las cámaras del dispositivo."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Desactivar los widgets durante el bloqueo del teclado"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Evita el uso de algunos o todos los widgets durante el bloqueo del teclado."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Móvil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Compartir"</string>
<string name="find" msgid="4808270900322985960">"Buscar"</string>
<string name="websearch" msgid="4337157977400211589">"Buscar en la Web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Solicitud de ubicación de <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Solicitud de ubicación"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Solicitado por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index d5e1f87..514bcce 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exige que se encripten los datos de la aplicación almacenados."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Inhabilitar cámaras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Evitar el uso de las cámaras del dispositivo"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Inhabilitar widgets durante el bloqueo"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Evita el uso de algunos widgets, o de todos ellos, durante el bloqueo."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Móvil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Compartir"</string>
<string name="find" msgid="4808270900322985960">"Buscar"</string>
<string name="websearch" msgid="4337157977400211589">"Búsqueda web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Solicitud de ubicación de <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Solicitud de ubicación"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Solicitud enviada por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 333998a..1ba3708 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Nõua salvestatud rakenduse andmete krüpteerimist."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Keela kaamerad"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Vältige seadme kõigi kaamerate kasutamist."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Vidinate keel. klahvilukuga"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Keelake mõne või kõigi vidinate kasutamine klahviluku abil."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Kodu"</item>
<item msgid="869923650527136615">"Mobiil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Jaga"</string>
<string name="find" msgid="4808270900322985960">"Otsi"</string>
<string name="websearch" msgid="4337157977400211589">"Veebiotsing"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Asukohapäring kasutajalt <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Asukohapäring"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Taotleja: <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 4e33f96..dac5256 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"باید اطلاعات ذخیره شده برنامه رمزگذاری شود."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"غیر فعال کردن دوربین ها"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"از استفاده از تمام دوربینهای دستگاه جلوگیری کنید."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"غیرفعال کردن ابزارکهای موجود در محافظ کلید"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"از استفاده از همه ابزارکهای موجود در محافظ کلید یا برخی از آنها جلوگیری شود."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"خانه"</item>
<item msgid="869923650527136615">"تلفن همراه"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"اشتراکگذاری"</string>
<string name="find" msgid="4808270900322985960">"یافتن"</string>
<string name="websearch" msgid="4337157977400211589">"جستجوی وب"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"درخواست موقعیت مکانی از <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"درخواست موقعیت مکانی"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"درخواست شده توسط <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 041e3c9..c7ef211 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Pakota tallennettujen sovellustietojen salaus."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Poista kamerat käytöstä"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Estä laitteen kaikkien kameroiden käyttö."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Näpp.luk: widgetit pois käyt."</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Estä joidenkin tai kaikkien widgetien käyttö näppäinlukolla."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Puhelinnumero (koti)"</item>
<item msgid="869923650527136615">"Mobiili"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Jaa"</string>
<string name="find" msgid="4808270900322985960">"Etsi"</string>
<string name="websearch" msgid="4337157977400211589">"Verkkohaku"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Sijaintipyyntö käyttäjältä <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Sijaintipyyntö"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Pyytänyt <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 58f216a..c3ae5d8 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exiger le chiffrement des données d\'application stockées"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Désactiver les appareils photo"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Empêcher l\'utilisation de tous les appareils photos"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Désact. widgets si protection clavier"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Empêcher l\'utilisation de tout ou partie des widgets lorsque la protection du clavier est activée"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domicile"</item>
<item msgid="869923650527136615">"Mobile"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Partager"</string>
<string name="find" msgid="4808270900322985960">"Rechercher"</string>
<string name="websearch" msgid="4337157977400211589">"Recherche Web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Demande de position de la part de <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Demande de position"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Demande de <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 91748a3..95e6943 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"संग्रहीत एप्लिकेशन डेटा को एन्क्रिप्ट किया जाना आवश्यक है."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"कैमरों को अक्षम करें"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"सभी उपकरण कैमरों का उपयोग रोकें."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"कीगार्ड पर विजेट को अक्षम करें"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"कीगार्ड पर कुछ या सभी विजेट का उपयोग रोकें."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"घर"</item>
<item msgid="869923650527136615">"मोबाइल"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"शेयर करें"</string>
<string name="find" msgid="4808270900322985960">"ढूंढें"</string>
<string name="websearch" msgid="4337157977400211589">"वेब खोज"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> की ओर से स्थान अनुरोध"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"स्थान अनुरोध"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) द्वारा अनुरोधित"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 4b05fa6..1bc54de 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Zahtijevajte da pohranjeni podaci aplikacije budu šifrirani."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Onemogući fotoaparate"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Spriječite upotrebu svih kamera uređaja."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Onemogući widgete na zaštiti"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Spriječi upotrebu nekih ili svih widgeta na zaštiti tipkovnice."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Početna"</item>
<item msgid="869923650527136615">"Mobilni"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Dijeli"</string>
<string name="find" msgid="4808270900322985960">"Pronađi"</string>
<string name="websearch" msgid="4337157977400211589">"Pretraž. weba"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Zahtjev za lokaciju koji upućuje <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Zahtjev za lokaciju"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Zatražio <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 23e7770..9c042f1 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Megköveteli a tárolt alkalmazásadatok titkosítását."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Kamerák letiltása"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Az összes eszközkamera használatának megakadályozása."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Modulletiltás billentyűzárnál"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Néhány vagy az összes modul letiltása billentyűzár esetén."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Otthoni"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Megosztás"</string>
<string name="find" msgid="4808270900322985960">"Keresés"</string>
<string name="websearch" msgid="4337157977400211589">"Webes keresés"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Helykérelem a következőtől: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Helykérelem"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Igénylő <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 65f5909..c32d8ba 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Mengharuskan data apl yang disimpan untuk dienkripsi."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Nonaktifkan kamera"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Mencegah penggunaan semua kamera perangkat."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Nonaktifkan widgets pd keyguad"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Mencegah penggunaan beberapa atau semua widget di keyguard."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Rumah"</item>
<item msgid="869923650527136615">"Seluler"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Bagikan"</string>
<string name="find" msgid="4808270900322985960">"Temukan"</string>
<string name="websearch" msgid="4337157977400211589">"Penelusuran Web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Permintaan lokasi dari <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Permintaan lokasi"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Diminta oleh <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 79e969b..9c198f7 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Richiede la crittografia dei dati applicazione memorizzati."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Disattiva fotocamere"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Impedisci l\'utilizzo di tutte le fotocamere del dispositivo."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Disattiv. widget (blocco tastiera)"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Consente di impedire l\'utilizzo di alcuni o di tutti i widget con il blocco tastiera."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Cellulare"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Condividi"</string>
<string name="find" msgid="4808270900322985960">"Trova"</string>
<string name="websearch" msgid="4337157977400211589">"Ricerca Web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Richiesta posizione da <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Richiesta posizione"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Richiesto da <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 167be2f..ac2cb9c 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"דרוש שנתוני יישומים מאוחסנים יהיו מוצפנים."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"השבת מצלמות"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"מנע שימוש בכל המצלמות שבמכשיר."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"השבת Widgets ב-Keyguard"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"מנע שימוש של חלק מה-Widgets או כולם ב-Keyguard"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"בית"</item>
<item msgid="869923650527136615">"נייד"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"שתף"</string>
<string name="find" msgid="4808270900322985960">"מצא"</string>
<string name="websearch" msgid="4337157977400211589">"חיפוש באינטרנט"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"בקשת מיקום מאת <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"בקשת מיקום"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"מבוקש על ידי <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 827392f..b1a2c28 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"保存したアプリデータが暗号化されるようにします。"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"カメラを無効にする"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"すべての端末カメラを使用できないようにします。"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"キーガード上のウィジェットを無効にする"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"キーガード上の一部またはすべてのウィジェットの使用を禁止します。"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"自宅"</item>
<item msgid="869923650527136615">"携帯"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"共有"</string>
<string name="find" msgid="4808270900322985960">"検索"</string>
<string name="websearch" msgid="4337157977400211589">"ウェブ検索"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g>さんからの現在地情報リクエスト"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"現在地情報へのアクセス許可"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g>さん(<xliff:g id="SERVICE">%2$s</xliff:g>)からのリクエスト"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index a6719ea..97600e1 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"저장한 애플리케이션 데이터를 암호화해야 합니다."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"카메라 사용 안함"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"모든 기기 카메라의 사용 차단"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"키가드에서 위젯 사용 중지"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"키가드에서 일부 또는 전체 위젯을 사용하지 못하도록 합니다."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"집"</item>
<item msgid="869923650527136615">"모바일"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"공유"</string>
<string name="find" msgid="4808270900322985960">"찾기"</string>
<string name="websearch" msgid="4337157977400211589">"웹 검색"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g>의 위치 요청"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"위치 요청"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"요청한 사람: <xliff:g id="NAME">%1$s</xliff:g>(<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 0b16d32..42e57a1 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Reikalauti, kad saugomos programos duomenys būtų šifruoti."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Neleisti fotoaparatų"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Neleisti naudoti visų įrenginio fotoaparatų."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Neleisti vald. klav. apsaug."</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Neleisti naudoti kelių ar visų valdiklių klaviatūros apsaugoje."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Pagrindinis"</item>
<item msgid="869923650527136615">"Mobilusis"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Bendrinti"</string>
<string name="find" msgid="4808270900322985960">"Ieškoti"</string>
<string name="websearch" msgid="4337157977400211589">"Žiniat. paieška"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Vietos užklausa iš <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Vietos užklausa"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Užklausą pateikė <xliff:g id="NAME">%1$s</xliff:g> („<xliff:g id="SERVICE">%2$s</xliff:g>“)"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 3aaa035..f6e066c 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Pieprasa, lai saglabātie lietotnes dati tiktu šifrēti."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Atspējot kameras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Neļauj izmantot nevienu ierīces kameru."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Logrīku atspēj. tast. bloķētājā"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Aizliedziet dažu vai visu logrīku izmantošanu ierīces tastatūras bloķētājā."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Mājas"</item>
<item msgid="869923650527136615">"Mobilais"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Kopīgot"</string>
<string name="find" msgid="4808270900322985960">"Atrast"</string>
<string name="websearch" msgid="4337157977400211589">"Meklēt tīmeklī"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Atrašanās vietas pieprasījums no: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Atrašanās vietas pieprasījums"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Pieprasīja: <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index b8270c9..11e3e7b 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -636,8 +636,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Memerlukan data apl yang disimpan itu disulitkan."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Lumpuhkan kamera"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Menghalang penggunaan semua kamera peranti."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Lumpuhkan widget pada pelindung kekunci"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Cegah penggunaan beberapa atau semua widget pada pelindung kekunci."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Laman Utama"</item>
<item msgid="869923650527136615">"Mudah alih"</item>
@@ -1282,6 +1284,10 @@
<string name="share" msgid="1778686618230011964">"Kongsi"</string>
<string name="find" msgid="4808270900322985960">"Dapatkan"</string>
<string name="websearch" msgid="4337157977400211589">"Carian Web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Permintaan lokasi daripada <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Permintaan lokasi"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Diminta oleh <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 25bf5759..faa424e 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Krev at lagrede appdata krypteres."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Deaktiver kameraer"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Hindre bruk av alle kameraer på enheten."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Deaktivere moduler når tastelåsen er på"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Forhindre bruk av noen eller alle modulene når tastelåsen er på."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hjemmenummer"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Del"</string>
<string name="find" msgid="4808270900322985960">"Finn"</string>
<string name="websearch" msgid="4337157977400211589">"Nettsøk"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Posisjonsforespørsel fra <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Posisjonsforespørsel"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Forespurt av <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 616317a..74c3c47 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Vereisen dat opgeslagen appgegevens kunnen worden gecodeerd."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Camera\'s uitschakelen"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Het gebruik van alle apparaatcamera\'s voorkomen."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Widgets uitschakelen bij toetsblokkering"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Gebruik van sommige of alle widgets uitschakelen bij toetsblokkering."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Thuis"</item>
<item msgid="869923650527136615">"Mobiel"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Delen"</string>
<string name="find" msgid="4808270900322985960">"Vinden"</string>
<string name="websearch" msgid="4337157977400211589">"Online zoeken"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Locatieverzoek van <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Locatieverzoek"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Aangevraagd door <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 51b1708..32c34bc 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Wymaganie szyfrowania przechowywanych danych aplikacji"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Wyłącz aparaty"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Zapobieganie używaniu wszystkich aparatów w urządzeniu"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Wył. widżety przy blokadzie klawiszy"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Uniemożliwiaj użycie części lub wszystkich widżetów przy blokadzie klawiszy."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Dom"</item>
<item msgid="869923650527136615">"Komórka"</item>
@@ -1261,6 +1263,10 @@
<string name="share" msgid="1778686618230011964">"Udostępnij"</string>
<string name="find" msgid="4808270900322985960">"Znajdź"</string>
<string name="websearch" msgid="4337157977400211589">"Wyszukiwarka"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Prośba o lokalizację od użytkownika <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Prośba o lokalizację"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Żądane przez <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index d54b0d6..82e8283 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Solicitar encriptação dos dados da aplicação armazenados."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Desativar câmaras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Evitar a utilização de todas as câmaras do aparelho."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Desativar widgets na proteção do teclado"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Evitar a utilização de alguns ou de todos os widgets na proteção do teclado."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Residência"</item>
<item msgid="869923650527136615">"Móvel"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Partilhar"</string>
<string name="find" msgid="4808270900322985960">"Localizar"</string>
<string name="websearch" msgid="4337157977400211589">"Pesquisar na Web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Pedido de localização de <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Pedido de localização"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Pedido por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 0d15900..e2bc0bd 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exija que os dados armazenados do aplicativo sejam criptografados."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Desativar câmeras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Impeça o uso de todas as câmeras do dispositivo."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Desat. widgets ao bloq. tecl."</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Impede o uso de determinados ou todos os widgets quando o teclado está bloqueado."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Residencial"</item>
<item msgid="869923650527136615">"Celular"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Compartilhar"</string>
<string name="find" msgid="4808270900322985960">"Localizar"</string>
<string name="websearch" msgid="4337157977400211589">"Pesquisa na web do Google"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Solicitação de local de <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Solicitação de local"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Solicitado por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 7647b7d..dc06930 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -1041,9 +1041,9 @@
<skip />
<!-- no translation found for policydesc_disableCamera (2306349042834754597) -->
<skip />
- <!-- no translation found for policylab_disableKeyguardWidgets (1794894613389073926) -->
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
<skip />
- <!-- no translation found for policydesc_disableKeyguardWidgets (7254624892984033592) -->
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
<skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Privat"</item>
@@ -1970,6 +1970,10 @@
<skip />
<!-- no translation found for websearch (4337157977400211589) -->
<skip />
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<!-- no translation found for gpsNotifTicker (5622683912616496172) -->
<skip />
<!-- no translation found for gpsNotifTitle (5446858717157416839) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index dfc3946..88650ee 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Necesită ca datele aplicaţiei stocate să fie criptate."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Dezactivaţi camerele foto"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Împiedicaţi utilizarea camerelor foto de pe dispozitiv."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Protecţia dezact. widgeturile"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Previne utilizarea unora dintre widgeturi sau a tuturor acestora la activarea protecţiei tastaturii."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domiciliu"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Distribuiţi"</string>
<string name="find" msgid="4808270900322985960">"Găsiţi"</string>
<string name="websearch" msgid="4337157977400211589">"Căutare pe web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Solicitare de locaţie de la <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Solicitare de locaţie"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Solicitat de <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 2c19c0d..a6672bb 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Шифровать данные приложений в хранилище."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Отключить камеры"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Запретить использование камер на устройстве."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Отключить виджеты блокировки"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Запретить использование всех или некоторых виджетов блокировки клавиатуры"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Домашний"</item>
<item msgid="869923650527136615">"Мобильный"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Отправить"</string>
<string name="find" msgid="4808270900322985960">"Найти"</string>
<string name="websearch" msgid="4337157977400211589">"Веб-поиск"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Пользователь <xliff:g id="NAME">%s</xliff:g> запрашивает ваше местоположение"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Запрос местоположения"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Запрашивает <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index c2ae712..add5674 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Vyžadovať šifrovanie uložených údajov aplikácií."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Zakázať fotoaparáty"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Zakázať používanie všetkých fotoaparátov zariadenia."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Zakázať miniaplikácie pri uzamknutí"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Zabrániť použitiu niektorých alebo všetkých miniaplikácií pri uzamknutej klávesnici."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domovská stránka"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Zdieľať"</string>
<string name="find" msgid="4808270900322985960">"Nájsť"</string>
<string name="websearch" msgid="4337157977400211589">"Hľadať na webe"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Žiadosť o informácie o polohe od používateľa <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Žiadosť o informácie o polohe"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Žiadosť od používateľa <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index a91452c..58e315d 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Shranjeni podatki programa morajo biti šifrirani."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Onemogoči fotoaparate"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Prepreči uporabo vseh fotoaparatov v napravi."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Onem. pripom. na varov. tipk."</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Preprečevanje uporabe nekaterih ali vseh pripomočkov na varovalu tipkovnice"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Začetna stran"</item>
<item msgid="869923650527136615">"Mobilni"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Deli z dr."</string>
<string name="find" msgid="4808270900322985960">"Najdi"</string>
<string name="websearch" msgid="4337157977400211589">"Spletno iskanje"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Zahteva za lokacijo uporabnika <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Zahteva za lokacijo"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Zahtevala oseba <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index a75fbb0..bc82eee 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Захтева да сачувани подаци апликације буду шифровани."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Онемогућавање камера"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Спречите коришћење свих камера уређаја."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Онемогућавање виџета закључане тастатуре."</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Онемогућавање употребе неког или свих виџета на закључаној тастатури."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Кућа"</item>
<item msgid="869923650527136615">"Мобилни"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Дели"</string>
<string name="find" msgid="4808270900322985960">"Пронађи"</string>
<string name="websearch" msgid="4337157977400211589">"Веб претрага"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Захтев за локацију од корисника <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Захтев за локацију"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Захтева <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 5188349..dff25c2 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Kräv att sparade appdata krypteras."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Inaktivera kameror"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Förhindra att enhetens kameror används."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Inaktivera widgets vid knapplås"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Förhindra användning av vissa eller alla widgets vid knapplås."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hem"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Dela"</string>
<string name="find" msgid="4808270900322985960">"Sök efter"</string>
<string name="websearch" msgid="4337157977400211589">"Webbsökning"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Positionsförfrågan från <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Positionsförfrågan"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Begärt av <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index c4fcc07..2faceae 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Inahitaji kwamba data ya programu iliyohifadhiwa iwe na msimbo fiche."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Lemaza kamera"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Zuia matumizi yote ya kamera za kifaa."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Lemaza wijeti kwenye kingamsingi"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Zuia matumizi ya baadhi ya au wijeti zote kwenye kibodi."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Nyumbani"</item>
<item msgid="869923650527136615">"Simu ya mkononi"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Shiriki"</string>
<string name="find" msgid="4808270900322985960">"Tafuta"</string>
<string name="websearch" msgid="4337157977400211589">"Utafutaji Wavuti"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Ombi la mahali kutoka <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Ombi la mahali"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Imeombwa na <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-sw600dp/config.xml b/core/res/res/values-sw600dp/config.xml
index afb9485..5a007ce 100644
--- a/core/res/res/values-sw600dp/config.xml
+++ b/core/res/res/values-sw600dp/config.xml
@@ -38,7 +38,7 @@
<integer name="config_maxResolverActivityColumns">3</integer>
<!-- Use a larger scaling span for larger screen devices. -->
- <dimen name="config_minScalingSpan">30mm</dimen>
+ <dimen name="config_minScalingSpan">32mm</dimen>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 211333d..d00e5a1 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ข้อมูลของแอปพลิเคชันที่จัดเก็บต้องมีการเข้ารหัส"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"ปิดใช้งานกล้องถ่ายรูป"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"ป้องกันการใช้กล้องถ่ายรูปของอุปกรณ์ทั้งหมด"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"ปิดใช้งานวิดเจ็ตเมื่อล็อกจอ"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"ป้องกันการใช้วิดเจ็ตบางส่วนหรือทั้งหมดเมื่อล็อกหน้าจอ"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"บ้าน"</item>
<item msgid="869923650527136615">"มือถือ"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"แบ่งปัน"</string>
<string name="find" msgid="4808270900322985960">"ค้นหา"</string>
<string name="websearch" msgid="4337157977400211589">"ค้นเว็บ"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"คำขอสถานที่จาก <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"คำขอสถานที่"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"ร้องขอโดย <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 4d45a3e..b7d887d 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Hilinging naka-encrypt ang nakaimbak na data ng app."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Huwag paganahin mga camera"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Pigilan ang paggamit sa lahat ng camera ng device."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"I-disable widget sa keyguard"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Pigilan ang paggamit ng ilan sa o lahat ng widget sa keyguard."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Home"</item>
<item msgid="869923650527136615">"Mobile"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Ibahagi"</string>
<string name="find" msgid="4808270900322985960">"Hanapin"</string>
<string name="websearch" msgid="4337157977400211589">"Paghahanap sa Web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Kahilingan sa lokasyon mula kay <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Kahilingan sa Lokasyon"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Hiniling ni <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 83aeb5a..1eecfd4 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Depolanan uygulama verilerinin şifrelenmiş olmasını zorunlu kılma."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Kameraları devre dışı bırak"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Tüm cihaz kameralarının kullanımını engelleme."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Tuş korumada widget\'ları devre dışı bırak"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Tuş korumada widget\'ların bazılarının veya tümünün kullanılmasını engelleyin."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Ev"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Paylaş"</string>
<string name="find" msgid="4808270900322985960">"Bul"</string>
<string name="websearch" msgid="4337157977400211589">"Google Web Arama"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> kullanıcısından gelen konum isteği"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Konum isteği"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> tarafından istendi (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 9c51a2a..a43ab0a 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Вимагати шифрування даних збереженої програми."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Вимкнути камери"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Запобігати використанню всіх камер пристрою."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Блок. клавіш: вимикати віджети"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Вимикати деякі чи всі віджети під час блокування клавіш."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Дом."</item>
<item msgid="869923650527136615">"Мобільний"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Надіслати"</string>
<string name="find" msgid="4808270900322985960">"Знайти"</string>
<string name="websearch" msgid="4337157977400211589">"Веб-пошук"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Запит про місцезнаходження від користувача <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Запит про місцезнаходження"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Запит зроблено користувачем <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 1515b09..31248ba 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Yêu cầu dữ liệu ứng dụng được lưu trữ phải được mã hóa."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Vô hiệu hóa máy ảnh"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Ngăn sử dụng tất cả máy ảnh của thiết bị."</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Tắt tiện ích trên bàn phím"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Ngăn sử dụng một số hoặc tất cả tiện ích trên bàn phím."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Nhà riêng"</item>
<item msgid="869923650527136615">"ĐT di động"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Chia sẻ"</string>
<string name="find" msgid="4808270900322985960">"Tìm"</string>
<string name="websearch" msgid="4337157977400211589">"Tìm kiếm trên web"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Yêu cầu vị trí từ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Yêu cầu vị trí"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Được yêu cầu bởi <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 48a1315..542ee3e 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"要求对存储的应用数据进行加密。"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"停用相机"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"禁止使用所有设备摄像头。"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"锁屏时禁用小部件"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"锁屏时禁止使用某些或所有小部件。"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"住宅"</item>
<item msgid="869923650527136615">"手机"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"分享"</string>
<string name="find" msgid="4808270900322985960">"查找"</string>
<string name="websearch" msgid="4337157977400211589">"网页搜索"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"来自<xliff:g id="NAME">%s</xliff:g>的定位请求"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"定位请求"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"请求人:<xliff:g id="NAME">%1$s</xliff:g>(<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index f88c6e0..8eb25e8 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"必須為儲存的應用程式資料加密。"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"停用相機"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"禁止使用所有裝置相機。"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"停用鍵盤保護框上的小工具"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"禁止使用鍵盤保護框上的部分或所有小工具。"</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"住家電話"</item>
<item msgid="869923650527136615">"行動電話"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"分享"</string>
<string name="find" msgid="4808270900322985960">"尋找"</string>
<string name="websearch" msgid="4337157977400211589">"網頁搜尋"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> 的地點要求"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"位置要求"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"要求者:<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index af7dbfc..949ff0a 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -623,8 +623,10 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Idinga ukuthi idatha yohlelo lokusebenza olugciniwe ibethelwe"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Khubaza amakhamera"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Vimbela ukusetshenziswa kwamadivaysi wonke wamakhamera"</string>
- <string name="policylab_disableKeyguardWidgets" msgid="1794894613389073926">"Khubaza izinqunjwana kukhiye wokuqapha"</string>
- <string name="policydesc_disableKeyguardWidgets" msgid="7254624892984033592">"Vikela ukusebenza kwesinqunjwana noma kokhe kukhiye wokuqapha."</string>
+ <!-- no translation found for policylab_disableKeyguardFeatures (266329104542638802) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (3467082272186534614) -->
+ <skip />
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Ekhaya"</item>
<item msgid="869923650527136615">"Iselula"</item>
@@ -1260,6 +1262,10 @@
<string name="share" msgid="1778686618230011964">"Yabelana"</string>
<string name="find" msgid="4808270900322985960">"Thola"</string>
<string name="websearch" msgid="4337157977400211589">"USesho lweWebhu"</string>
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
<string name="gpsNotifTicker" msgid="5622683912616496172">"Isicelo sendawo esiphuma ku-<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="gpsNotifTitle" msgid="5446858717157416839">"Isicelo sendawo"</string>
<string name="gpsNotifMessage" msgid="1374718023224000702">"Icelwe ngu-:<xliff:g id="NAME">%1$s</xliff:g><xliff:g id="SERVICE">%2$s</xliff:g>"</string>
diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd
index a111356..10b5a33 100644
--- a/docs/html/guide/topics/manifest/uses-feature-element.jd
+++ b/docs/html/guide/topics/manifest/uses-feature-element.jd
@@ -561,7 +561,7 @@
</td>
</tr>
<tr>
- <td rowspan="4">Camera</td>
+ <td rowspan="5">Camera</td>
<td><code>android.hardware.camera</code></td>
<td>The application uses the device's camera. If the device supports
multiple cameras, the application uses the camera that facing
@@ -583,6 +583,12 @@
<td><code>android.hardware.camera.front</code></td>
<td>Subfeature. The application uses a front-facing camera on the device.</td>
</tr>
+<tr>
+ <td><code>android.hardware.camera.any</code></td>
+ <td>The application uses at least one camera facing in any direction. Use this
+in preference to <code>android.hardware.camera</code> if a back-facing camera is
+not required.</td>
+</tr>
<tr>
<td rowspan="3">Location</td>
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 068eb9e..22f1dec 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -131,6 +131,13 @@
} else {
debugLayersUpdates = false;
}
+
+ if (property_get(PROPERTY_DEBUG_OVERDRAW, property, NULL) > 0) {
+ INIT_LOGD(" Overdraw debug enabled: %s", property);
+ debugOverdraw = !strcmp(property, "true");
+ } else {
+ debugOverdraw = false;
+ }
}
void Caches::terminate() {
@@ -429,7 +436,9 @@
void Caches::startTiling(GLuint x, GLuint y, GLuint width, GLuint height, bool opaque) {
if (extensions.hasTiledRendering()) {
- glStartTilingQCOM(x, y, width, height, opaque ? GL_NONE : GL_COLOR_BUFFER_BIT0_QCOM);
+ glStartTilingQCOM(x, y, width, height,
+ (opaque ? GL_NONE : GL_COLOR_BUFFER_BIT0_QCOM) |
+ (debugOverdraw ? GL_STENCIL_BUFFER_BIT0_QCOM : 0));
}
}
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 50e9e75..48efd10 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -242,6 +242,7 @@
// Misc
GLint maxTextureSize;
bool debugLayersUpdates;
+ bool debugOverdraw;
TextureCache textureCache;
LayerCache layerCache;
diff --git a/libs/hwui/Dither.cpp b/libs/hwui/Dither.cpp
index 5817977..e80b325 100755
--- a/libs/hwui/Dither.cpp
+++ b/libs/hwui/Dither.cpp
@@ -76,8 +76,10 @@
bindDitherTexture();
+ float ditherSize = 1.0f / DITHER_KERNEL_SIZE;
glUniform1i(program->getUniform("ditherSampler"), textureSlot);
- glUniform1f(program->getUniform("ditherSize"), 1.0f / DITHER_KERNEL_SIZE);
+ glUniform1f(program->getUniform("ditherSize"), ditherSize);
+ glUniform1f(program->getUniform("ditherSizeSquared"), ditherSize * ditherSize);
}
}; // namespace uirenderer
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp
index 86667ee..cab68f0 100644
--- a/libs/hwui/FontRenderer.cpp
+++ b/libs/hwui/FontRenderer.cpp
@@ -331,10 +331,14 @@
for (uint32_t i = 0; i < mCacheTextures.size(); i++) {
CacheTexture* cacheTexture = mCacheTextures[i];
if (cacheTexture->isDirty() && cacheTexture->getTexture()) {
- uint32_t xOffset = 0;
+ // Can't copy inner rect; glTexSubimage expects pointer to deal with entire buffer
+ // of data. So expand the dirty rect to the encompassing horizontal stripe.
+ const Rect* dirtyRect = cacheTexture->getDirtyRect();
+ uint32_t x = 0;
+ uint32_t y = dirtyRect->top;
uint32_t width = cacheTexture->getWidth();
- uint32_t height = cacheTexture->getHeight();
- void* textureData = cacheTexture->getTexture();
+ uint32_t height = dirtyRect->getHeight();
+ void* textureData = cacheTexture->getTexture() + y * width;
if (cacheTexture->getTextureId() != lastTextureId) {
lastTextureId = cacheTexture->getTextureId();
@@ -342,12 +346,11 @@
glBindTexture(GL_TEXTURE_2D, lastTextureId);
}
#if DEBUG_FONT_RENDERER
- ALOGD("glTextSubimage for cacheTexture %d: xOff, width height = %d, %d, %d",
- i, xOffset, width, height);
+ ALOGD("glTexSubimage for cacheTexture %d: x, y, width height = %d, %d, %d, %d",
+ i, x, y, width, height);
#endif
- glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, 0, width, height,
+ glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height,
GL_ALPHA, GL_UNSIGNED_BYTE, textureData);
-
cacheTexture->setDirty(false);
}
}
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index bdf1229..a4403c8 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -194,6 +194,8 @@
mTilingSnapshot = mSnapshot;
startTiling(mTilingSnapshot, true);
+ debugOverdraw(true, true);
+
if (!opaque) {
mCaches.enableScissor();
mCaches.setScissor(left, mSnapshot->height - bottom, right - left, bottom - top);
@@ -231,6 +233,7 @@
}
void OpenGLRenderer::finish() {
+ renderOverdraw();
endTiling();
if (!suppressErrorChecks()) {
@@ -265,6 +268,40 @@
}
}
+void OpenGLRenderer::debugOverdraw(bool enable, bool clear) {
+ if (mCaches.debugOverdraw && getTargetFbo() == 0) {
+ if (clear) {
+ mCaches.disableScissor();
+ mCaches.stencil.clear();
+ }
+ if (enable) {
+ mCaches.stencil.enableDebugWrite();
+ } else {
+ mCaches.stencil.disable();
+ }
+ }
+}
+
+void OpenGLRenderer::renderOverdraw() {
+ if (mCaches.debugOverdraw && getTargetFbo() == 0) {
+ const Rect* clip = mTilingSnapshot->clipRect;
+
+ mCaches.enableScissor();
+ mCaches.setScissor(clip->left, mTilingSnapshot->height - clip->bottom,
+ clip->right - clip->left, clip->bottom - clip->top);
+
+ mCaches.stencil.enableDebugTest(2);
+ drawColor(0x2f0000ff, SkXfermode::kSrcOver_Mode);
+ mCaches.stencil.enableDebugTest(3);
+ drawColor(0x2f00ff00, SkXfermode::kSrcOver_Mode);
+ mCaches.stencil.enableDebugTest(4);
+ drawColor(0x3fff0000, SkXfermode::kSrcOver_Mode);
+ mCaches.stencil.enableDebugTest(4, true);
+ drawColor(0x7fff0000, SkXfermode::kSrcOver_Mode);
+ mCaches.stencil.disable();
+ }
+}
+
void OpenGLRenderer::interrupt() {
if (mCaches.currentProgram) {
if (mCaches.currentProgram->isInUse()) {
@@ -276,12 +313,14 @@
mCaches.unbindIndicesBuffer();
mCaches.resetVertexPointers();
mCaches.disbaleTexCoordsVertexArray();
+ debugOverdraw(false, false);
}
void OpenGLRenderer::resume() {
sp<Snapshot> snapshot = (mSnapshot != NULL) ? mSnapshot : mFirstSnapshot;
glViewport(0, 0, snapshot->viewport.getWidth(), snapshot->viewport.getHeight());
glBindFramebuffer(GL_FRAMEBUFFER, snapshot->fbo);
+ debugOverdraw(true, false);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
@@ -302,6 +341,7 @@
sp<Snapshot> snapshot = (mSnapshot != NULL) ? mSnapshot : mFirstSnapshot;
glViewport(0, 0, snapshot->viewport.getWidth(), snapshot->viewport.getHeight());
glBindFramebuffer(GL_FRAMEBUFFER, snapshot->fbo);
+ debugOverdraw(true, false);
mCaches.resetScissor();
dirtyClip();
@@ -407,7 +447,10 @@
OpenGLRenderer* renderer = layer->renderer;
Rect& dirty = layer->dirtyRect;
- if (inFrame) endTiling();
+ if (inFrame) {
+ endTiling();
+ debugOverdraw(false, false);
+ }
renderer->setViewport(layer->layer.getWidth(), layer->layer.getHeight());
renderer->prepareDirty(dirty.left, dirty.top, dirty.right, dirty.bottom, !layer->isBlend());
@@ -724,6 +767,7 @@
mSnapshot->orthoMatrix.load(mOrthoMatrix);
endTiling();
+ debugOverdraw(false, false);
// Bind texture to FBO
glBindFramebuffer(GL_FRAMEBUFFER, layer->getFbo());
layer->bindTexture();
@@ -772,6 +816,7 @@
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
// Unbind current FBO and restore previous one
glBindFramebuffer(GL_FRAMEBUFFER, previous->fbo);
+ debugOverdraw(true, false);
startTiling(previous);
}
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 7d5da68..46e66cb 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -723,6 +723,9 @@
*/
void drawRegionRects(const Region& region);
+ void debugOverdraw(bool enable, bool clear);
+ void renderOverdraw();
+
/**
* Should be invoked every time the glScissor is modified.
*/
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp
index de7afed..c81319e 100644
--- a/libs/hwui/ProgramCache.cpp
+++ b/libs/hwui/ProgramCache.cpp
@@ -53,11 +53,14 @@
"uniform mediump float pointSize;\n";
const char* gVS_Header_Uniforms_HasGradient[3] = {
// Linear
- "uniform mat4 screenSpace;\n",
+ "uniform mat4 screenSpace;\n"
+ "uniform float ditherSize;\n",
// Circular
- "uniform mat4 screenSpace;\n",
+ "uniform mat4 screenSpace;\n"
+ "uniform float ditherSize;\n",
// Sweep
"uniform mat4 screenSpace;\n"
+ "uniform float ditherSize;\n"
};
const char* gVS_Header_Uniforms_HasBitmap =
"uniform mat4 textureTransform;\n"
@@ -75,16 +78,22 @@
"varying highp vec2 outPointBitmapTexCoords;\n";
const char* gVS_Header_Varyings_HasGradient[6] = {
// Linear
- "varying highp vec2 linear;\n",
- "varying float linear;\n",
+ "varying highp vec2 linear;\n"
+ "varying vec2 ditherTexCoords;\n",
+ "varying float linear;\n"
+ "varying vec2 ditherTexCoords;\n",
// Circular
- "varying highp vec2 circular;\n",
- "varying highp vec2 circular;\n",
+ "varying highp vec2 circular;\n"
+ "varying vec2 ditherTexCoords;\n",
+ "varying highp vec2 circular;\n"
+ "varying vec2 ditherTexCoords;\n",
// Sweep
- "varying highp vec2 sweep;\n",
- "varying highp vec2 sweep;\n",
+ "varying highp vec2 sweep;\n"
+ "varying vec2 ditherTexCoords;\n",
+ "varying highp vec2 sweep;\n"
+ "varying vec2 ditherTexCoords;\n",
};
const char* gVS_Main =
"\nvoid main(void) {\n";
@@ -94,16 +103,22 @@
" outTexCoords = (mainTextureTransform * vec4(texCoords, 0.0, 1.0)).xy;\n";
const char* gVS_Main_OutGradient[6] = {
// Linear
- " linear = vec2((screenSpace * position).x, 0.5);\n",
- " linear = (screenSpace * position).x;\n",
+ " linear = vec2((screenSpace * position).x, 0.5);\n"
+ " ditherTexCoords = (gl_Position * ditherSize).xy;\n",
+ " linear = (screenSpace * position).x;\n"
+ " ditherTexCoords = (gl_Position * ditherSize).xy;\n",
// Circular
- " circular = (screenSpace * position).xy;\n",
- " circular = (screenSpace * position).xy;\n",
+ " circular = (screenSpace * position).xy;\n"
+ " ditherTexCoords = (gl_Position * ditherSize).xy;\n",
+ " circular = (screenSpace * position).xy;\n"
+ " ditherTexCoords = (gl_Position * ditherSize).xy;\n",
// Sweep
- " sweep = (screenSpace * position).xy;\n",
- " sweep = (screenSpace * position).xy;\n",
+ " sweep = (screenSpace * position).xy;\n"
+ " ditherTexCoords = (gl_Position * ditherSize).xy;\n",
+ " sweep = (screenSpace * position).xy;\n"
+ " ditherTexCoords = (gl_Position * ditherSize).xy;\n",
};
const char* gVS_Main_OutBitmapTexCoords =
" outBitmapTexCoords = (textureTransform * position).xy * textureDimension;\n";
@@ -144,7 +159,7 @@
const char* gFS_Uniforms_ExternalTextureSampler =
"uniform samplerExternalOES baseSampler;\n";
#define FS_UNIFORMS_DITHER \
- "uniform float ditherSize;\n" \
+ "uniform float ditherSizeSquared;\n" \
"uniform sampler2D ditherSampler;\n"
#define FS_UNIFORMS_GRADIENT \
"uniform vec4 startColor;\n" \
@@ -188,7 +203,7 @@
"((gl_PointCoord - vec2(0.5, 0.5)) * textureDimension * vec2(pointSize, pointSize));\n";
#define FS_MAIN_DITHER \
- "texture2D(ditherSampler, gl_FragCoord.xy * ditherSize).a * ditherSize * ditherSize"
+ "texture2D(ditherSampler, ditherTexCoords).a * ditherSizeSquared"
const char* gFS_Main_AddDitherToGradient =
" gradientColor += " FS_MAIN_DITHER ";\n";
@@ -511,9 +526,6 @@
shader.append(gVS_Main_AALine);
}
}
- if (description.hasGradient) {
- shader.append(gVS_Main_OutGradient[gradientIndex(description)]);
- }
if (description.hasBitmap) {
shader.append(description.isPoint ?
gVS_Main_OutPointBitmapTexCoords :
@@ -524,6 +536,9 @@
}
// Output transformed position
shader.append(gVS_Main_Position);
+ if (description.hasGradient) {
+ shader.append(gVS_Main_OutGradient[gradientIndex(description)]);
+ }
}
// End the shader
shader.append(gVS_Footer);
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 0e3268e..31e60e44 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -37,7 +37,7 @@
// Defines the size in bits of the stencil buffer
// Note: Only 1 bit is required for clipping but more bits are required
// to properly implement the winding fill rule when rasterizing paths
-#define STENCIL_BUFFER_SIZE 0
+#define STENCIL_BUFFER_SIZE 8
/**
* Debug level for app developers. The value is a numeric value defined
@@ -56,11 +56,17 @@
};
/**
- * Used to enable/disbale layers update debugging. The accepted values are
+ * Used to enable/disable layers update debugging. The accepted values are
* "true" and "false". The default value is "false".
*/
#define PROPERTY_DEBUG_LAYERS_UPDATES "debug.hwui.show_layers_updates"
+/**
+ * Used to enable/disable overdraw debugging. The accepted values are
+ * "true" and "false". The default value is "false".
+ */
+#define PROPERTY_DEBUG_OVERDRAW "debug.hwui.show_overdraw"
+
// These properties are defined in mega-bytes
#define PROPERTY_TEXTURE_CACHE_SIZE "ro.hwui.texture_cache_size"
#define PROPERTY_LAYER_CACHE_SIZE "ro.hwui.layer_cache_size"
diff --git a/libs/hwui/Stencil.cpp b/libs/hwui/Stencil.cpp
index 7dfdf0e..84df82b 100644
--- a/libs/hwui/Stencil.cpp
+++ b/libs/hwui/Stencil.cpp
@@ -37,7 +37,7 @@
void Stencil::enableTest() {
if (mState != kTest) {
enable();
- glStencilFunc(GL_EQUAL, 0x0, 0x1);
+ glStencilFunc(GL_EQUAL, 0x1, 0x1);
// We only want to test, let's keep everything
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
@@ -56,8 +56,27 @@
}
}
+void Stencil::enableDebugTest(GLint value, bool greater) {
+ enable();
+ glStencilFunc(greater ? GL_LESS : GL_EQUAL, value, 0xffffffff);
+ // We only want to test, let's keep everything
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ mState = kTest;
+}
+
+void Stencil::enableDebugWrite() {
+ if (mState != kWrite) {
+ enable();
+ glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff);
+ // The test always passes so the first two values are meaningless
+ glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ mState = kWrite;
+ }
+}
+
void Stencil::enable() {
- if (!mState == kDisabled) {
+ if (mState == kDisabled) {
glEnable(GL_STENCIL_TEST);
}
}
diff --git a/libs/hwui/Stencil.h b/libs/hwui/Stencil.h
index 67ccc78..2f8a66a 100644
--- a/libs/hwui/Stencil.h
+++ b/libs/hwui/Stencil.h
@@ -59,6 +59,16 @@
void enableWrite();
/**
+ * The test passes only when equal to the specified value.
+ */
+ void enableDebugTest(GLint value, bool greater = false);
+
+ /**
+ * Used for debugging. The stencil test always passes and increments.
+ */
+ void enableDebugWrite();
+
+ /**
* Disables stencil test and write.
*/
void disable();
diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp
index 4a3af12..f653592 100644
--- a/libs/hwui/font/CacheTexture.cpp
+++ b/libs/hwui/font/CacheTexture.cpp
@@ -171,6 +171,9 @@
}
mDirty = true;
+ const Rect r(*retOriginX - TEXTURE_BORDER_SIZE, *retOriginY - TEXTURE_BORDER_SIZE,
+ *retOriginX + glyphW, *retOriginY + glyphH);
+ mDirtyRect.unionWith(r);
mNumGlyphs++;
#if DEBUG_FONT_RENDERER
diff --git a/libs/hwui/font/CacheTexture.h b/libs/hwui/font/CacheTexture.h
index bf1f4a9..800bfc4 100644
--- a/libs/hwui/font/CacheTexture.h
+++ b/libs/hwui/font/CacheTexture.h
@@ -24,6 +24,7 @@
#include <utils/Log.h>
#include "FontUtil.h"
+#include "Rect.h"
namespace android {
namespace uirenderer {
@@ -149,6 +150,10 @@
return mHeight;
}
+ inline const Rect* getDirtyRect() const {
+ return &mDirtyRect;
+ }
+
inline uint8_t* getTexture() const {
return mTexture;
}
@@ -163,6 +168,9 @@
inline void setDirty(bool dirty) {
mDirty = dirty;
+ if (!dirty) {
+ mDirtyRect.setEmpty();
+ }
}
inline bool getLinearFiltering() const {
@@ -196,6 +204,7 @@
bool mDirty;
uint16_t mNumGlyphs;
CacheBlock* mCacheBlocks;
+ Rect mDirtyRect;
};
}; // namespace uirenderer
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
index bfe0990..8a64755 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_alarm_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_alarm_on.png
index 904a688..e214c00 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_alarm_on.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_alarm_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png
index d5f1e29..8d45fc5 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_orange.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_orange.png
new file mode 100644
index 0000000..29a853d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_orange.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_red.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_red.png
new file mode 100644
index 0000000..988aa12
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_red.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_white.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_white.png
new file mode 100644
index 0000000..64c0d82
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bang_white.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bolt.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bolt.png
new file mode 100644
index 0000000..f7dca8b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_bolt.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
index 2ba62f9..d5650a7 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png
index 464bb6a..841b7d9 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png
index dbdc524..bb58171 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png
index e46d8a3..e20a061 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring_notconnected.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring_notconnected.png
new file mode 100644
index 0000000..49ee056
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring_notconnected.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
index 115bc41..cac7192 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
index 97558ff..f9ecb02 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
index f5f0f74..c7cfa21 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
index 80472e5..2268801 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
index 59af783..16ecb6a 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
index 54be048..fb01687 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
index 2495d07..fbbf225 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
index 7616e17..c151a64 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
index 2bd5949..47e9ad5 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
index ce77c5e..2f622c2 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
index 7d8d284..f5f76c2c 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
index bf0e995..a9dc907 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
index 1782c1c..89d2939 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png
new file mode 100644
index 0000000..3ed973b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
index c97a167..0fb96d9 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
index f999c6e..d8993f8 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
index 1431c3d..b78f474 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
index bdba14e..b720720 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
index b51b0a6..1a4c6d1 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
index e1ac946..96cd8ab 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
index fec4d2b..54bab4d 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
index bf0e995..a9dc907 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
index 1782c1c..89d2939 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
index ea6d235..6e4276f 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
index f999c6e..d8993f8 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
index 53ef509..b8dbdb0 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_alarm_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_alarm_on.png
index fa3d127..d6590e2 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_alarm_on.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_alarm_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png
index 10ae0f0..46beb62 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_orange.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_orange.png
new file mode 100644
index 0000000..41fc2e9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_orange.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_red.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_red.png
new file mode 100644
index 0000000..414be9d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_red.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_white.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_white.png
new file mode 100644
index 0000000..398a08b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bang_white.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bolt.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bolt.png
new file mode 100644
index 0000000..b01d7d0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_bolt.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
index 6246ebe..19e4e40 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png
index 2a530f8..df5987c9 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png
index 9940a65..753e9f7 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png
index 10e325d..3263c55 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring_notconnected.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring_notconnected.png
new file mode 100644
index 0000000..a4e0420
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring_notconnected.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
index c410310..673d2e0 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
index 3bd6001..ef5179f 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
index 9599611..53dc47d 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
index 975ac27..359f445 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
index 3c221cf..7ebebcd 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
index d75ef88..88cf8b6 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
index d367585..db72661 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
index 97b3dda..6022a6a 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
index 4d49307..e493d3b 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
index 2eeff7f..cb52c98 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
index c708e00..14550d5 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
index bfa3f12..4dd6401 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
index 8302636..07ebd9c 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png
new file mode 100644
index 0000000..cf2cc52
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
index 90aa923..dcd2dbd 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
index 889be88..d8eda87 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
index 92f7fcc..d26beb5 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
index 473851b..1de33ba 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
index da2fe94..34c916d 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
index 44d98be..2f7a885 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
index 1a06411..f11cc08 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
index bfa3f12..4dd6401 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
index 8302636..07ebd9c 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
index d392496..72da3e8 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
index 889be88..d8eda87 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
index c05d4d6..f47a193 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_alarm_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_alarm_on.png
index 475dab8..07e749a 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_alarm_on.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_alarm_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png
index 5bceaf5..f9ab581 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_orange.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_orange.png
new file mode 100644
index 0000000..28ec7a8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_orange.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_red.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_red.png
new file mode 100644
index 0000000..432b496
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_red.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_white.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_white.png
new file mode 100644
index 0000000..9ed63f3
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bang_white.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bolt.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bolt.png
new file mode 100644
index 0000000..0c5594d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_bolt.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
index 1302a26..65a873d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png
index b2b563b..653fa3f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png
index b1c8753..4ed4a9e 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png
index f84e614..7eabd10 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring_notconnected.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring_notconnected.png
new file mode 100644
index 0000000..98d7b09
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring_notconnected.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
index 011a0e8..2d3638c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
index ddf4217..471e1fa 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
index e237331..cb1eb0f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
index e074dd3..4311330 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
index 12abe5c..637e079 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
index 8d84c6e..8fdd7ff 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
index 0a42598..8fca5f2 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
index 08634e3..125e33d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
index 10f1d09..acf4752 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
index 0dc8a58..fd5fb17 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
index 752c3f7..c63bbfa 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
index 7a14016..a0d588d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
index af7f76d..341716d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png
new file mode 100644
index 0000000..7f2be8c
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
index 2af3c24..15169b9 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
index a4e0243..b2ad34d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
index 16193e7..89680ce 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
index 005c6c6..eefe7ed 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
index a088e83..a2caca2 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
index 6c2deb2..08c1abd 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
index fdb7a9b..8af72e51 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
index 7a14016..a0d588d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
index af7f76d..341716d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
index 66c3b92..4c6f1ff 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
index a4e0243..b2ad34d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
Binary files differ
diff --git a/packages/SystemUI/res/values-sw600dp/styles.xml b/packages/SystemUI/res/values-sw600dp/styles.xml
index fc1cd88..b7becac 100644
--- a/packages/SystemUI/res/values-sw600dp/styles.xml
+++ b/packages/SystemUI/res/values-sw600dp/styles.xml
@@ -16,6 +16,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="BrightnessDialogContainer" parent="@style/BaseBrightnessDialogContainer">
- <item name="android:layout_width">560dp</item>
+ <item name="android:layout_width">480dp</item>
</style>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index e05c9a5..9ad2d5b 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -414,6 +414,8 @@
<string name="quick_settings_bluetooth_label">Bluetooth</string>
<!-- QuickSettings: Bluetooth (Multiple) [CHAR LIMIT=NONE] -->
<string name="quick_settings_bluetooth_multiple_devices_label">Bluetooth (<xliff:g id="number">%d</xliff:g> Devices)</string>
+ <!-- QuickSettings: Bluetooth (Off) [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_bluetooth_off_label">Bluetooth Off</string>
<!-- QuickSettings: Brightness [CHAR LIMIT=NONE] -->
<string name="quick_settings_brightness_label">Brightness</string>
<!-- QuickSettings: Rotation Unlocked [CHAR LIMIT=NONE] -->
@@ -440,6 +442,8 @@
<string name="quick_settings_wifi_label">Wifi</string>
<!-- QuickSettings: Wifi (No network) [CHAR LIMIT=NONE] -->
<string name="quick_settings_wifi_no_network">No Network</string>
+ <!-- QuickSettings: Wifi (Off) [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_wifi_off_label">Wifi Off</string>
<!-- QuickSettings: Wifi display [CHAR LIMIT=NONE] -->
<string name="quick_settings_wifi_display_label">Wifi Display</string>
<!-- QuickSettings: Wifi display [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 4a37f77..f6fe8d0 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -81,6 +81,7 @@
<item name="android:textSize">12dp</item>
<item name="android:textStyle">normal</item>
<item name="android:textColor">#ff8d908c</item>
+ <item name="android:textAllCaps">true</item>
<item name="android:singleLine">true</item>
<item name="android:ellipsize">marquee</item>
<item name="android:fadingEdge">horizontal</item>
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
index 1bde949..427fe91 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIService.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
@@ -32,6 +32,7 @@
import android.util.Slog;
import android.view.IWindowManager;
import android.view.WindowManagerGlobal;
+import android.view.accessibility.AccessibilityManager;
public class SystemUIService extends Service {
static final String TAG = "SystemUIService";
@@ -67,6 +68,10 @@
@Override
public void onCreate() {
+ // Tell the accessibility layer that this process will
+ // run as the current user, i.e. run across users.
+ AccessibilityManager.createAsSharedAcrossUsers(this);
+
// Pick status bar or system bar.
IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
try {
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index 0caa671..5296ae9 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -538,12 +538,14 @@
}
private void updateUiElements() {
- final int items = mRecentTaskDescriptions.size();
+ final int items = mRecentTaskDescriptions != null
+ ? mRecentTaskDescriptions.size() : 0;
mRecentsContainer.setVisibility(items > 0 ? View.VISIBLE : View.GONE);
// Set description for accessibility
- int numRecentApps = mRecentTaskDescriptions.size();
+ int numRecentApps = mRecentTaskDescriptions != null
+ ? mRecentTaskDescriptions.size() : 0;
String recentAppsAccessibilityDescription;
if (numRecentApps == 0) {
recentAppsAccessibilityDescription =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
index 3fc15e0..37fa524 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -37,6 +37,7 @@
import android.net.Uri;
import android.os.Handler;
import android.os.SystemProperties;
+import android.os.UserHandle;
import android.provider.ContactsContract;
import android.provider.Settings;
import android.view.LayoutInflater;
@@ -205,7 +206,7 @@
private void startSettingsActivity(Intent intent) {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
mBar.collapseAllPanels(true);
- mContext.startActivity(intent);
+ mContext.startActivityAsUser(intent, UserHandle.CURRENT);
}
private void addUserTiles(ViewGroup parent, LayoutInflater inflater) {
@@ -421,7 +422,7 @@
tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0);
Resources r = mContext.getResources();
- String label = null;
+ String label = state.label;
/*
//TODO: Show connected bluetooth device label
Set<BluetoothDevice> btDevices =
@@ -435,9 +436,6 @@
btDevices.size());
}
*/
- if (label == null) {
- label = r.getString(R.string.quick_settings_bluetooth_label);
- }
tv.setText(label);
}
});
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
index cc51aac..b26f326 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
@@ -53,6 +53,9 @@
LocationGpsStateChangeCallback,
BrightnessStateChangeCallback {
+ // Sett InputMethoManagerService
+ private static final String TAG_TRY_SUPPRESSING_IME_SWITCHER = "TrySuppressingImeSwitcher";
+
/** Represents the state of a given attribute. */
static class State {
int iconId;
@@ -268,17 +271,27 @@
mWifiCallback = cb;
mWifiCallback.refreshView(mWifiTile, mWifiState);
}
+ // Remove the double quotes that the SSID may contain
+ public static String removeDoubleQuotes(String string) {
+ if (string == null) return null;
+ final int length = string.length();
+ if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
+ return string.substring(1, length - 1);
+ }
+ return string;
+ }
// NetworkSignalChanged callback
@Override
public void onWifiSignalChanged(boolean enabled, int wifiSignalIconId, String enabledDesc) {
// TODO: If view is in awaiting state, disable
Resources r = mContext.getResources();
+ mWifiState.enabled = enabled;
mWifiState.iconId = enabled && (wifiSignalIconId > 0)
? wifiSignalIconId
: R.drawable.ic_qs_wifi_no_network;
- mWifiState.label = enabled
- ? enabledDesc
- : r.getString(R.string.quick_settings_wifi_no_network);
+ mWifiState.label = enabled && (enabledDesc != null)
+ ? removeDoubleQuotes(enabledDesc)
+ : r.getString(R.string.quick_settings_wifi_off_label);
mWifiCallback.refreshView(mWifiTile, mWifiState);
}
@@ -331,8 +344,10 @@
mBluetoothState.enabled = on;
if (on) {
mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_on;
+ mBluetoothState.label = r.getString(R.string.quick_settings_bluetooth_label);
} else {
mBluetoothState.iconId = R.drawable.ic_qs_bluetooth_off;
+ mBluetoothState.label = r.getString(R.string.quick_settings_bluetooth_off_label);
}
mBluetoothCallback.refreshView(mBluetoothTile, mBluetoothState);
}
@@ -408,12 +423,57 @@
mImeCallback = cb;
mImeCallback.refreshView(mImeTile, mImeState);
}
+ /* This implementation is taken from
+ InputMethodManagerService.needsToShowImeSwitchOngoingNotification(). */
+ private boolean needsToShowImeSwitchOngoingNotification(InputMethodManager imm) {
+ List<InputMethodInfo> imis = imm.getEnabledInputMethodList();
+ final int N = imis.size();
+ if (N > 2) return true;
+ if (N < 1) return false;
+ int nonAuxCount = 0;
+ int auxCount = 0;
+ InputMethodSubtype nonAuxSubtype = null;
+ InputMethodSubtype auxSubtype = null;
+ for(int i = 0; i < N; ++i) {
+ final InputMethodInfo imi = imis.get(i);
+ final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(imi,
+ true);
+ final int subtypeCount = subtypes.size();
+ if (subtypeCount == 0) {
+ ++nonAuxCount;
+ } else {
+ for (int j = 0; j < subtypeCount; ++j) {
+ final InputMethodSubtype subtype = subtypes.get(j);
+ if (!subtype.isAuxiliary()) {
+ ++nonAuxCount;
+ nonAuxSubtype = subtype;
+ } else {
+ ++auxCount;
+ auxSubtype = subtype;
+ }
+ }
+ }
+ }
+ if (nonAuxCount > 1 || auxCount > 1) {
+ return true;
+ } else if (nonAuxCount == 1 && auxCount == 1) {
+ if (nonAuxSubtype != null && auxSubtype != null
+ && (nonAuxSubtype.getLocale().equals(auxSubtype.getLocale())
+ || auxSubtype.overridesImplicitlyEnabledSubtype()
+ || nonAuxSubtype.overridesImplicitlyEnabledSubtype())
+ && nonAuxSubtype.containsExtraValueKey(TAG_TRY_SUPPRESSING_IME_SWITCHER)) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
void onImeWindowStatusChanged(boolean visible) {
InputMethodManager imm =
(InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
List<InputMethodInfo> imis = imm.getInputMethodList();
- mImeState.enabled = visible;
+ mImeState.enabled = (visible && needsToShowImeSwitchOngoingNotification(imm));
mImeState.label = getCurrentInputMethodName(mContext, mContext.getContentResolver(),
imm, imis, mContext.getPackageManager());
mImeCallback.refreshView(mImeTile, mImeState);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java
index ba22f09..b30913a 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java
@@ -28,6 +28,7 @@
import android.content.ContentResolver;
import android.content.Context;
import android.graphics.Typeface;
+import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.text.format.DateFormat;
@@ -178,9 +179,10 @@
private void updateOwnerInfo() {
final ContentResolver res = getContext().getContentResolver();
- final boolean ownerInfoEnabled = Settings.Secure.getInt(res,
- Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1) != 0;
- String text = Settings.Secure.getString(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO);
+ final boolean ownerInfoEnabled = Settings.Secure.getIntForUser(res,
+ Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1, UserHandle.USER_CURRENT) != 0;
+ String text = Settings.Secure.getStringForUser(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO,
+ UserHandle.USER_CURRENT);
if (ownerInfoEnabled && !TextUtils.isEmpty(text)) {
maybeSetUpperCaseText(mOwnerInfoView, text);
mOwnerInfoView.setVisibility(View.VISIBLE);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
index 416a0bb..212a6bb 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
@@ -339,7 +339,7 @@
@Override
public void onDeviceProvisioned() {
- mContext.sendBroadcast(mUserPresentIntent);
+ sendUserPresentBroadcast();
}
@Override
@@ -511,6 +511,9 @@
mUpdateMonitor.registerCallback(mUpdateCallback);
doKeyguardLocked();
}
+ // Most services aren't available until the system reaches the ready state, so we
+ // send it here when the device first boots.
+ maybeSendUserPresentBroadcast();
}
/**
@@ -606,6 +609,17 @@
notifyScreenOnLocked(showListener);
}
}
+ maybeSendUserPresentBroadcast();
+ }
+
+ private void maybeSendUserPresentBroadcast() {
+ if (mSystemReady && mLockPatternUtils.isLockScreenDisabled()
+ && mUserManager.getUsers(true).size() == 1) {
+ // Lock screen is disabled because the user has set the preference to "None".
+ // In this case, send out ACTION_USER_PRESENT here instead of in
+ // handleKeyguardDone()
+ sendUserPresentBroadcast();
+ }
}
/**
@@ -1093,6 +1107,10 @@
}
mWakeLock.release();
+ sendUserPresentBroadcast();
+ }
+
+ private void sendUserPresentBroadcast() {
if (!(mContext instanceof Activity)) {
final UserHandle currentUser = new UserHandle(mLockPatternUtils.getCurrentUser());
mContext.sendBroadcastAsUser(mUserPresentIntent, currentUser);
diff --git a/services/java/com/android/server/AppWidgetService.java b/services/java/com/android/server/AppWidgetService.java
index 385681e..9be7045 100644
--- a/services/java/com/android/server/AppWidgetService.java
+++ b/services/java/com/android/server/AppWidgetService.java
@@ -16,6 +16,7 @@
package com.android.server;
+import android.app.ActivityManagerNative;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
@@ -27,6 +28,7 @@
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
+import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
@@ -193,31 +195,44 @@
}, UserHandle.ALL, userFilter, null, null);
}
+ private int getCallingOrCurrentUserId() {
+ int callingUid = Binder.getCallingUid();
+ if (callingUid == android.os.Process.myUid()) {
+ try {
+ return ActivityManagerNative.getDefault().getCurrentUser().id;
+ } catch (RemoteException re) {
+ return UserHandle.getUserId(callingUid);
+ }
+ } else {
+ return UserHandle.getUserId(callingUid);
+ }
+ }
+
@Override
public int allocateAppWidgetId(String packageName, int hostId) throws RemoteException {
- return getImplForUser(UserHandle.getCallingUserId()).allocateAppWidgetId(
+ return getImplForUser(getCallingOrCurrentUserId()).allocateAppWidgetId(
packageName, hostId);
}
@Override
public void deleteAppWidgetId(int appWidgetId) throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).deleteAppWidgetId(appWidgetId);
+ getImplForUser(getCallingOrCurrentUserId()).deleteAppWidgetId(appWidgetId);
}
@Override
public void deleteHost(int hostId) throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).deleteHost(hostId);
+ getImplForUser(getCallingOrCurrentUserId()).deleteHost(hostId);
}
@Override
public void deleteAllHosts() throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).deleteAllHosts();
+ getImplForUser(getCallingOrCurrentUserId()).deleteAllHosts();
}
@Override
public void bindAppWidgetId(int appWidgetId, ComponentName provider, Bundle options)
throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).bindAppWidgetId(appWidgetId, provider,
+ getImplForUser(getCallingOrCurrentUserId()).bindAppWidgetId(appWidgetId, provider,
options);
}
@@ -225,34 +240,34 @@
public boolean bindAppWidgetIdIfAllowed(
String packageName, int appWidgetId, ComponentName provider, Bundle options)
throws RemoteException {
- return getImplForUser(UserHandle.getCallingUserId()).bindAppWidgetIdIfAllowed(
+ return getImplForUser(getCallingOrCurrentUserId()).bindAppWidgetIdIfAllowed(
packageName, appWidgetId, provider, options);
}
@Override
public boolean hasBindAppWidgetPermission(String packageName) throws RemoteException {
- return getImplForUser(UserHandle.getCallingUserId()).hasBindAppWidgetPermission(
+ return getImplForUser(getCallingOrCurrentUserId()).hasBindAppWidgetPermission(
packageName);
}
@Override
public void setBindAppWidgetPermission(String packageName, boolean permission)
throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).setBindAppWidgetPermission(
+ getImplForUser(getCallingOrCurrentUserId()).setBindAppWidgetPermission(
packageName, permission);
}
@Override
public void bindRemoteViewsService(int appWidgetId, Intent intent, IBinder connection)
throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).bindRemoteViewsService(
+ getImplForUser(getCallingOrCurrentUserId()).bindRemoteViewsService(
appWidgetId, intent, connection);
}
@Override
public int[] startListening(IAppWidgetHost host, String packageName, int hostId,
List<RemoteViews> updatedViews) throws RemoteException {
- return getImplForUser(UserHandle.getCallingUserId()).startListening(host,
+ return getImplForUser(getCallingOrCurrentUserId()).startListening(host,
packageName, hostId, updatedViews);
}
@@ -287,27 +302,27 @@
@Override
public int[] getAppWidgetIds(ComponentName provider) throws RemoteException {
- return getImplForUser(UserHandle.getCallingUserId()).getAppWidgetIds(provider);
+ return getImplForUser(getCallingOrCurrentUserId()).getAppWidgetIds(provider);
}
@Override
public AppWidgetProviderInfo getAppWidgetInfo(int appWidgetId) throws RemoteException {
- return getImplForUser(UserHandle.getCallingUserId()).getAppWidgetInfo(appWidgetId);
+ return getImplForUser(getCallingOrCurrentUserId()).getAppWidgetInfo(appWidgetId);
}
@Override
public RemoteViews getAppWidgetViews(int appWidgetId) throws RemoteException {
- return getImplForUser(UserHandle.getCallingUserId()).getAppWidgetViews(appWidgetId);
+ return getImplForUser(getCallingOrCurrentUserId()).getAppWidgetViews(appWidgetId);
}
@Override
public void updateAppWidgetOptions(int appWidgetId, Bundle options) {
- getImplForUser(UserHandle.getCallingUserId()).updateAppWidgetOptions(appWidgetId, options);
+ getImplForUser(getCallingOrCurrentUserId()).updateAppWidgetOptions(appWidgetId, options);
}
@Override
public Bundle getAppWidgetOptions(int appWidgetId) {
- return getImplForUser(UserHandle.getCallingUserId()).getAppWidgetOptions(appWidgetId);
+ return getImplForUser(getCallingOrCurrentUserId()).getAppWidgetOptions(appWidgetId);
}
static int[] getAppWidgetIds(Provider p) {
@@ -321,43 +336,43 @@
@Override
public List<AppWidgetProviderInfo> getInstalledProviders() throws RemoteException {
- return getImplForUser(UserHandle.getCallingUserId()).getInstalledProviders();
+ return getImplForUser(getCallingOrCurrentUserId()).getInstalledProviders();
}
@Override
public void notifyAppWidgetViewDataChanged(int[] appWidgetIds, int viewId)
throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).notifyAppWidgetViewDataChanged(
+ getImplForUser(getCallingOrCurrentUserId()).notifyAppWidgetViewDataChanged(
appWidgetIds, viewId);
}
@Override
public void partiallyUpdateAppWidgetIds(int[] appWidgetIds, RemoteViews views)
throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).partiallyUpdateAppWidgetIds(
+ getImplForUser(getCallingOrCurrentUserId()).partiallyUpdateAppWidgetIds(
appWidgetIds, views);
}
@Override
public void stopListening(int hostId) throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).stopListening(hostId);
+ getImplForUser(getCallingOrCurrentUserId()).stopListening(hostId);
}
@Override
public void unbindRemoteViewsService(int appWidgetId, Intent intent) throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).unbindRemoteViewsService(
+ getImplForUser(getCallingOrCurrentUserId()).unbindRemoteViewsService(
appWidgetId, intent);
}
@Override
public void updateAppWidgetIds(int[] appWidgetIds, RemoteViews views) throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).updateAppWidgetIds(appWidgetIds, views);
+ getImplForUser(getCallingOrCurrentUserId()).updateAppWidgetIds(appWidgetIds, views);
}
@Override
public void updateAppWidgetProvider(ComponentName provider, RemoteViews views)
throws RemoteException {
- getImplForUser(UserHandle.getCallingUserId()).updateAppWidgetProvider(provider, views);
+ getImplForUser(getCallingOrCurrentUserId()).updateAppWidgetProvider(provider, views);
}
@Override
diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java
index 815ee24..fcc8a06 100644
--- a/services/java/com/android/server/AppWidgetServiceImpl.java
+++ b/services/java/com/android/server/AppWidgetServiceImpl.java
@@ -1627,22 +1627,22 @@
Integer.parseInt(minWidthString, 16));
}
String minHeightString = parser.getAttributeValue(null, "min_height");
- if (minWidthString != null) {
+ if (minHeightString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT,
Integer.parseInt(minHeightString, 16));
}
- String maxWidthString = parser.getAttributeValue(null, "max_height");
- if (minWidthString != null) {
+ String maxWidthString = parser.getAttributeValue(null, "max_width");
+ if (maxWidthString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH,
Integer.parseInt(maxWidthString, 16));
}
String maxHeightString = parser.getAttributeValue(null, "max_height");
- if (minWidthString != null) {
+ if (maxHeightString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT,
Integer.parseInt(maxHeightString, 16));
}
String categoryString = parser.getAttributeValue(null, "host_category");
- if (minWidthString != null) {
+ if (categoryString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
Integer.parseInt(categoryString, 16));
}
diff --git a/services/java/com/android/server/IntentResolver.java b/services/java/com/android/server/IntentResolver.java
index d4769e8..9b19008 100644
--- a/services/java/com/android/server/IntentResolver.java
+++ b/services/java/com/android/server/IntentResolver.java
@@ -46,6 +46,7 @@
final private static String TAG = "IntentResolver";
final private static boolean DEBUG = false;
final private static boolean localLOGV = DEBUG || false;
+ final private static boolean VALIDATE = false;
public void addFilter(F f) {
if (localLOGV) {
@@ -67,16 +68,20 @@
mTypedActionToFilter, " TypedAction: ");
}
- mOldResolver.addFilter(f);
- verifyDataStructures(f);
+ if (VALIDATE) {
+ mOldResolver.addFilter(f);
+ verifyDataStructures(f);
+ }
}
public void removeFilter(F f) {
removeFilterInternal(f);
mFilters.remove(f);
- mOldResolver.removeFilter(f);
- verifyDataStructures(f);
+ if (VALIDATE) {
+ mOldResolver.removeFilter(f);
+ verifyDataStructures(f);
+ }
}
void removeFilterInternal(F f) {
@@ -314,12 +319,14 @@
}
sortResults(finalList);
- List<R> oldList = mOldResolver.queryIntent(intent, resolvedType, defaultOnly, userId);
- if (oldList.size() != finalList.size()) {
- ValidationFailure here = new ValidationFailure();
- here.fillInStackTrace();
- Log.wtf(TAG, "Query result " + intent + " size is " + finalList.size()
- + "; old implementation is " + oldList.size(), here);
+ if (VALIDATE) {
+ List<R> oldList = mOldResolver.queryIntent(intent, resolvedType, defaultOnly, userId);
+ if (oldList.size() != finalList.size()) {
+ ValidationFailure here = new ValidationFailure();
+ here.fillInStackTrace();
+ Log.wtf(TAG, "Query result " + intent + " size is " + finalList.size()
+ + "; old implementation is " + oldList.size(), here);
+ }
}
if (debug) {
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index e7f3599..20c89ad 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -50,9 +50,12 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.Process;
+import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.text.TextUtils.SimpleStringSplitter;
@@ -76,6 +79,7 @@
import com.android.internal.R;
import com.android.internal.content.PackageMonitor;
+import com.android.internal.os.SomeArgs;
import com.android.internal.statusbar.IStatusBarService;
import org.xmlpull.v1.XmlPullParserException;
@@ -89,6 +93,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* This class is instantiated by the system as a system level service and can be
@@ -111,59 +116,23 @@
private static final int OWN_PROCESS_ID = android.os.Process.myPid();
- private static final int MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG = 1;
-
- private static final int MSG_TOGGLE_TOUCH_EXPLORATION = 2;
-
- private static final int MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER = 3;
-
- private static final int MSG_SEND_UPDATE_INPUT_FILTER = 4;
-
private static int sIdCounter = 0;
private static int sNextWindowId;
- final Context mContext;
+ private final Context mContext;
- final Object mLock = new Object();
+ private final Object mLock = new Object();
- final List<Service> mServices = new ArrayList<Service>();
+ private final SimpleStringSplitter mStringColonSplitter =
+ new SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);
- final List<IAccessibilityManagerClient> mClients =
- new ArrayList<IAccessibilityManagerClient>();
+ private final List<AccessibilityServiceInfo> mEnabledServicesForFeedbackTempList =
+ new ArrayList<AccessibilityServiceInfo>();
- final Map<ComponentName, Service> mComponentNameToServiceMap = new HashMap<ComponentName, Service>();
+ private final PackageManager mPackageManager;
- private final List<AccessibilityServiceInfo> mInstalledServices = new ArrayList<AccessibilityServiceInfo>();
-
- private final Set<ComponentName> mEnabledServices = new HashSet<ComponentName>();
-
- private final Set<ComponentName> mTouchExplorationGrantedServices = new HashSet<ComponentName>();
-
- private final SparseArray<AccessibilityConnectionWrapper> mWindowIdToInteractionConnectionWrapperMap =
- new SparseArray<AccessibilityConnectionWrapper>();
-
- private final SparseArray<IBinder> mWindowIdToWindowTokenMap = new SparseArray<IBinder>();
-
- private final SimpleStringSplitter mStringColonSplitter = new SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);
-
- private PackageManager mPackageManager;
-
- private int mHandledFeedbackTypes = 0;
-
- private boolean mIsAccessibilityEnabled;
-
- private AccessibilityInputFilter mInputFilter;
-
- private boolean mHasInputFilter;
-
- private final List<AccessibilityServiceInfo> mEnabledServicesForFeedbackTempList = new ArrayList<AccessibilityServiceInfo>();
-
- private boolean mIsTouchExplorationEnabled;
-
- private boolean mIsScreenMagnificationEnabled;
-
- private final IWindowManager mWindowManager;
+ private final IWindowManager mWindowManagerService;
private final SecurityPolicy mSecurityPolicy;
@@ -175,6 +144,35 @@
private AlertDialog mEnableTouchExplorationDialog;
+ private AccessibilityInputFilter mInputFilter;
+
+ private boolean mHasInputFilter;
+
+ private final RemoteCallbackList<IAccessibilityManagerClient> mGlobalClients =
+ new RemoteCallbackList<IAccessibilityManagerClient>();
+
+ private final SparseArray<AccessibilityConnectionWrapper> mGlobalInteractionConnections =
+ new SparseArray<AccessibilityConnectionWrapper>();
+
+ private final SparseArray<IBinder> mGlobalWindowTokens = new SparseArray<IBinder>();
+
+ private final SparseArray<UserState> mUserStates = new SparseArray<UserState>();
+
+ private int mCurrentUserId = UserHandle.USER_NULL;
+
+ private UserState getCurrentUserStateLocked() {
+ return getUserStateLocked(mCurrentUserId);
+ }
+
+ private UserState getUserStateLocked(int userId) {
+ UserState state = mUserStates.get(userId);
+ if (state == null) {
+ state = new UserState(userId);
+ mUserStates.put(userId, state);
+ }
+ return state;
+ }
+
/**
* Creates a new instance.
*
@@ -183,28 +181,27 @@
public AccessibilityManagerService(Context context) {
mContext = context;
mPackageManager = mContext.getPackageManager();
- mWindowManager = (IWindowManager) ServiceManager.getService(Context.WINDOW_SERVICE);
+ mWindowManagerService = (IWindowManager) ServiceManager.getService(Context.WINDOW_SERVICE);
mSecurityPolicy = new SecurityPolicy();
mMainHandler = new MainHandler(mContext.getMainLooper());
- registerPackageChangeAndBootCompletedBroadcastReceiver();
- registerSettingsContentObservers();
+ registerBroadcastReceivers();
+ new AccessibilityContentObserver(mMainHandler).register(
+ context.getContentResolver());
}
- /**
- * Registers a {@link BroadcastReceiver} for the events of
- * adding/changing/removing/restarting a package and boot completion.
- */
- private void registerPackageChangeAndBootCompletedBroadcastReceiver() {
- Context context = mContext;
-
+ private void registerBroadcastReceivers() {
PackageMonitor monitor = new PackageMonitor() {
@Override
public void onSomePackagesChanged() {
synchronized (mLock) {
+ if (getChangingUserId() != mCurrentUserId) {
+ return;
+ }
// We will update when the automation service dies.
if (mUiAutomationService == null) {
- populateInstalledAccessibilityServiceLocked();
- manageServicesLocked();
+ UserState userState = getCurrentUserStateLocked();
+ populateInstalledAccessibilityServiceLocked(userState);
+ manageServicesLocked(userState);
}
}
}
@@ -212,7 +209,12 @@
@Override
public void onPackageRemoved(String packageName, int uid) {
synchronized (mLock) {
- Iterator<ComponentName> it = mEnabledServices.iterator();
+ final int userId = getChangingUserId();
+ if (userId != mCurrentUserId) {
+ return;
+ }
+ UserState state = getUserStateLocked(userId);
+ Iterator<ComponentName> it = state.mEnabledServices.iterator();
while (it.hasNext()) {
ComponentName comp = it.next();
String compPkg = comp.getPackageName();
@@ -221,13 +223,13 @@
// Update the enabled services setting.
persistComponentNamesToSettingLocked(
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
- mEnabledServices);
+ state.mEnabledServices, userId);
// Update the touch exploration granted services setting.
- mTouchExplorationGrantedServices.remove(comp);
+ state.mTouchExplorationGrantedServices.remove(comp);
persistComponentNamesToSettingLocked(
Settings.Secure.
TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
- mEnabledServices);
+ state.mEnabledServices, userId);
return;
}
}
@@ -238,7 +240,12 @@
public boolean onHandleForceStop(Intent intent, String[] packages,
int uid, boolean doit) {
synchronized (mLock) {
- Iterator<ComponentName> it = mEnabledServices.iterator();
+ final int userId = getChangingUserId();
+ if (userId != mCurrentUserId) {
+ return false;
+ }
+ UserState state = getUserStateLocked(userId);
+ Iterator<ComponentName> it = state.mEnabledServices.iterator();
while (it.hasNext()) {
ComponentName comp = it.next();
String compPkg = comp.getPackageName();
@@ -250,179 +257,97 @@
it.remove();
persistComponentNamesToSettingLocked(
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
- mEnabledServices);
+ state.mEnabledServices, userId);
}
}
}
return false;
}
}
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction() == Intent.ACTION_BOOT_COMPLETED) {
- synchronized (mLock) {
- // We will update when the automation service dies.
- if (mUiAutomationService == null) {
- updateInternalStateLocked();
- }
- }
- return;
- }
- super.onReceive(context, intent);
- }
};
// package changes
- monitor.register(context, null, true);
+ monitor.register(mContext, null, UserHandle.ALL, true);
- // boot completed
- IntentFilter bootFiler = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
- mContext.registerReceiver(monitor, bootFiler, null, monitor.getRegisteredHandler());
+ // user change
+ IntentFilter userFilter = new IntentFilter();
+ userFilter.addAction(Intent.ACTION_USER_SWITCHED);
+ userFilter.addAction(Intent.ACTION_USER_REMOVED);
+
+ mContext.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_USER_SWITCHED.equals(action)) {
+ switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
+ } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
+ removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
+ }
+ }
+ }, userFilter);
}
- /**
- * {@link ContentObserver}s for {@link Settings.Secure#ACCESSIBILITY_ENABLED}
- * and {@link Settings.Secure#ENABLED_ACCESSIBILITY_SERVICES} settings.
- */
- private void registerSettingsContentObservers() {
- ContentResolver contentResolver = mContext.getContentResolver();
-
- Uri accessibilityEnabledUri = Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_ENABLED);
- contentResolver.registerContentObserver(accessibilityEnabledUri, false,
- new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- super.onChange(selfChange);
- synchronized (mLock) {
- // We will update when the automation service dies.
- if (mUiAutomationService == null) {
- handleAccessibilityEnabledSettingChangedLocked();
- updateInputFilterLocked();
- sendStateToClientsLocked();
- }
- }
- }
- });
-
- Uri touchExplorationRequestedUri = Settings.Secure.getUriFor(
- Settings.Secure.TOUCH_EXPLORATION_ENABLED);
- contentResolver.registerContentObserver(touchExplorationRequestedUri, false,
- new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- super.onChange(selfChange);
- synchronized (mLock) {
- // We will update when the automation service dies.
- if (mUiAutomationService == null) {
- handleTouchExplorationEnabledSettingChangedLocked();
- updateInputFilterLocked();
- sendStateToClientsLocked();
- }
- }
- }
- });
-
- Uri accessibilityScreenMagnificationEnabledUri = Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED);
- contentResolver.registerContentObserver(accessibilityScreenMagnificationEnabledUri, false,
- new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- super.onChange(selfChange);
- synchronized (mLock) {
- // We will update when the automation service dies.
- if (mUiAutomationService == null) {
- handleScreenMagnificationEnabledSettingChangedLocked();
- updateInputFilterLocked();
- sendStateToClientsLocked();
- }
- }
- }
- });
-
- Uri accessibilityServicesUri =
- Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
- contentResolver.registerContentObserver(accessibilityServicesUri, false,
- new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- super.onChange(selfChange);
- synchronized (mLock) {
- // We will update when the automation service dies.
- if (mUiAutomationService == null) {
- populateEnabledAccessibilityServicesLocked();
- manageServicesLocked();
- }
- }
- }
- });
-
- Uri touchExplorationGrantedServicesUri = Settings.Secure.getUriFor(
- Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES);
- contentResolver.registerContentObserver(touchExplorationGrantedServicesUri, false,
- new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- super.onChange(selfChange);
- synchronized (mLock) {
- // We will update when the automation service dies.
- if (mUiAutomationService == null) {
- populateTouchExplorationGrantedAccessibilityServicesLocked();
- handleTouchExplorationGrantedAccessibilityServicesChangedLocked();
- }
- }
- }
- });
- }
-
- public int addClient(IAccessibilityManagerClient client) throws RemoteException {
+ public int addClient(IAccessibilityManagerClient client, int userId) {
synchronized (mLock) {
- final IAccessibilityManagerClient addedClient = client;
- mClients.add(addedClient);
- // Clients are registered all the time until their process is
- // killed, therefore we do not have a corresponding unlinkToDeath.
- client.asBinder().linkToDeath(new DeathRecipient() {
- public void binderDied() {
- synchronized (mLock) {
- addedClient.asBinder().unlinkToDeath(this, 0);
- mClients.remove(addedClient);
- }
- }
- }, 0);
- return getState();
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(userId);
+ // If the client is from a process that runs across users such as
+ // the system UI or the system we add it to the global state that
+ // is shared across users.
+ UserState userState = getUserStateLocked(resolvedUserId);
+ if (mSecurityPolicy.isCallerInteractingAcrossUsers(userId)) {
+ mGlobalClients.register(client);
+ return getClientState(userState);
+ } else {
+ userState.mClients.register(client);
+ // If this client is not for the current user we do not
+ // return a state since it is not for the foreground user.
+ // We will send the state to the client on a user switch.
+ return (resolvedUserId == mCurrentUserId) ? getClientState(userState) : 0;
+ }
}
}
- public boolean sendAccessibilityEvent(AccessibilityEvent event) {
+ public boolean sendAccessibilityEvent(AccessibilityEvent event, int userId) {
synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(userId);
+ // This method does nothing for a background user.
+ if (resolvedUserId != mCurrentUserId) {
+ return true; // yes, recycle the event
+ }
if (mSecurityPolicy.canDispatchAccessibilityEvent(event)) {
mSecurityPolicy.updateActiveWindowAndEventSourceLocked(event);
notifyAccessibilityServicesDelayedLocked(event, false);
notifyAccessibilityServicesDelayedLocked(event, true);
}
if (mHasInputFilter && mInputFilter != null) {
- mMainHandler.obtainMessage(MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER,
+ mMainHandler.obtainMessage(MainHandler.MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER,
AccessibilityEvent.obtain(event)).sendToTarget();
}
event.recycle();
- mHandledFeedbackTypes = 0;
+ getUserStateLocked(resolvedUserId).mHandledFeedbackTypes = 0;
}
return (OWN_PROCESS_ID != Binder.getCallingPid());
}
- public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList() {
+ public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId) {
synchronized (mLock) {
- return mInstalledServices;
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(userId);
+ return getUserStateLocked(resolvedUserId).mInstalledServices;
}
}
- public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType) {
- List<AccessibilityServiceInfo> result = mEnabledServicesForFeedbackTempList;
- result.clear();
- List<Service> services = mServices;
+ public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType,
+ int userId) {
+ List<AccessibilityServiceInfo> result = null;
synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(userId);
+ result = mEnabledServicesForFeedbackTempList;
+ result.clear();
+ List<Service> services = getUserStateLocked(resolvedUserId).mServices;
while (feedbackType != 0) {
final int feedbackTypeBit = (1 << Integer.numberOfTrailingZeros(feedbackType));
feedbackType &= ~feedbackTypeBit;
@@ -438,30 +363,51 @@
return result;
}
- public void interrupt() {
+ public void interrupt(int userId) {
+ CopyOnWriteArrayList<Service> services;
synchronized (mLock) {
- for (int i = 0, count = mServices.size(); i < count; i++) {
- Service service = mServices.get(i);
- try {
- service.mServiceInterface.onInterrupt();
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error during sending interrupt request to "
- + service.mService, re);
- }
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(userId);
+ // This method does nothing for a background user.
+ if (resolvedUserId != mCurrentUserId) {
+ return;
+ }
+ services = getUserStateLocked(resolvedUserId).mServices;
+ }
+ for (int i = 0, count = services.size(); i < count; i++) {
+ Service service = services.get(i);
+ try {
+ service.mServiceInterface.onInterrupt();
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG, "Error during sending interrupt request to "
+ + service.mService, re);
}
}
}
public int addAccessibilityInteractionConnection(IWindow windowToken,
- IAccessibilityInteractionConnection connection) throws RemoteException {
+ IAccessibilityInteractionConnection connection, int userId) throws RemoteException {
synchronized (mLock) {
- final IWindow addedWindowToken = windowToken;
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(userId);
final int windowId = sNextWindowId++;
- AccessibilityConnectionWrapper wrapper = new AccessibilityConnectionWrapper(windowId,
- connection);
- wrapper.linkToDeath();
- mWindowIdToWindowTokenMap.put(windowId, addedWindowToken.asBinder());
- mWindowIdToInteractionConnectionWrapperMap.put(windowId, wrapper);
+ // If the window is from a process that runs across users such as
+ // the system UI or the system we add it to the global state that
+ // is shared across users.
+ if (mSecurityPolicy.isCallerInteractingAcrossUsers(userId)) {
+ AccessibilityConnectionWrapper wrapper = new AccessibilityConnectionWrapper(
+ windowId, connection, UserHandle.USER_ALL);
+ wrapper.linkToDeath();
+ mGlobalInteractionConnections.put(windowId, wrapper);
+ mGlobalWindowTokens.put(windowId, windowToken.asBinder());
+ } else {
+ AccessibilityConnectionWrapper wrapper = new AccessibilityConnectionWrapper(
+ windowId, connection, resolvedUserId);
+ wrapper.linkToDeath();
+ UserState userState = getUserStateLocked(resolvedUserId);
+ userState.mInteractionConnections.put(windowId, wrapper);
+ userState.mWindowTokens.put(windowId, windowToken.asBinder());
+ }
if (DEBUG) {
Slog.i(LOG_TAG, "Adding interaction connection to windowId: " + windowId);
}
@@ -469,22 +415,47 @@
}
}
- public void removeAccessibilityInteractionConnection(IWindow windowToken) {
+ public void removeAccessibilityInteractionConnection(IWindow window) {
synchronized (mLock) {
- final int count = mWindowIdToWindowTokenMap.size();
- for (int i = 0; i < count; i++) {
- if (mWindowIdToWindowTokenMap.valueAt(i) == windowToken.asBinder()) {
- final int windowId = mWindowIdToWindowTokenMap.keyAt(i);
- AccessibilityConnectionWrapper wrapper =
- mWindowIdToInteractionConnectionWrapperMap.get(windowId);
- wrapper.unlinkToDeath();
- removeAccessibilityInteractionConnectionLocked(windowId);
+ mSecurityPolicy.resolveCallingUserIdEnforcingPermissionsLocked(
+ UserHandle.getCallingUserId());
+ IBinder token = window.asBinder();
+ final boolean removedGlobal =
+ removeAccessibilityInteractionConnectionInternalLocked(
+ token, mGlobalWindowTokens, mGlobalInteractionConnections);
+ if (removedGlobal) {
+ return;
+ }
+ final int userCount = mUserStates.size();
+ for (int i = 0; i < userCount; i++) {
+ UserState userState = mUserStates.valueAt(i);
+ final boolean removedForUser =
+ removeAccessibilityInteractionConnectionInternalLocked(
+ token, userState.mWindowTokens, userState.mInteractionConnections);
+ if (removedForUser) {
return;
}
}
}
}
+ private boolean removeAccessibilityInteractionConnectionInternalLocked(IBinder windowToken,
+ SparseArray<IBinder> windowTokens,
+ SparseArray<AccessibilityConnectionWrapper> interactionConnections) {
+ final int count = windowTokens.size();
+ for (int i = 0; i < count; i++) {
+ if (windowTokens.valueAt(i) == windowToken) {
+ final int windowId = windowTokens.keyAt(i);
+ windowTokens.removeAt(i);
+ AccessibilityConnectionWrapper wrapper = interactionConnections.get(windowId);
+ wrapper.unlinkToDeath();
+ interactionConnections.remove(windowId);
+ return true;
+ }
+ }
+ return false;
+ }
+
public void registerUiTestAutomationService(IAccessibilityServiceClient serviceClient,
AccessibilityServiceInfo accessibilityServiceInfo) {
mSecurityPolicy.enforceCallingPermission(Manifest.permission.RETRIEVE_WINDOW_CONTENT,
@@ -495,21 +466,18 @@
// If an automation services is connected to the system all services are stopped
// so the automation one is the only one running. Settings are not changed so when
// the automation service goes away the state is restored from the settings.
+ UserState userState = getCurrentUserStateLocked();
+ unbindAllServicesLocked(userState);
- // Disable all services.
- final int runningServiceCount = mServices.size();
- for (int i = 0; i < runningServiceCount; i++) {
- Service runningService = mServices.get(i);
- runningService.unbind();
- }
// If necessary enable accessibility and announce that.
- if (!mIsAccessibilityEnabled) {
- mIsAccessibilityEnabled = true;
- sendStateToClientsLocked();
+ if (!userState.mIsAccessibilityEnabled) {
+ userState.mIsAccessibilityEnabled = true;
+ scheduleSendStateToClientsLocked(userState);
}
}
// Hook the automation service up.
- mUiAutomationService = new Service(componentName, accessibilityServiceInfo, true);
+ mUiAutomationService = new Service(mCurrentUserId, componentName,
+ accessibilityServiceInfo, true);
mUiAutomationService.onServiceConnected(componentName, serviceClient.asBinder());
}
@@ -572,30 +540,80 @@
* @param outBounds The output to which to write the bounds.
*/
boolean getActiveWindowBounds(Rect outBounds) {
+ IBinder token;
synchronized (mLock) {
final int windowId = mSecurityPolicy.mActiveWindowId;
- IBinder token = mWindowIdToWindowTokenMap.get(windowId);
- try {
- WindowInfo info = mWindowManager.getWindowInfo(token);
- if (info != null) {
- outBounds.set(info.frame);
- return true;
- }
- } catch (RemoteException re) {
- /* ignore */
+ token = mGlobalWindowTokens.get(windowId);
+ if (token == null) {
+ token = getCurrentUserStateLocked().mWindowTokens.get(windowId);
}
- return false;
+ }
+ WindowInfo info = null;
+ try {
+ info = mWindowManagerService.getWindowInfo(token);
+ if (info != null) {
+ outBounds.set(info.frame);
+ return true;
+ }
+ } catch (RemoteException re) {
+ /* ignore */
+ } finally {
+ if (info != null) {
+ info.recycle();
+ }
+ }
+ return false;
+ }
+
+ int getActiveWindowId() {
+ return mSecurityPolicy.mActiveWindowId;
+ }
+
+ private void switchUser(int userId) {
+ synchronized (mLock) {
+ if (userId == mCurrentUserId) {
+ return;
+ }
+
+ // Disconnect from services for the old user.
+ UserState oldUserState = getUserStateLocked(mCurrentUserId);
+ unbindAllServicesLocked(oldUserState);
+
+ // Disable the local managers for the old user.
+ if (oldUserState.mClients.getRegisteredCallbackCount() > 0) {
+ mMainHandler.obtainMessage(MainHandler.MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER,
+ oldUserState.mUserId, 0).sendToTarget();
+ }
+
+ // The user changed.
+ mCurrentUserId = userId;
+
+ // Recreate the internal state for the new user.
+ mMainHandler.obtainMessage(MainHandler.MSG_SEND_RECREATE_INTERNAL_STATE,
+ mCurrentUserId, 0).sendToTarget();
+
+ // Re-register the test automation service after the new state is recreated.
+ if (mUiAutomationService != null) {
+ unregisterUiTestAutomationService(mUiAutomationService.mServiceInterface);
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = mUiAutomationService.mServiceInterface;
+ args.arg2 = mUiAutomationService.mAccessibilityServiceInfo;
+ mMainHandler.obtainMessage(MainHandler.MSG_REGISTER_UI_TEST_AUTOMATION_SERVICE,
+ args).sendToTarget();
+ }
}
}
- public int getActiveWindowId() {
- return mSecurityPolicy.mActiveWindowId;
+ private void removeUser(int userId) {
+ synchronized (mLock) {
+ mUserStates.remove(userId);
+ }
}
private Service getQueryBridge() {
if (mQueryBridge == null) {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
- mQueryBridge = new Service(null, info, true);
+ mQueryBridge = new Service(UserHandle.USER_NULL, null, info, true);
}
return mQueryBridge;
}
@@ -610,8 +628,9 @@
// gestures to avoid user frustration when different
// behavior is observed from different combinations of
// enabled accessibility services.
- for (int i = mServices.size() - 1; i >= 0; i--) {
- Service service = mServices.get(i);
+ UserState state = getCurrentUserStateLocked();
+ for (int i = state.mServices.size() - 1; i >= 0; i--) {
+ Service service = state.mServices.get(i);
if (service.mRequestTouchExplorationMode && service.mIsDefault == isDefault) {
service.notifyGesture(gestureId);
return true;
@@ -624,29 +643,36 @@
* Removes an AccessibilityInteractionConnection.
*
* @param windowId The id of the window to which the connection is targeted.
+ * @param userId The id of the user owning the connection. UserHandle.USER_ALL
+ * if global.
*/
- private void removeAccessibilityInteractionConnectionLocked(int windowId) {
- mWindowIdToWindowTokenMap.remove(windowId);
- mWindowIdToInteractionConnectionWrapperMap.remove(windowId);
+ private void removeAccessibilityInteractionConnectionLocked(int windowId, int userId) {
+ if (userId == UserHandle.USER_ALL) {
+ mGlobalWindowTokens.remove(windowId);
+ mGlobalInteractionConnections.remove(windowId);
+ } else {
+ UserState userState = getCurrentUserStateLocked();
+ userState.mWindowTokens.remove(windowId);
+ userState.mInteractionConnections.remove(windowId);
+ }
if (DEBUG) {
Slog.i(LOG_TAG, "Removing interaction connection to windowId: " + windowId);
}
}
- /**
- * Populates the cached list of installed {@link AccessibilityService}s.
- */
- private void populateInstalledAccessibilityServiceLocked() {
- mInstalledServices.clear();
+ private void populateInstalledAccessibilityServiceLocked(UserState userState) {
+ userState.mInstalledServices.clear();
- List<ResolveInfo> installedServices = mPackageManager.queryIntentServices(
+ List<ResolveInfo> installedServices = mPackageManager.queryIntentServicesAsUser(
new Intent(AccessibilityService.SERVICE_INTERFACE),
- PackageManager.GET_SERVICES | PackageManager.GET_META_DATA);
+ PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
+ mCurrentUserId);
for (int i = 0, count = installedServices.size(); i < count; i++) {
ResolveInfo resolveInfo = installedServices.get(i);
ServiceInfo serviceInfo = resolveInfo.serviceInfo;
- if (!android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE.equals(serviceInfo.permission)) {
+ if (!android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE.equals(
+ serviceInfo.permission)) {
Slog.w(LOG_TAG, "Skipping accessibilty service " + new ComponentName(
serviceInfo.packageName, serviceInfo.name).flattenToShortString()
+ ": it does not require the permission "
@@ -656,7 +682,7 @@
AccessibilityServiceInfo accessibilityServiceInfo;
try {
accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext);
- mInstalledServices.add(accessibilityServiceInfo);
+ userState.mInstalledServices.add(accessibilityServiceInfo);
} catch (XmlPullParserException xppe) {
Slog.e(LOG_TAG, "Error while initializing AccessibilityServiceInfo", xppe);
} catch (IOException ioe) {
@@ -665,16 +691,19 @@
}
}
- private void populateEnabledAccessibilityServicesLocked() {
+ private void populateEnabledAccessibilityServicesLocked(UserState userState) {
populateComponentNamesFromSettingLocked(
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
- mEnabledServices);
+ userState.mUserId,
+ userState.mEnabledServices);
}
- private void populateTouchExplorationGrantedAccessibilityServicesLocked() {
+ private void populateTouchExplorationGrantedAccessibilityServicesLocked(
+ UserState userState) {
populateComponentNamesFromSettingLocked(
Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
- mTouchExplorationGrantedServices);
+ userState.mUserId,
+ userState.mTouchExplorationGrantedServices);
}
/**
@@ -687,12 +716,13 @@
private void notifyAccessibilityServicesDelayedLocked(AccessibilityEvent event,
boolean isDefault) {
try {
- for (int i = 0, count = mServices.size(); i < count; i++) {
- Service service = mServices.get(i);
+ UserState state = getCurrentUserStateLocked();
+ for (int i = 0, count = state.mServices.size(); i < count; i++) {
+ Service service = state.mServices.get(i);
if (service.mIsDefault == isDefault) {
- if (canDispathEventLocked(service, event, mHandledFeedbackTypes)) {
- mHandledFeedbackTypes |= service.mFeedbackType;
+ if (canDispathEventLocked(service, event, state.mHandledFeedbackTypes)) {
+ state.mHandledFeedbackTypes |= service.mFeedbackType;
service.notifyAccessibilityEvent(event);
}
}
@@ -706,19 +736,21 @@
}
/**
- * Adds a service.
+ * Adds a service for a user.
*
* @param service The service to add.
+ * @param userId The user id.
*/
- private void tryAddServiceLocked(Service service) {
+ private void tryAddServiceLocked(Service service, int userId) {
try {
- if (mServices.contains(service) || !service.isConfigured()) {
+ UserState userState = getUserStateLocked(userId);
+ if (userState.mServices.contains(service) || !service.isConfigured()) {
return;
}
service.linkToOwnDeath();
- mServices.add(service);
- mComponentNameToServiceMap.put(service.mComponentName, service);
- updateInputFilterLocked();
+ userState.mServices.add(service);
+ userState.mComponentNameToServiceMap.put(service.mComponentName, service);
+ updateInputFilterLocked(userState);
tryEnableTouchExplorationLocked(service);
} catch (RemoteException e) {
/* do nothing */
@@ -732,14 +764,15 @@
* @return True if the service was removed, false otherwise.
*/
private boolean tryRemoveServiceLocked(Service service) {
- final boolean removed = mServices.remove(service);
+ UserState userState = getUserStateLocked(service.mUserId);
+ final boolean removed = userState.mServices.remove(service);
if (!removed) {
return false;
}
- mComponentNameToServiceMap.remove(service.mComponentName);
+ userState.mComponentNameToServiceMap.remove(service.mComponentName);
service.unlinkToOwnDeath();
service.dispose();
- updateInputFilterLocked();
+ updateInputFilterLocked(userState);
tryDisableTouchExplorationLocked(service);
return removed;
}
@@ -791,23 +824,23 @@
/**
* Manages services by starting enabled ones and stopping disabled ones.
*/
- private void manageServicesLocked() {
- final int enabledInstalledServicesCount = updateServicesStateLocked(mInstalledServices,
- mEnabledServices);
+ private void manageServicesLocked(UserState userState) {
+ final int enabledInstalledServicesCount = updateServicesStateLocked(userState);
// No enabled installed services => disable accessibility to avoid
// sending accessibility events with no recipient across processes.
- if (mIsAccessibilityEnabled && enabledInstalledServicesCount == 0) {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_ENABLED, 0);
+ if (userState.mIsAccessibilityEnabled && enabledInstalledServicesCount == 0) {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0, userState.mUserId);
}
}
/**
- * Unbinds all bound services.
+ * Unbinds all bound services for a user.
+ *
+ * @param userState The user state.
*/
- private void unbindAllServicesLocked() {
- List<Service> services = mServices;
-
+ private void unbindAllServicesLocked(UserState userState) {
+ List<Service> services = userState.mServices;
for (int i = 0, count = services.size(); i < count; i++) {
Service service = services.get(i);
if (service.unbind()) {
@@ -819,17 +852,17 @@
/**
* Populates a set with the {@link ComponentName}s stored in a colon
- * separated value setting.
+ * separated value setting for a given user.
*
* @param settingName The setting to parse.
+ * @param userId The user id.
* @param outComponentNames The output component names.
*/
- private void populateComponentNamesFromSettingLocked(String settingName,
+ private void populateComponentNamesFromSettingLocked(String settingName, int userId,
Set<ComponentName> outComponentNames) {
+ String settingValue = Settings.Secure.getStringForUser(mContext.getContentResolver(),
+ settingName, userId);
outComponentNames.clear();
-
- String settingValue = Settings.Secure.getString(mContext.getContentResolver(), settingName);
-
if (settingValue != null) {
TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
splitter.setString(settingValue);
@@ -854,7 +887,7 @@
* @param componentNames The component names.
*/
private void persistComponentNamesToSettingLocked(String settingName,
- Set<ComponentName> componentNames) {
+ Set<ComponentName> componentNames, int userId) {
StringBuilder builder = new StringBuilder();
for (ComponentName componentName : componentNames) {
if (builder.length() > 0) {
@@ -862,34 +895,34 @@
}
builder.append(componentName.flattenToShortString());
}
- Settings.Secure.putString(mContext.getContentResolver(), settingName, builder.toString());
+ Settings.Secure.putStringForUser(mContext.getContentResolver(),
+ settingName, builder.toString(), userId);
}
/**
* Updates the state of each service by starting (or keeping running) enabled ones and
* stopping the rest.
*
- * @param installedServices All installed {@link AccessibilityService}s.
- * @param enabledServices The {@link ComponentName}s of the enabled services.
+ * @param userState The user state for which to do that.
* @return The number of enabled installed services.
*/
- private int updateServicesStateLocked(List<AccessibilityServiceInfo> installedServices,
- Set<ComponentName> enabledServices) {
-
- Map<ComponentName, Service> componentNameToServiceMap = mComponentNameToServiceMap;
- boolean isEnabled = mIsAccessibilityEnabled;
+ private int updateServicesStateLocked(UserState userState) {
+ Map<ComponentName, Service> componentNameToServiceMap =
+ userState.mComponentNameToServiceMap;
+ boolean isEnabled = userState.mIsAccessibilityEnabled;
int enabledInstalledServices = 0;
- for (int i = 0, count = installedServices.size(); i < count; i++) {
- AccessibilityServiceInfo installedService = installedServices.get(i);
+ for (int i = 0, count = userState.mInstalledServices.size(); i < count; i++) {
+ AccessibilityServiceInfo installedService = userState.mInstalledServices.get(i);
ComponentName componentName = ComponentName.unflattenFromString(
installedService.getId());
Service service = componentNameToServiceMap.get(componentName);
if (isEnabled) {
- if (enabledServices.contains(componentName)) {
+ if (userState.mEnabledServices.contains(componentName)) {
if (service == null) {
- service = new Service(componentName, installedService, false);
+ service = new Service(userState.mUserId, componentName,
+ installedService, false);
}
service.bind();
enabledInstalledServices++;
@@ -908,145 +941,206 @@
return enabledInstalledServices;
}
- /**
- * Sends the state to the clients.
- */
- private void sendStateToClientsLocked() {
- final int state = getState();
- for (int i = 0, count = mClients.size(); i < count; i++) {
+ private void scheduleSendStateToClientsLocked(UserState userState) {
+ if (mGlobalClients.getRegisteredCallbackCount() > 0
+ || userState.mClients.getRegisteredCallbackCount() > 0) {
+ final int clientState = getClientState(userState);
+ mMainHandler.obtainMessage(MainHandler.MSG_SEND_STATE_TO_CLIENTS,
+ clientState, userState.mUserId) .sendToTarget();
+ }
+ }
+
+ private void updateInputFilterLocked(UserState userState) {
+ boolean setInputFilter = false;
+ AccessibilityInputFilter inputFilter = null;
+ synchronized (mLock) {
+ if ((userState.mIsAccessibilityEnabled && userState.mIsTouchExplorationEnabled)
+ || userState.mIsDisplayMagnificationEnabled) {
+ if (!mHasInputFilter) {
+ mHasInputFilter = true;
+ if (mInputFilter == null) {
+ mInputFilter = new AccessibilityInputFilter(mContext,
+ AccessibilityManagerService.this);
+ }
+ inputFilter = mInputFilter;
+ setInputFilter = true;
+ }
+ int flags = 0;
+ if (userState.mIsDisplayMagnificationEnabled) {
+ flags |= AccessibilityInputFilter.FLAG_FEATURE_SCREEN_MAGNIFIER;
+ }
+ if (userState.mIsTouchExplorationEnabled) {
+ flags |= AccessibilityInputFilter.FLAG_FEATURE_TOUCH_EXPLORATION;
+ }
+ mInputFilter.setEnabledFeatures(flags);
+ } else {
+ if (mHasInputFilter) {
+ mHasInputFilter = false;
+ mInputFilter.setEnabledFeatures(0);
+ inputFilter = null;
+ setInputFilter = true;
+ }
+ }
+ }
+ if (setInputFilter) {
try {
- mClients.get(i).setState(state);
+ mWindowManagerService.setInputFilter(inputFilter);
} catch (RemoteException re) {
- mClients.remove(i);
- count--;
- i--;
+ /* ignore */
}
}
}
- /**
- * Gets the current state as a set of flags.
- *
- * @return The state.
- */
- private int getState() {
- int state = 0;
- if (mIsAccessibilityEnabled) {
- state |= AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED;
+ private void showEnableTouchExplorationDialog(final Service service) {
+ String label = service.mResolveInfo.loadLabel(
+ mContext.getPackageManager()).toString();
+ synchronized (mLock) {
+ final UserState state = getCurrentUserStateLocked();
+ if (state.mIsTouchExplorationEnabled) {
+ return;
+ }
+ if (mEnableTouchExplorationDialog != null
+ && mEnableTouchExplorationDialog.isShowing()) {
+ return;
+ }
+ mEnableTouchExplorationDialog = new AlertDialog.Builder(mContext)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setPositiveButton(android.R.string.ok, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // The user allowed the service to toggle touch exploration.
+ state.mTouchExplorationGrantedServices.add(service.mComponentName);
+ persistComponentNamesToSettingLocked(
+ Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
+ state.mTouchExplorationGrantedServices, state.mUserId);
+ // Enable touch exploration.
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1,
+ service.mUserId);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ })
+ .setTitle(R.string.enable_explore_by_touch_warning_title)
+ .setMessage(mContext.getString(
+ R.string.enable_explore_by_touch_warning_message, label))
+ .create();
+ mEnableTouchExplorationDialog.getWindow().setType(
+ WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG);
+ mEnableTouchExplorationDialog.setCanceledOnTouchOutside(true);
+ mEnableTouchExplorationDialog.show();
+ }
+ }
+
+ private int getClientState(UserState userState) {
+ int clientState = 0;
+ if (userState.mIsAccessibilityEnabled) {
+ clientState |= AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED;
}
// Touch exploration relies on enabled accessibility.
- if (mIsAccessibilityEnabled && mIsTouchExplorationEnabled) {
- state |= AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED;
+ if (userState.mIsAccessibilityEnabled && userState.mIsTouchExplorationEnabled) {
+ clientState |= AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED;
}
- return state;
+ return clientState;
}
- /**
- * Updates the state of the input filter.
- */
- private void updateInputFilterLocked() {
- mMainHandler.obtainMessage(MSG_SEND_UPDATE_INPUT_FILTER).sendToTarget();
+ private void recreateInternalStateLocked(UserState userState) {
+ populateInstalledAccessibilityServiceLocked(userState);
+ populateEnabledAccessibilityServicesLocked(userState);
+ populateTouchExplorationGrantedAccessibilityServicesLocked(userState);
+
+ handleTouchExplorationEnabledSettingChangedLocked(userState);
+ handleDisplayMagnificationEnabledSettingChangedLocked(userState);
+ handleAccessibilityEnabledSettingChangedLocked(userState);
+
+ updateInputFilterLocked(userState);
+ scheduleSendStateToClientsLocked(userState);
}
- /**
- * Updated the internal state of this service to match the current settings.
- */
- private void updateInternalStateLocked() {
- populateInstalledAccessibilityServiceLocked();
- populateEnabledAccessibilityServicesLocked();
- populateTouchExplorationGrantedAccessibilityServicesLocked();
-
- handleTouchExplorationEnabledSettingChangedLocked();
- handleScreenMagnificationEnabledSettingChangedLocked();
- handleAccessibilityEnabledSettingChangedLocked();
-
- updateInputFilterLocked();
- sendStateToClientsLocked();
- }
-
- /**
- * Updated the state based on the accessibility enabled setting.
- */
- private void handleAccessibilityEnabledSettingChangedLocked() {
- mIsAccessibilityEnabled = Settings.Secure.getInt(
- mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
- if (mIsAccessibilityEnabled) {
- manageServicesLocked();
+ private void handleAccessibilityEnabledSettingChangedLocked(UserState userState) {
+ userState.mIsAccessibilityEnabled = Settings.Secure.getIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0, userState.mUserId) == 1;
+ if (userState.mIsAccessibilityEnabled ) {
+ manageServicesLocked(userState);
} else {
- unbindAllServicesLocked();
+ unbindAllServicesLocked(userState);
}
}
- /**
- * Updates the state based on the touch exploration enabled setting.
- */
- private void handleTouchExplorationEnabledSettingChangedLocked() {
- mIsTouchExplorationEnabled = Settings.Secure.getInt(
+ private void handleTouchExplorationEnabledSettingChangedLocked(UserState userState) {
+ userState.mIsTouchExplorationEnabled = Settings.Secure.getIntForUser(
mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0) == 1;
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0, userState.mUserId) == 1;
}
- /**
- * Updates the state based on the screen magnification enabled setting.
- */
- private void handleScreenMagnificationEnabledSettingChangedLocked() {
- mIsScreenMagnificationEnabled = Settings.Secure.getInt(
+ private void handleDisplayMagnificationEnabledSettingChangedLocked(UserState userState) {
+ userState.mIsDisplayMagnificationEnabled = Settings.Secure.getIntForUser(
mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0) == 1;
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
+ 0, userState.mUserId) == 1;
}
- private void handleTouchExplorationGrantedAccessibilityServicesChangedLocked() {
- final int serviceCount = mServices.size();
+ private void handleTouchExplorationGrantedAccessibilityServicesChangedLocked(
+ UserState userState) {
+ final int serviceCount = userState.mServices.size();
for (int i = 0; i < serviceCount; i++) {
- Service service = mServices.get(i);
+ Service service = userState.mServices.get(i);
if (service.mRequestTouchExplorationMode
- && mTouchExplorationGrantedServices.contains(service.mComponentName)) {
+ && userState.mTouchExplorationGrantedServices.contains(
+ service.mComponentName)) {
tryEnableTouchExplorationLocked(service);
return;
}
}
- if (mIsTouchExplorationEnabled) {
- mMainHandler.obtainMessage(MSG_TOGGLE_TOUCH_EXPLORATION, 0,
- 0).sendToTarget();
+ if (userState.mIsTouchExplorationEnabled) {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0, userState.mUserId);
}
}
private void tryEnableTouchExplorationLocked(final Service service) {
- if (!mIsTouchExplorationEnabled && service.mRequestTouchExplorationMode) {
- final boolean canToggleTouchExploration = mTouchExplorationGrantedServices.contains(
- service.mComponentName);
+ UserState userState = getUserStateLocked(service.mUserId);
+ if (!userState.mIsTouchExplorationEnabled && service.mRequestTouchExplorationMode) {
+ final boolean canToggleTouchExploration =
+ userState.mTouchExplorationGrantedServices.contains(service.mComponentName);
if (!service.mIsAutomation && !canToggleTouchExploration) {
- mMainHandler.obtainMessage(MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG,
- service).sendToTarget();
+ showEnableTouchExplorationDialog(service);
} else {
- mMainHandler.obtainMessage(MSG_TOGGLE_TOUCH_EXPLORATION, 1, 0).sendToTarget();
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1, userState.mUserId);
}
}
}
private void tryDisableTouchExplorationLocked(Service service) {
- if (mIsTouchExplorationEnabled) {
- synchronized (mLock) {
- final int serviceCount = mServices.size();
- for (int i = 0; i < serviceCount; i++) {
- Service other = mServices.get(i);
- if (other != service && other.mRequestTouchExplorationMode) {
- return;
- }
+ UserState userState = getUserStateLocked(service.mUserId);
+ if (userState.mIsTouchExplorationEnabled) {
+ final int serviceCount = userState.mServices.size();
+ for (int i = 0; i < serviceCount; i++) {
+ Service other = userState.mServices.get(i);
+ if (other != service && other.mRequestTouchExplorationMode) {
+ return;
}
- mMainHandler.obtainMessage(MSG_TOGGLE_TOUCH_EXPLORATION, 0, 0).sendToTarget();
}
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0, userState.mUserId);
}
}
private class AccessibilityConnectionWrapper implements DeathRecipient {
private final int mWindowId;
+ private final int mUserId;
private final IAccessibilityInteractionConnection mConnection;
public AccessibilityConnectionWrapper(int windowId,
- IAccessibilityInteractionConnection connection) {
+ IAccessibilityInteractionConnection connection, int userId) {
mWindowId = windowId;
+ mUserId = userId;
mConnection = connection;
}
@@ -1062,12 +1156,17 @@
public void binderDied() {
unlinkToDeath();
synchronized (mLock) {
- removeAccessibilityInteractionConnectionLocked(mWindowId);
+ removeAccessibilityInteractionConnectionLocked(mWindowId, mUserId);
}
}
}
- private class MainHandler extends Handler {
+ private final class MainHandler extends Handler {
+ public static final int MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER = 1;
+ public static final int MSG_SEND_STATE_TO_CLIENTS = 2;
+ public static final int MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER = 3;
+ public static final int MSG_SEND_RECREATE_INTERNAL_STATE = 4;
+ public static final int MSG_REGISTER_UI_TEST_AUTOMATION_SERVICE = 5;
public MainHandler(Looper looper) {
super(looper);
@@ -1077,102 +1176,68 @@
public void handleMessage(Message msg) {
final int type = msg.what;
switch (type) {
- case MSG_TOGGLE_TOUCH_EXPLORATION: {
- final int value = msg.arg1;
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, value);
- } break;
- case MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG: {
- final Service service = (Service) msg.obj;
- String label = service.mResolveInfo.loadLabel(
- mContext.getPackageManager()).toString();
- synchronized (mLock) {
- if (mIsTouchExplorationEnabled) {
- return;
- }
- if (mEnableTouchExplorationDialog != null
- && mEnableTouchExplorationDialog.isShowing()) {
- return;
- }
- mEnableTouchExplorationDialog = new AlertDialog.Builder(mContext)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setPositiveButton(android.R.string.ok, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // The user allowed the service to toggle touch exploration.
- mTouchExplorationGrantedServices.add(service.mComponentName);
- persistComponentNamesToSettingLocked(
- Settings.Secure.
- TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
- mTouchExplorationGrantedServices);
- // Enable touch exploration.
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1);
- }
- })
- .setNegativeButton(android.R.string.cancel, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- })
- .setTitle(R.string.enable_explore_by_touch_warning_title)
- .setMessage(mContext.getString(
- R.string.enable_explore_by_touch_warning_message, label))
- .create();
- mEnableTouchExplorationDialog.getWindow().setType(
- WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG);
- mEnableTouchExplorationDialog.setCanceledOnTouchOutside(true);
- mEnableTouchExplorationDialog.show();
- }
- } break;
case MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER: {
AccessibilityEvent event = (AccessibilityEvent) msg.obj;
- if (mHasInputFilter && mInputFilter != null) {
- mInputFilter.notifyAccessibilityEvent(event);
+ synchronized (mLock) {
+ if (mHasInputFilter && mInputFilter != null) {
+ mInputFilter.notifyAccessibilityEvent(event);
+ }
}
event.recycle();
} break;
- case MSG_SEND_UPDATE_INPUT_FILTER: {
- boolean setInputFilter = false;
- AccessibilityInputFilter inputFilter = null;
+ case MSG_SEND_STATE_TO_CLIENTS: {
+ final int clientState = msg.arg1;
+ final int userId = msg.arg2;
+ sendStateToClients(clientState, mGlobalClients);
+ sendStateToClientsForUser(clientState, userId);
+ } break;
+ case MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER: {
+ final int userId = msg.arg1;
+ sendStateToClientsForUser(0, userId);
+ } break;
+ case MSG_SEND_RECREATE_INTERNAL_STATE: {
+ final int userId = msg.arg1;
synchronized (mLock) {
- if ((mIsAccessibilityEnabled && mIsTouchExplorationEnabled)
- || mIsScreenMagnificationEnabled) {
- if (!mHasInputFilter) {
- mHasInputFilter = true;
- if (mInputFilter == null) {
- mInputFilter = new AccessibilityInputFilter(mContext,
- AccessibilityManagerService.this);
- }
- inputFilter = mInputFilter;
- setInputFilter = true;
- }
- int flags = 0;
- if (mIsScreenMagnificationEnabled) {
- flags |= AccessibilityInputFilter.FLAG_FEATURE_SCREEN_MAGNIFIER;
- }
- if (mIsTouchExplorationEnabled) {
- flags |= AccessibilityInputFilter.FLAG_FEATURE_TOUCH_EXPLORATION;
- }
- mInputFilter.setEnabledFeatures(flags);
- } else {
- if (mHasInputFilter) {
- mHasInputFilter = false;
- mInputFilter.setEnabledFeatures(0);
- inputFilter = null;
- setInputFilter = true;
- }
- }
- }
- if (setInputFilter) {
- try {
- mWindowManager.setInputFilter(inputFilter);
- } catch (RemoteException re) {
- /* ignore */
- }
+ UserState userState = getUserStateLocked(userId);
+ recreateInternalStateLocked(userState);
}
} break;
+ case MSG_REGISTER_UI_TEST_AUTOMATION_SERVICE: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ IAccessibilityServiceClient client =
+ (IAccessibilityServiceClient) args.arg1;
+ AccessibilityServiceInfo info = (AccessibilityServiceInfo) args.arg2;
+ registerUiTestAutomationService(client, info);
+ } finally {
+ args.recycle();
+ }
+ } break;
+ }
+ }
+
+ private void sendStateToClientsForUser(int clientState, int userId) {
+ final UserState userState;
+ synchronized (mLock) {
+ userState = getUserStateLocked(userId);
+ }
+ sendStateToClients(clientState, userState.mClients);
+ }
+
+ private void sendStateToClients(int clientState,
+ RemoteCallbackList<IAccessibilityManagerClient> clients) {
+ try {
+ final int userClientCount = clients.beginBroadcast();
+ for (int i = 0; i < userClientCount; i++) {
+ IAccessibilityManagerClient client = clients.getBroadcastItem(i);
+ try {
+ client.setState(clientState);
+ } catch (RemoteException re) {
+ /* ignore */
+ }
+ }
+ } finally {
+ clients.finishBroadcast();
}
}
}
@@ -1192,6 +1257,8 @@
// used as message types allowing us to remove messages per event type.
private static final int MSG_ON_GESTURE = 0x80000000;
+ final int mUserId;
+
int mId = 0;
AccessibilityServiceInfo mAccessibilityServiceInfo;
@@ -1250,8 +1317,9 @@
}
};
- public Service(ComponentName componentName,
+ public Service(int userId, ComponentName componentName,
AccessibilityServiceInfo accessibilityServiceInfo, boolean isAutomation) {
+ mUserId = userId;
mResolveInfo = accessibilityServiceInfo.getResolveInfo();
mId = sIdCounter++;
mComponentName = componentName;
@@ -1312,7 +1380,7 @@
*/
public boolean bind() {
if (!mIsAutomation && mService == null) {
- return mContext.bindService(mIntent, this, Context.BIND_AUTO_CREATE);
+ return mContext.bindService(mIntent, this, Context.BIND_AUTO_CREATE, mUserId);
}
return false;
}
@@ -1355,17 +1423,22 @@
@Override
public void setServiceInfo(AccessibilityServiceInfo info) {
- synchronized (mLock) {
- // If the XML manifest had data to configure the service its info
- // should be already set. In such a case update only the dynamically
- // configurable properties.
- AccessibilityServiceInfo oldInfo = mAccessibilityServiceInfo;
- if (oldInfo != null) {
- oldInfo.updateDynamicallyConfigurableProperties(info);
- setDynamicallyConfigurableProperties(oldInfo);
- } else {
- setDynamicallyConfigurableProperties(info);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ // If the XML manifest had data to configure the service its info
+ // should be already set. In such a case update only the dynamically
+ // configurable properties.
+ AccessibilityServiceInfo oldInfo = mAccessibilityServiceInfo;
+ if (oldInfo != null) {
+ oldInfo.updateDynamicallyConfigurableProperties(info);
+ setDynamicallyConfigurableProperties(oldInfo);
+ } else {
+ setDynamicallyConfigurableProperties(info);
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
@@ -1376,7 +1449,7 @@
try {
mServiceInterface.setConnection(this, mId);
synchronized (mLock) {
- tryAddServiceLocked(this);
+ tryAddServiceLocked(this, mUserId);
}
} catch (RemoteException re) {
Slog.w(LOG_TAG, "Error while setting Controller for service: " + service, re);
@@ -1388,14 +1461,21 @@
long accessibilityNodeId, int viewId, int interactionId,
IAccessibilityInteractionConnectionCallback callback, long interrogatingTid)
throws RemoteException {
- final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId);
+ final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(
+ UserHandle.getCallingUserId());
+ if (resolvedUserId != mCurrentUserId) {
+ return -1;
+ }
mSecurityPolicy.enforceCanRetrieveWindowContent(this);
final boolean permissionGranted = mSecurityPolicy.canRetrieveWindowContent(this);
if (!permissionGranted) {
return 0;
} else {
+ resolvedWindowId = resolveAccessibilityWindowIdLocked(accessibilityWindowId);
connection = getConnectionLocked(resolvedWindowId);
if (connection == null) {
return 0;
@@ -1425,10 +1505,17 @@
long accessibilityNodeId, String text, int interactionId,
IAccessibilityInteractionConnectionCallback callback, long interrogatingTid)
throws RemoteException {
- final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId);
+ final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(
+ UserHandle.getCallingUserId());
+ if (resolvedUserId != mCurrentUserId) {
+ return -1;
+ }
mSecurityPolicy.enforceCanRetrieveWindowContent(this);
+ resolvedWindowId = resolveAccessibilityWindowIdLocked(accessibilityWindowId);
final boolean permissionGranted =
mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, resolvedWindowId);
if (!permissionGranted) {
@@ -1464,10 +1551,17 @@
long accessibilityNodeId, int interactionId,
IAccessibilityInteractionConnectionCallback callback, int flags,
long interrogatingTid) throws RemoteException {
- final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId);
+ final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(
+ UserHandle.getCallingUserId());
+ if (resolvedUserId != mCurrentUserId) {
+ return -1;
+ }
mSecurityPolicy.enforceCanRetrieveWindowContent(this);
+ resolvedWindowId = resolveAccessibilityWindowIdLocked(accessibilityWindowId);
final boolean permissionGranted =
mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, resolvedWindowId);
if (!permissionGranted) {
@@ -1502,10 +1596,17 @@
int focusType, int interactionId,
IAccessibilityInteractionConnectionCallback callback, long interrogatingTid)
throws RemoteException {
- final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId);
+ final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(
+ UserHandle.getCallingUserId());
+ if (resolvedUserId != mCurrentUserId) {
+ return -1;
+ }
mSecurityPolicy.enforceCanRetrieveWindowContent(this);
+ resolvedWindowId = resolveAccessibilityWindowIdLocked(accessibilityWindowId);
final boolean permissionGranted =
mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, resolvedWindowId);
if (!permissionGranted) {
@@ -1540,10 +1641,17 @@
int direction, int interactionId,
IAccessibilityInteractionConnectionCallback callback, long interrogatingTid)
throws RemoteException {
- final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId);
+ final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(
+ UserHandle.getCallingUserId());
+ if (resolvedUserId != mCurrentUserId) {
+ return -1;
+ }
mSecurityPolicy.enforceCanRetrieveWindowContent(this);
+ resolvedWindowId = resolveAccessibilityWindowIdLocked(accessibilityWindowId);
final boolean permissionGranted =
mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, resolvedWindowId);
if (!permissionGranted) {
@@ -1576,10 +1684,19 @@
@Override
public boolean performAccessibilityAction(int accessibilityWindowId,
long accessibilityNodeId, int action, Bundle arguments, int interactionId,
- IAccessibilityInteractionConnectionCallback callback, long interrogatingTid) {
- final int resolvedWindowId = resolveAccessibilityWindowId(accessibilityWindowId);
+ IAccessibilityInteractionConnectionCallback callback, long interrogatingTid)
+ throws RemoteException {
+ final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(
+ UserHandle.getCallingUserId());
+ if (resolvedUserId != mCurrentUserId) {
+ return false;
+ }
+ mSecurityPolicy.enforceCanRetrieveWindowContent(this);
+ resolvedWindowId = resolveAccessibilityWindowIdLocked(accessibilityWindowId);
final boolean permissionGranted = mSecurityPolicy.canPerformActionLocked(this,
resolvedWindowId, action, arguments);
if (!permissionGranted) {
@@ -1608,22 +1725,35 @@
return true;
}
- public boolean performGlobalAction(int action) {
- switch (action) {
- case AccessibilityService.GLOBAL_ACTION_BACK: {
- sendDownAndUpKeyEvents(KeyEvent.KEYCODE_BACK);
- } return true;
- case AccessibilityService.GLOBAL_ACTION_HOME: {
- sendDownAndUpKeyEvents(KeyEvent.KEYCODE_HOME);
- } return true;
- case AccessibilityService.GLOBAL_ACTION_RECENTS: {
- openRecents();
- } return true;
- case AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS: {
- expandStatusBar();
- } return true;
+ public boolean performGlobalAction(int action) throws RemoteException {
+ synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(
+ UserHandle.getCallingUserId());
+ if (resolvedUserId != mCurrentUserId) {
+ return false;
+ }
}
- return false;
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ switch (action) {
+ case AccessibilityService.GLOBAL_ACTION_BACK: {
+ sendDownAndUpKeyEvents(KeyEvent.KEYCODE_BACK);
+ } return true;
+ case AccessibilityService.GLOBAL_ACTION_HOME: {
+ sendDownAndUpKeyEvents(KeyEvent.KEYCODE_HOME);
+ } return true;
+ case AccessibilityService.GLOBAL_ACTION_RECENTS: {
+ openRecents();
+ } return true;
+ case AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS: {
+ expandStatusBar();
+ } return true;
+ }
+ return false;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
public void onServiceDisconnected(ComponentName componentName) {
@@ -1658,7 +1788,7 @@
// the state based on values in the settings database.
if (mIsAutomation) {
mUiAutomationService = null;
- updateInternalStateLocked();
+ recreateInternalStateLocked(getUserStateLocked(mUserId));
}
}
}
@@ -1817,8 +1947,10 @@
if (DEBUG) {
Slog.i(LOG_TAG, "Trying to get interaction connection to windowId: " + windowId);
}
- AccessibilityConnectionWrapper wrapper = mWindowIdToInteractionConnectionWrapperMap.get(
- windowId);
+ AccessibilityConnectionWrapper wrapper = mGlobalInteractionConnections.get(windowId);
+ if (wrapper == null) {
+ wrapper = getCurrentUserStateLocked().mInteractionConnections.get(windowId);
+ }
if (wrapper != null && wrapper.mConnection != null) {
return wrapper.mConnection;
}
@@ -1828,7 +1960,7 @@
return null;
}
- private int resolveAccessibilityWindowId(int accessibilityWindowId) {
+ private int resolveAccessibilityWindowIdLocked(int accessibilityWindowId) {
if (accessibilityWindowId == AccessibilityNodeInfo.ACTIVE_WINDOW_ID) {
return mSecurityPolicy.mActiveWindowId;
}
@@ -1836,9 +1968,15 @@
}
private float getCompatibilityScale(int windowId) {
- IBinder windowToken = mWindowIdToWindowTokenMap.get(windowId);
try {
- return mWindowManager.getWindowCompatibilityScale(windowToken);
+ IBinder windowToken = mGlobalWindowTokens.get(windowId);
+ if (windowToken != null) {
+ return mWindowManagerService.getWindowCompatibilityScale(windowToken);
+ }
+ windowToken = getCurrentUserStateLocked().mWindowTokens.get(windowId);
+ if (windowToken != null) {
+ return mWindowManagerService.getWindowCompatibilityScale(windowToken);
+ }
} catch (RemoteException re) {
/* ignore */
}
@@ -1941,6 +2079,38 @@
}
}
+ public int resolveCallingUserIdEnforcingPermissionsLocked(int userId) {
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid == Process.SYSTEM_UID
+ || callingUid == Process.SHELL_UID) {
+ return mCurrentUserId;
+ }
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ if (callingUserId == userId) {
+ return userId;
+ }
+ if (!hasPermission(Manifest.permission.INTERACT_ACROSS_USERS)
+ && !hasPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL)) {
+ throw new SecurityException("Call from user " + callingUserId + " as user "
+ + userId + " without permission INTERACT_ACROSS_USERS or "
+ + "INTERACT_ACROSS_USERS_FULL not allowed.");
+ }
+ if (userId == UserHandle.USER_CURRENT
+ || userId == UserHandle.USER_CURRENT_OR_SELF) {
+ return mCurrentUserId;
+ }
+ throw new IllegalArgumentException("Calling user can be changed to only "
+ + "UserHandle.USER_CURRENT or UserHandle.USER_CURRENT_OR_SELF.");
+ }
+
+ public boolean isCallerInteractingAcrossUsers(int userId) {
+ final int callingUid = Binder.getCallingUid();
+ return (callingUid == Process.SYSTEM_UID
+ || callingUid == Process.SHELL_UID
+ || userId == UserHandle.USER_CURRENT
+ || userId == UserHandle.USER_CURRENT_OR_SELF);
+ }
+
private boolean isRetrievalAllowingWindow(int windowId) {
return (mActiveWindowId == windowId);
}
@@ -1953,22 +2123,25 @@
if (OWN_PROCESS_ID == Binder.getCallingPid()) {
return;
}
- final int permissionStatus = mContext.checkCallingPermission(permission);
- if (permissionStatus != PackageManager.PERMISSION_GRANTED) {
+ if (!hasPermission(permission)) {
throw new SecurityException("You do not have " + permission
+ " required to call " + function);
}
}
+ private boolean hasPermission(String permission) {
+ return mContext.checkCallingPermission(permission) == PackageManager.PERMISSION_GRANTED;
+ }
+
private int getFocusedWindowId() {
final long identity = Binder.clearCallingIdentity();
try {
// We call this only on window focus change or after touch
// exploration gesture end and the shown windows are not that
// many, so the linear look up is just fine.
- IBinder token = mWindowManager.getFocusedWindowToken();
+ IBinder token = mWindowManagerService.getFocusedWindowToken();
if (token != null) {
- SparseArray<IBinder> windows = mWindowIdToWindowTokenMap;
+ SparseArray<IBinder> windows = getCurrentUserStateLocked().mWindowTokens;
final int windowCount = windows.size();
for (int i = 0; i < windowCount; i++) {
if (windows.valueAt(i) == token) {
@@ -1984,4 +2157,129 @@
return -1;
}
}
+
+ private class UserState {
+ public final int mUserId;
+
+ public final CopyOnWriteArrayList<Service> mServices = new CopyOnWriteArrayList<Service>();
+
+ public final RemoteCallbackList<IAccessibilityManagerClient> mClients =
+ new RemoteCallbackList<IAccessibilityManagerClient>();
+
+ public final Map<ComponentName, Service> mComponentNameToServiceMap =
+ new HashMap<ComponentName, Service>();
+
+ public final List<AccessibilityServiceInfo> mInstalledServices =
+ new ArrayList<AccessibilityServiceInfo>();
+
+ public final Set<ComponentName> mEnabledServices = new HashSet<ComponentName>();
+
+ public final Set<ComponentName> mTouchExplorationGrantedServices =
+ new HashSet<ComponentName>();
+
+ public final SparseArray<AccessibilityConnectionWrapper>
+ mInteractionConnections =
+ new SparseArray<AccessibilityConnectionWrapper>();
+
+ public final SparseArray<IBinder> mWindowTokens = new SparseArray<IBinder>();
+
+ public int mHandledFeedbackTypes = 0;
+
+ public boolean mIsAccessibilityEnabled;
+ public boolean mIsTouchExplorationEnabled;
+ public boolean mIsDisplayMagnificationEnabled;
+
+ public UserState(int userId) {
+ mUserId = userId;
+ }
+ }
+
+ private final class AccessibilityContentObserver extends ContentObserver {
+
+ private final Uri mAccessibilityEnabledUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_ENABLED);
+
+ private final Uri mTouchExplorationEnabledUri = Settings.Secure.getUriFor(
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED);
+
+ private final Uri mDisplayMagnificationEnabledUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED);
+
+ private final Uri mEnabledAccessibilityServicesUri = Settings.Secure.getUriFor(
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
+
+ private final Uri mTouchExplorationGrantedAccessibilityServicesUri = Settings.Secure
+ .getUriFor(Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES);
+
+ public AccessibilityContentObserver(Handler handler) {
+ super(handler);
+ }
+
+ public void register(ContentResolver contentResolver) {
+ contentResolver.registerContentObserver(mAccessibilityEnabledUri,
+ false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(mTouchExplorationEnabledUri,
+ false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(mDisplayMagnificationEnabledUri,
+ false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(mEnabledAccessibilityServicesUri,
+ false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mTouchExplorationGrantedAccessibilityServicesUri,
+ false, this, UserHandle.USER_ALL);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ if (mAccessibilityEnabledUri.equals(uri)) {
+ synchronized (mLock) {
+ // We will update when the automation service dies.
+ if (mUiAutomationService == null) {
+ UserState userState = getCurrentUserStateLocked();
+ handleAccessibilityEnabledSettingChangedLocked(userState);
+ updateInputFilterLocked(userState);
+ scheduleSendStateToClientsLocked(userState);
+ }
+ }
+ } else if (mTouchExplorationEnabledUri.equals(uri)) {
+ synchronized (mLock) {
+ // We will update when the automation service dies.
+ if (mUiAutomationService == null) {
+ UserState userState = getCurrentUserStateLocked();
+ handleTouchExplorationEnabledSettingChangedLocked(userState);
+ updateInputFilterLocked(userState);
+ scheduleSendStateToClientsLocked(userState);
+ }
+ }
+ } else if (mDisplayMagnificationEnabledUri.equals(uri)) {
+ synchronized (mLock) {
+ // We will update when the automation service dies.
+ if (mUiAutomationService == null) {
+ UserState userState = getCurrentUserStateLocked();
+ handleDisplayMagnificationEnabledSettingChangedLocked(userState);
+ updateInputFilterLocked(userState);
+ scheduleSendStateToClientsLocked(userState);
+ }
+ }
+ } else if (mEnabledAccessibilityServicesUri.equals(uri)) {
+ synchronized (mLock) {
+ // We will update when the automation service dies.
+ if (mUiAutomationService == null) {
+ UserState userState = getCurrentUserStateLocked();
+ populateEnabledAccessibilityServicesLocked(userState);
+ manageServicesLocked(userState);
+ }
+ }
+ } else if (mTouchExplorationGrantedAccessibilityServicesUri.equals(uri)) {
+ synchronized (mLock) {
+ // We will update when the automation service dies.
+ if (mUiAutomationService == null) {
+ UserState userState = getCurrentUserStateLocked();
+ populateTouchExplorationGrantedAccessibilityServicesLocked(userState);
+ handleTouchExplorationGrantedAccessibilityServicesChangedLocked(userState);
+ }
+ }
+ }
+ }
+ }
}
diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java
index cb6b31a..c84f988 100644
--- a/services/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/java/com/android/server/accessibility/TouchExplorer.java
@@ -1150,20 +1150,9 @@
return;
}
- if (Build.IS_DEBUGGABLE) {
- if (mSendHoverEnterDelayed.isPending()) {
- throw new IllegalStateException("mSendHoverEnterDelayed must not be pending.");
- }
- if (mSendHoverExitDelayed.isPending()) {
- throw new IllegalStateException("mSendHoverExitDelayed must not be pending.");
- }
- if (!mPerformLongPressDelayed.isPending()) {
- throw new IllegalStateException(
- "mPerformLongPressDelayed must not be pending.");
- }
- }
-
// Remove pending event deliveries.
+ mSendHoverEnterDelayed.remove();
+ mSendHoverExitDelayed.remove();
mPerformLongPressDelayed.remove();
// The touch interaction has ended since we will send a click.
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 05ff379..1707ff0 100755
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -4329,6 +4329,9 @@
if (resumed != null && resumed.thumbHolder == tr) {
info.mainThumbnail = resumed.stack.screenshotActivities(resumed);
}
+ if (info.mainThumbnail == null) {
+ info.mainThumbnail = tr.lastThumbnail;
+ }
return info;
}
@@ -4343,7 +4346,7 @@
// thumbnail to return.
TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true);
if (info.numSubThumbbails <= 0) {
- return info.mainThumbnail;
+ return info.mainThumbnail != null ? info.mainThumbnail : tr.lastThumbnail;
} else {
return info.subtasks.get(info.numSubThumbbails-1).holder.lastThumbnail;
}
@@ -4387,6 +4390,8 @@
while (j < NA) {
ActivityRecord ar = mHistory.get(j);
if (!ar.finishing && ar.task.taskId == taskId) {
+ thumbs.root = ar;
+ thumbs.rootIndex = j;
holder = ar.thumbHolder;
if (holder != null) {
thumbs.mainThumbnail = holder.lastThumbnail;
@@ -4401,9 +4406,6 @@
return thumbs;
}
- thumbs.root = mHistory.get(j);
- thumbs.rootIndex = j;
-
ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>();
thumbs.subtasks = subtasks;
while (j < NA) {
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 3f2387b..89c0efa 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -2488,6 +2488,15 @@
if (ri != null) {
return ri;
}
+ 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;
}
}
@@ -3668,7 +3677,7 @@
mResolveActivity.applicationInfo = mAndroidApplication;
mResolveActivity.name = ResolverActivity.class.getName();
mResolveActivity.packageName = mAndroidApplication.packageName;
- mResolveActivity.processName = mAndroidApplication.processName;
+ mResolveActivity.processName = "system:ui";
mResolveActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
mResolveActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
mResolveActivity.theme = com.android.internal.R.style.Theme_Holo_Dialog_Alert;
diff --git a/services/tests/servicestests/src/com/android/server/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/AccessibilityManagerServiceTest.java
index 46bcc4a..fd9fc98 100644
--- a/services/tests/servicestests/src/com/android/server/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/AccessibilityManagerServiceTest.java
@@ -25,6 +25,7 @@
import android.os.Message;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.provider.Settings;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
@@ -98,7 +99,7 @@
MyMockAccessibilityManagerClient mockClient = new MyMockAccessibilityManagerClient();
// invoke the method under test
- final int stateFlagsDisabled = mManagerService.addClient(mockClient);
+ final int stateFlagsDisabled = mManagerService.addClient(mockClient, UserHandle.USER_OWNER);
boolean enabledAccessibilityDisabled =
(stateFlagsDisabled & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0;
@@ -110,7 +111,7 @@
ensureAccessibilityEnabled(mContext, true);
// invoke the method under test
- final int stateFlagsEnabled = mManagerService.addClient(mockClient);
+ final int stateFlagsEnabled = mManagerService.addClient(mockClient, UserHandle.USER_OWNER);
boolean enabledAccessibilityEnabled =
(stateFlagsEnabled & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0;
@@ -129,7 +130,7 @@
MyMockAccessibilityManagerClient mockClient = new MyMockAccessibilityManagerClient();
// invoke the method under test
- final int stateFlagsEnabled = mManagerService.addClient(mockClient);
+ final int stateFlagsEnabled = mManagerService.addClient(mockClient, UserHandle.USER_OWNER);
boolean enabledAccessibilityEnabled =
(stateFlagsEnabled & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0;
@@ -141,7 +142,7 @@
ensureAccessibilityEnabled(mContext, false);
// invoke the method under test
- final int stateFlagsDisabled = mManagerService.addClient(mockClient);
+ final int stateFlagsDisabled = mManagerService.addClient(mockClient, UserHandle.USER_OWNER);
boolean enabledAccessibilityDisabled =
(stateFlagsDisabled & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0;
@@ -160,7 +161,8 @@
String secondMockServiceClassName = MySecondMockAccessibilityService.class.getName();
// look for the two mock services
- for (AccessibilityServiceInfo info : mManagerService.getInstalledAccessibilityServiceList()) {
+ for (AccessibilityServiceInfo info : mManagerService.getInstalledAccessibilityServiceList(
+ UserHandle.USER_OWNER)) {
ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
if (packageName.equals(serviceInfo.packageName)) {
if (firstMockServiceClassName.equals(serviceInfo.name)) {
@@ -201,7 +203,7 @@
service.replay();
// send the event
- mManagerService.sendAccessibilityEvent(sentEvent);
+ mManagerService.sendAccessibilityEvent(sentEvent, UserHandle.USER_OWNER);
// verify if all expected methods have been called
assertMockServiceVerifiedWithinTimeout(service);
@@ -231,7 +233,7 @@
service.replay();
// send the event
- mManagerService.sendAccessibilityEvent(sentEvent);
+ mManagerService.sendAccessibilityEvent(sentEvent, UserHandle.USER_OWNER);
// verify if all expected methods have been called
assertMockServiceVerifiedWithinTimeout(service);
@@ -261,7 +263,7 @@
service.replay();
// send the event
- mManagerService.sendAccessibilityEvent(sentEvent);
+ mManagerService.sendAccessibilityEvent(sentEvent, UserHandle.USER_OWNER);
// verify if all expected methods have been called
assertMockServiceVerifiedWithinTimeout(service);
@@ -297,8 +299,8 @@
service.replay();
// send the events
- mManagerService.sendAccessibilityEvent(firstEvent);
- mManagerService.sendAccessibilityEvent(secondEvent);
+ mManagerService.sendAccessibilityEvent(firstEvent, UserHandle.USER_OWNER);
+ mManagerService.sendAccessibilityEvent(secondEvent, UserHandle.USER_OWNER);
// wait for #sendAccessibilityEvent to reach the backing service
Thread.sleep(TIMEOUT_BINDER_CALL);
@@ -354,7 +356,7 @@
secondService.replay();
// send the event
- mManagerService.sendAccessibilityEvent(sentEvent);
+ mManagerService.sendAccessibilityEvent(sentEvent, UserHandle.USER_OWNER);
// verify if all expected methods have been called
assertMockServiceVerifiedWithinTimeout(firstService);
@@ -393,7 +395,7 @@
secondService.replay();
// send the event
- mManagerService.sendAccessibilityEvent(sentEvent);
+ mManagerService.sendAccessibilityEvent(sentEvent, UserHandle.USER_OWNER);
// verify if all expected methods have been called
assertMockServiceVerifiedWithinTimeout(firstService);
@@ -434,7 +436,7 @@
secondService.replay();
// send the event
- mManagerService.sendAccessibilityEvent(sentEvent);
+ mManagerService.sendAccessibilityEvent(sentEvent, UserHandle.USER_OWNER);
// verify if all expected methods have been called
assertMockServiceVerifiedWithinTimeout(firstService);
@@ -477,7 +479,7 @@
secondService.replay();
// send the event
- mManagerService.sendAccessibilityEvent(sentEvent);
+ mManagerService.sendAccessibilityEvent(sentEvent, UserHandle.USER_OWNER);
// verify if all expected methods have been called
assertMockServiceVerifiedWithinTimeout(firstService);
@@ -512,7 +514,7 @@
secondService.replay();
// call the method under test
- mManagerService.interrupt();
+ mManagerService.interrupt(UserHandle.USER_OWNER);
// verify if all expected methods have been called
assertMockServiceVerifiedWithinTimeout(firstService);
diff --git a/services/tests/servicestests/src/com/android/server/AccessibilityManagerTest.java b/services/tests/servicestests/src/com/android/server/AccessibilityManagerTest.java
index e083815..e7366ea 100644
--- a/services/tests/servicestests/src/com/android/server/AccessibilityManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/AccessibilityManagerTest.java
@@ -26,7 +26,7 @@
import org.easymock.IArgumentMatcher;
import android.accessibilityservice.AccessibilityServiceInfo;
-import android.content.pm.ServiceInfo;
+import android.os.UserHandle;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
@@ -70,14 +70,16 @@
// configure the mock service behavior
IAccessibilityManager mockServiceInterface = mMockServiceInterface;
- expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient())).andReturn(
+ expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
+ UserHandle.USER_OWNER)).andReturn(
AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
- expect(mockServiceInterface.getInstalledAccessibilityServiceList()).andReturn(
- expectedServices);
+ expect(mockServiceInterface.getInstalledAccessibilityServiceList(UserHandle.USER_OWNER))
+ .andReturn(expectedServices);
replay(mockServiceInterface);
// invoke the method under test
- AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface);
+ AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
+ UserHandle.USER_OWNER);
List<AccessibilityServiceInfo> receivedServices =
manager.getInstalledAccessibilityServiceList();
@@ -92,13 +94,15 @@
public void testInterrupt() throws Exception {
// configure the mock service behavior
IAccessibilityManager mockServiceInterface = mMockServiceInterface;
- expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient())).andReturn(
- AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
- mockServiceInterface.interrupt();
+ expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
+ UserHandle.USER_OWNER)).andReturn(
+ AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
+ mockServiceInterface.interrupt(UserHandle.USER_OWNER);
replay(mockServiceInterface);
// invoke the method under test
- AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface);
+ AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
+ UserHandle.USER_OWNER);
manager.interrupt();
// verify the mock service was properly called
@@ -109,12 +113,14 @@
public void testIsEnabled() throws Exception {
// configure the mock service behavior
IAccessibilityManager mockServiceInterface = mMockServiceInterface;
- expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient())).andReturn(
- AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
+ expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
+ UserHandle.USER_OWNER)).andReturn(
+ AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
replay(mockServiceInterface);
// invoke the method under test
- AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface);
+ AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
+ UserHandle.USER_OWNER);
boolean isEnabledServiceEnabled = manager.isEnabled();
// check expected result
@@ -144,16 +150,18 @@
// configure the mock service behavior
IAccessibilityManager mockServiceInterface = mMockServiceInterface;
- expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient())).andReturn(
- AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
- expect(mockServiceInterface.sendAccessibilityEvent(eqAccessibilityEvent(sentEvent)))
- .andReturn(true);
- expect(mockServiceInterface.sendAccessibilityEvent(eqAccessibilityEvent(sentEvent)))
- .andReturn(false);
+ expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
+ UserHandle.USER_OWNER)).andReturn(
+ AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
+ expect(mockServiceInterface.sendAccessibilityEvent(eqAccessibilityEvent(sentEvent),
+ UserHandle.USER_OWNER)).andReturn(true);
+ expect(mockServiceInterface.sendAccessibilityEvent(eqAccessibilityEvent(sentEvent),
+ UserHandle.USER_OWNER)).andReturn(false);
replay(mockServiceInterface);
// invoke the method under test (manager and service in different processes)
- AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface);
+ AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
+ UserHandle.USER_OWNER);
manager.sendAccessibilityEvent(sentEvent);
// check expected result
@@ -180,11 +188,13 @@
// configure the mock service behavior
IAccessibilityManager mockServiceInterface = mMockServiceInterface;
- expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient())).andReturn(0);
+ expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
+ UserHandle.USER_OWNER)).andReturn(0);
replay(mockServiceInterface);
// invoke the method under test (accessibility disabled)
- AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface);
+ AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
+ UserHandle.USER_OWNER);
try {
manager.sendAccessibilityEvent(sentEvent);
fail("No accessibility events are sent if accessibility is disabled");
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index cd7ee76..7b7a7b3 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -38,10 +38,8 @@
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.content.pm.UserInfo;
import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
@@ -216,6 +214,12 @@
throw new UnsupportedOperationException();
}
+ /** @hide */
+ @Override
+ public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
throw new UnsupportedOperationException();
@@ -223,7 +227,7 @@
/** @hide */
@Override
- public List<ResolveInfo> queryIntentActivitiesForUser(Intent intent,
+ public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
int flags, int userId) {
throw new UnsupportedOperationException();
}
@@ -255,6 +259,12 @@
throw new UnsupportedOperationException();
}
+ /** @hide */
+ @Override
+ public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public ProviderInfo resolveContentProvider(String name, int flags) {
throw new UnsupportedOperationException();
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java b/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java
index db247e3..eb4e3fd 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java
@@ -102,7 +102,7 @@
inflater.inflate(R.layout.date_picker, this, true);
mDayPicker = (NumberPicker) findViewById(R.id.day);
- mDayPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
+ mDayPicker.setFormatter(NumberPicker.getTwoDigitFormatter());
mDayPicker.setOnLongPressUpdateInterval(100);
mDayPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
@@ -111,7 +111,7 @@
}
});
mMonthPicker = (NumberPicker) findViewById(R.id.month);
- mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
+ mMonthPicker.setFormatter(NumberPicker.getTwoDigitFormatter());
DateFormatSymbols dfs = new DateFormatSymbols();
String[] months = dfs.getShortMonths();
diff --git a/tests/RenderScriptTests/ImageProcessing/res/layout/main.xml b/tests/RenderScriptTests/ImageProcessing/res/layout/main.xml
index bd56d62..4715d6e 100644
--- a/tests/RenderScriptTests/ImageProcessing/res/layout/main.xml
+++ b/tests/RenderScriptTests/ImageProcessing/res/layout/main.xml
@@ -124,6 +124,11 @@
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
+ <Button
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/benchmark_all"
+ android:onClick="benchmark_all"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
diff --git a/tests/RenderScriptTests/ImageProcessing/res/values/strings.xml b/tests/RenderScriptTests/ImageProcessing/res/values/strings.xml
index cc5cc4d..a7dd165 100644
--- a/tests/RenderScriptTests/ImageProcessing/res/values/strings.xml
+++ b/tests/RenderScriptTests/ImageProcessing/res/values/strings.xml
@@ -29,5 +29,6 @@
<string name="gamma">Gamma</string>
<string name="saturation">Saturation</string>
<string name="benchmark">Benchmark</string>
+ <string name="benchmark_all">Benchmark All</string>
</resources>
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
index 7b84355..c171a64 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
@@ -39,9 +39,21 @@
import android.util.Log;
import java.lang.Math;
+import android.os.Environment;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
public class ImageProcessingActivity extends Activity
implements SeekBar.OnSeekBarChangeListener {
private final String TAG = "Img";
+ private final String RESULT_FILE = "image_processing_result.csv";
+
Bitmap mBitmapIn;
Bitmap mBitmapOut;
String mTestNames[];
@@ -121,6 +133,9 @@
void changeTest(int testID) {
+ if (mTest != null) {
+ mTest.destroy();
+ }
switch(testID) {
case 0:
mTest = new LevelsV4(false, false);
@@ -203,6 +218,9 @@
case 26:
mTest = new Convolve5x5(true);
break;
+ case 27:
+ mTest = new Mandelbrot();
+ break;
}
mTest.createBaseTest(this, mBitmapIn);
@@ -215,7 +233,7 @@
}
void setupTests() {
- mTestNames = new String[27];
+ mTestNames = new String[28];
mTestNames[0] = "Levels Vec3 Relaxed";
mTestNames[1] = "Levels Vec4 Relaxed";
mTestNames[2] = "Levels Vec3 Full";
@@ -243,6 +261,8 @@
mTestNames[24] = "CrossProcess (using LUT)";
mTestNames[25] = "Convolve 5x5";
mTestNames[26] = "Intrinsics Convolve 5x5";
+ mTestNames[27] = "Mandelbrot";
+
mTestSpinner.setAdapter(new ArrayAdapter<String>(
this, R.layout.spinner_layout, mTestNames));
}
@@ -320,6 +340,33 @@
//long javaTime = javaFilter();
//mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms");
mBenchmarkResult.setText("Result: " + t + " ms");
+ Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
+ }
+
+ public void benchmark_all(View v) {
+ // write result into a file
+ File externalStorage = Environment.getExternalStorageDirectory();
+ if (!externalStorage.canWrite()) {
+ Log.v(TAG, "sdcard is not writable");
+ return;
+ }
+ File resultFile = new File(externalStorage, RESULT_FILE);
+ resultFile.setWritable(true, false);
+ try {
+ BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
+ Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
+ for (int i = 0; i < mTestNames.length; i++ ) {
+ changeTest(i);
+ float t = getBenchmark();
+ String s = new String("" + mTestNames[i] + ", " + t);
+ rsWriter.write(s + "\n");
+ Log.v(TAG, "Test " + s + "ms\n");
+ }
+ rsWriter.close();
+ } catch (IOException e) {
+ Log.v(TAG, "Unable to write result file " + e.getMessage());
+ }
+ changeTest(0);
}
// For benchmark test
@@ -329,7 +376,7 @@
mTest.setupBenchmark();
long result = 0;
- Log.v(TAG, "Warming");
+ //Log.v(TAG, "Warming");
long t = java.lang.System.currentTimeMillis() + 2000;
do {
mTest.runTest();
@@ -337,17 +384,18 @@
} while (t > java.lang.System.currentTimeMillis());
- Log.v(TAG, "Benchmarking");
+ //Log.v(TAG, "Benchmarking");
+ int ct = 0;
t = java.lang.System.currentTimeMillis();
- for (int i=0; i<10; i++) {
+ do {
mTest.runTest();
- }
- mTest.finish();
+ mTest.finish();
+ ct++;
+ } while ((t+5000) > java.lang.System.currentTimeMillis());
t = java.lang.System.currentTimeMillis() - t;
float ft = (float)t;
- ft /= 10;
+ ft /= ct;
- Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + ft);
mTest.exitBenchmark();
mDoingBenchmark = false;
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Mandelbrot.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Mandelbrot.java
new file mode 100644
index 0000000..20036e6
--- /dev/null
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Mandelbrot.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.rs.image;
+
+import java.lang.Math;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.RenderScript;
+import android.renderscript.Script;
+import android.renderscript.ScriptC;
+import android.renderscript.Type;
+import android.util.Log;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+public class Mandelbrot extends TestBase {
+ private ScriptC_mandelbrot mScript;
+
+ public boolean onBar1Setup(SeekBar b, TextView t) {
+ t.setText("Iterations");
+ b.setProgress(0);
+ return true;
+ }
+
+ public void onBar1Changed(int progress) {
+ int iters = progress * 3 + 50;
+ mScript.set_gMaxIteration(iters);
+ }
+
+ public boolean onBar2Setup(SeekBar b, TextView t) {
+ t.setText("Lower Bound: X");
+ b.setProgress(0);
+ return true;
+ }
+
+ public void onBar2Changed(int progress) {
+ float scaleFactor = mScript.get_scaleFactor();
+ // allow viewport to be moved by 2x scale factor
+ float lowerBoundX = -2.f + ((progress / scaleFactor) / 50.f);
+ mScript.set_lowerBoundX(lowerBoundX);
+ }
+
+ public boolean onBar3Setup(SeekBar b, TextView t) {
+ t.setText("Lower Bound: Y");
+ b.setProgress(0);
+ return true;
+ }
+
+ public void onBar3Changed(int progress) {
+ float scaleFactor = mScript.get_scaleFactor();
+ // allow viewport to be moved by 2x scale factor
+ float lowerBoundY = -2.f + ((progress / scaleFactor) / 50.f);
+ mScript.set_lowerBoundY(lowerBoundY);
+ }
+
+ public boolean onBar4Setup(SeekBar b, TextView t) {
+ t.setText("Scale Factor");
+ b.setProgress(0);
+ return true;
+ }
+
+ public void onBar4Changed(int progress) {
+ float scaleFactor = 4.f - (3.96f * (progress / 100.f));
+ mScript.set_scaleFactor(scaleFactor);
+ }
+
+ public void createTest(android.content.res.Resources res) {
+ int width = mOutPixelsAllocation.getType().getX();
+ int height = mOutPixelsAllocation.getType().getY();
+
+ mScript = new ScriptC_mandelbrot(mRS, res, R.raw.mandelbrot);
+ mScript.set_gDimX(width);
+ mScript.set_gDimY(height);
+ mScript.set_gMaxIteration(50);
+ }
+
+ public void runTest() {
+ mScript.forEach_root(mOutPixelsAllocation);
+ mRS.finish();
+ }
+
+}
+
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/TestBase.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/TestBase.java
index 3a6241d..6885181 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/TestBase.java
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/TestBase.java
@@ -108,6 +108,10 @@
mRS.finish();
}
+ public void destroy() {
+ mRS.destroy();
+ }
+
public void updateBitmap(Bitmap b) {
mOutPixelsAllocation.copyTo(b);
}
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/mandelbrot.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/mandelbrot.rs
new file mode 100644
index 0000000..da81d2e
--- /dev/null
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/mandelbrot.rs
@@ -0,0 +1,56 @@
+// Copyright (C) 2011 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.
+
+#pragma version(1)
+#pragma rs java_package_name(com.android.rs.image)
+
+uint32_t gMaxIteration = 500;
+uint32_t gDimX = 1024;
+uint32_t gDimY = 1024;
+
+float lowerBoundX = -2.f;
+float lowerBoundY = -2.f;
+float scaleFactor = 4.f;
+
+void root(uchar4 *v_out, uint32_t x, uint32_t y) {
+ float2 p;
+ p.x = lowerBoundX + ((float)x / gDimX) * scaleFactor;
+ p.y = lowerBoundY + ((float)y / gDimY) * scaleFactor;
+
+ float2 t = 0;
+ float2 t2 = t * t;
+ int iter = 0;
+ while((t2.x + t2.y < 4.f) && (iter < gMaxIteration)) {
+ float xtemp = t2.x - t2.y + p.x;
+ t.y = 2 * t.x * t.y + p.y;
+ t.x = xtemp;
+ iter++;
+ t2 = t * t;
+ }
+
+ if(iter >= gMaxIteration) {
+ // write a non-transparent black pixel
+ *v_out = (uchar4){0, 0, 0, 0xff};
+ } else {
+ float mi3 = gMaxIteration / 3.;
+ if (iter <= (gMaxIteration / 3))
+ *v_out = (uchar4){0xff * (iter / mi3), 0, 0, 0xff};
+ else if (iter <= (((gMaxIteration / 3) * 2)))
+ *v_out = (uchar4){0xff - (0xff * ((iter - mi3) / mi3)),
+ (0xff * ((iter - mi3) / mi3)), 0, 0xff};
+ else
+ *v_out = (uchar4){0, 0xff - (0xff * ((iter - (mi3 * 2)) / mi3)),
+ (0xff * ((iter - (mi3 * 2)) / mi3)), 0xff};
+ }
+}