diff options
97 files changed, 2669 insertions, 355 deletions
diff --git a/api/current.txt b/api/current.txt index 9b5481407d5a..860ae0907f3c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -22876,6 +22876,7 @@ package android.util { method public static float cos(float); method public static float exp(float); method public static float floor(float); + method public static float hypot(float, float); method public static float sin(float); method public static float sqrt(float); } diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index 935d647d435f..a4d28b04f439 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -50,7 +50,7 @@ import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import android.util.Log; @@ -354,7 +354,7 @@ public class AccountManagerService } private UserAccounts getUserAccountsForCaller() { - return getUserAccounts(UserId.getCallingUserId()); + return getUserAccounts(UserHandle.getCallingUserId()); } protected UserAccounts getUserAccounts(int userId) { @@ -1004,7 +1004,7 @@ public class AccountManagerService if (callingUid != android.os.Process.SYSTEM_UID) { throw new SecurityException("can only call from system"); } - UserAccounts accounts = getUserAccounts(UserId.getUserId(callingUid)); + UserAccounts accounts = getUserAccounts(UserHandle.getUserId(callingUid)); long identityToken = clearCallingIdentity(); try { new Session(accounts, response, accountType, false, @@ -1222,7 +1222,7 @@ public class AccountManagerService private Integer getCredentialPermissionNotificationId(Account account, String authTokenType, int uid) { Integer id; - UserAccounts accounts = getUserAccounts(UserId.getUserId(uid)); + UserAccounts accounts = getUserAccounts(UserHandle.getUserId(uid)); synchronized (accounts.credentialsPermissionNotificationIds) { final Pair<Pair<Account, String>, Integer> key = new Pair<Pair<Account, String>, Integer>( @@ -2269,7 +2269,7 @@ public class AccountManagerService Log.e(TAG, "grantAppPermission: called with invalid arguments", new Exception()); return; } - UserAccounts accounts = getUserAccounts(UserId.getUserId(uid)); + UserAccounts accounts = getUserAccounts(UserHandle.getUserId(uid)); synchronized (accounts.cacheLock) { final SQLiteDatabase db = accounts.openHelper.getWritableDatabase(); db.beginTransaction(); @@ -2303,7 +2303,7 @@ public class AccountManagerService Log.e(TAG, "revokeAppPermission: called with invalid arguments", new Exception()); return; } - UserAccounts accounts = getUserAccounts(UserId.getUserId(uid)); + UserAccounts accounts = getUserAccounts(UserHandle.getUserId(uid)); synchronized (accounts.cacheLock) { final SQLiteDatabase db = accounts.openHelper.getWritableDatabase(); db.beginTransaction(); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index c74f823d7579..2c6d5d989b2d 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -40,7 +40,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; -import android.os.UserId; +import android.os.UserHandle; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; @@ -529,7 +529,7 @@ public class ActivityManager { throws SecurityException { try { return ActivityManagerNative.getDefault().getRecentTasks(maxNum, - flags, UserId.myUserId()); + flags, UserHandle.myUserId()); } catch (RemoteException e) { // System dead, we will be dead too soon! return null; @@ -1843,12 +1843,12 @@ public class ActivityManager { return PackageManager.PERMISSION_GRANTED; } // Isolated processes don't get any permissions. - if (UserId.isIsolated(uid)) { + if (UserHandle.isIsolated(uid)) { return PackageManager.PERMISSION_DENIED; } // If there is a uid that owns whatever is being accessed, it has // blanket access to it regardless of the permissions it requires. - if (owningUid >= 0 && UserId.isSameApp(uid, owningUid)) { + if (owningUid >= 0 && UserHandle.isSameApp(uid, owningUid)) { return PackageManager.PERMISSION_GRANTED; } // If the target is not exported, then nobody else can get to it. diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 88e7344700f4..3197a6319c59 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -39,7 +39,7 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; import android.os.StrictMode; -import android.os.UserId; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import android.util.Singleton; diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 0789c60ffa3d..7eb86f41c4b5 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -62,7 +62,7 @@ import android.os.ServiceManager; import android.os.StrictMode; import android.os.SystemClock; import android.os.Trace; -import android.os.UserId; +import android.os.UserHandle; import android.util.AndroidRuntimeException; import android.util.DisplayMetrics; import android.util.EventLog; @@ -1696,7 +1696,7 @@ public final class ActivityThread { ApplicationInfo ai = null; try { ai = getPackageManager().getApplicationInfo(packageName, - PackageManager.GET_SHARED_LIBRARY_FILES, UserId.myUserId()); + PackageManager.GET_SHARED_LIBRARY_FILES, UserHandle.myUserId()); } catch (RemoteException e) { // Ignore } @@ -1713,7 +1713,7 @@ public final class ActivityThread { boolean includeCode = (flags&Context.CONTEXT_INCLUDE_CODE) != 0; boolean securityViolation = includeCode && ai.uid != 0 && ai.uid != Process.SYSTEM_UID && (mBoundApplication != null - ? !UserId.isSameApp(ai.uid, mBoundApplication.appInfo.uid) + ? !UserHandle.isSameApp(ai.uid, mBoundApplication.appInfo.uid) : true); if ((flags&(Context.CONTEXT_INCLUDE_CODE |Context.CONTEXT_IGNORE_SECURITY)) diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 9b59e2ce1017..115c867e44c1 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -50,7 +50,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Process; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.util.Log; import java.lang.ref.WeakReference; @@ -69,7 +69,7 @@ final class ApplicationPackageManager extends PackageManager { public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException { try { - PackageInfo pi = mPM.getPackageInfo(packageName, flags, UserId.myUserId()); + PackageInfo pi = mPM.getPackageInfo(packageName, flags, UserHandle.myUserId()); if (pi != null) { return pi; } @@ -199,7 +199,7 @@ final class ApplicationPackageManager extends PackageManager { public ApplicationInfo getApplicationInfo(String packageName, int flags) throws NameNotFoundException { try { - ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, UserId.myUserId()); + ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, UserHandle.myUserId()); if (ai != null) { return ai; } @@ -214,7 +214,7 @@ final class ApplicationPackageManager extends PackageManager { public ActivityInfo getActivityInfo(ComponentName className, int flags) throws NameNotFoundException { try { - ActivityInfo ai = mPM.getActivityInfo(className, flags, UserId.myUserId()); + ActivityInfo ai = mPM.getActivityInfo(className, flags, UserHandle.myUserId()); if (ai != null) { return ai; } @@ -229,7 +229,7 @@ final class ApplicationPackageManager extends PackageManager { public ActivityInfo getReceiverInfo(ComponentName className, int flags) throws NameNotFoundException { try { - ActivityInfo ai = mPM.getReceiverInfo(className, flags, UserId.myUserId()); + ActivityInfo ai = mPM.getReceiverInfo(className, flags, UserHandle.myUserId()); if (ai != null) { return ai; } @@ -244,7 +244,7 @@ final class ApplicationPackageManager extends PackageManager { public ServiceInfo getServiceInfo(ComponentName className, int flags) throws NameNotFoundException { try { - ServiceInfo si = mPM.getServiceInfo(className, flags, UserId.myUserId()); + ServiceInfo si = mPM.getServiceInfo(className, flags, UserHandle.myUserId()); if (si != null) { return si; } @@ -259,7 +259,7 @@ final class ApplicationPackageManager extends PackageManager { public ProviderInfo getProviderInfo(ComponentName className, int flags) throws NameNotFoundException { try { - ProviderInfo pi = mPM.getProviderInfo(className, flags, UserId.myUserId()); + ProviderInfo pi = mPM.getProviderInfo(className, flags, UserHandle.myUserId()); if (pi != null) { return pi; } @@ -424,7 +424,7 @@ final class ApplicationPackageManager extends PackageManager { @SuppressWarnings("unchecked") @Override public List<ApplicationInfo> getInstalledApplications(int flags) { - int userId = UserId.getUserId(Process.myUid()); + int userId = UserHandle.getUserId(Process.myUid()); try { final List<ApplicationInfo> applicationInfos = new ArrayList<ApplicationInfo>(); ApplicationInfo lastItem = null; @@ -448,7 +448,7 @@ final class ApplicationPackageManager extends PackageManager { return mPM.resolveIntent( intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), - flags, UserId.myUserId()); + flags, UserHandle.myUserId()); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } @@ -462,7 +462,7 @@ final class ApplicationPackageManager extends PackageManager { intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), flags, - UserId.myUserId()); + UserHandle.myUserId()); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } @@ -494,7 +494,7 @@ final class ApplicationPackageManager extends PackageManager { try { return mPM.queryIntentActivityOptions(caller, specifics, specificTypes, intent, intent.resolveTypeIfNeeded(resolver), - flags, UserId.myUserId()); + flags, UserHandle.myUserId()); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } @@ -507,7 +507,7 @@ final class ApplicationPackageManager extends PackageManager { intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), flags, - UserId.myUserId()); + UserHandle.myUserId()); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } @@ -520,7 +520,7 @@ final class ApplicationPackageManager extends PackageManager { intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), flags, - UserId.myUserId()); + UserHandle.myUserId()); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } @@ -533,7 +533,7 @@ final class ApplicationPackageManager extends PackageManager { intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), flags, - UserId.myUserId()); + UserHandle.myUserId()); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } @@ -543,7 +543,7 @@ final class ApplicationPackageManager extends PackageManager { public ProviderInfo resolveContentProvider(String name, int flags) { try { - return mPM.resolveContentProvider(name, flags, UserId.myUserId()); + return mPM.resolveContentProvider(name, flags, UserHandle.myUserId()); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } @@ -1033,7 +1033,7 @@ final class ApplicationPackageManager extends PackageManager { public void clearApplicationUserData(String packageName, IPackageDataObserver observer) { try { - mPM.clearApplicationUserData(packageName, observer, UserId.myUserId()); + mPM.clearApplicationUserData(packageName, observer, UserHandle.myUserId()); } catch (RemoteException e) { // Should never happen! } @@ -1146,7 +1146,7 @@ final class ApplicationPackageManager extends PackageManager { public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags) { try { - mPM.setComponentEnabledSetting(componentName, newState, flags, UserId.myUserId()); + mPM.setComponentEnabledSetting(componentName, newState, flags, UserHandle.myUserId()); } catch (RemoteException e) { // Should never happen! } @@ -1155,7 +1155,7 @@ final class ApplicationPackageManager extends PackageManager { @Override public int getComponentEnabledSetting(ComponentName componentName) { try { - return mPM.getComponentEnabledSetting(componentName, UserId.myUserId()); + return mPM.getComponentEnabledSetting(componentName, UserHandle.myUserId()); } catch (RemoteException e) { // Should never happen! } @@ -1166,7 +1166,7 @@ final class ApplicationPackageManager extends PackageManager { public void setApplicationEnabledSetting(String packageName, int newState, int flags) { try { - mPM.setApplicationEnabledSetting(packageName, newState, flags, UserId.myUserId()); + mPM.setApplicationEnabledSetting(packageName, newState, flags, UserHandle.myUserId()); } catch (RemoteException e) { // Should never happen! } @@ -1175,7 +1175,7 @@ final class ApplicationPackageManager extends PackageManager { @Override public int getApplicationEnabledSetting(String packageName) { try { - return mPM.getApplicationEnabledSetting(packageName, UserId.myUserId()); + return mPM.getApplicationEnabledSetting(packageName, UserHandle.myUserId()); } catch (RemoteException e) { // Should never happen! } diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index fd4c304e19ca..ed4f0a7d942a 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -87,7 +87,7 @@ import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.UserId; +import android.os.UserHandle; import android.os.SystemVibrator; import android.os.UserManager; import android.os.storage.StorageManager; @@ -1259,7 +1259,7 @@ class ContextImpl extends Context { @Override public boolean bindService(Intent service, ServiceConnection conn, int flags) { - return bindService(service, conn, flags, UserId.getUserId(Process.myUid())); + return bindService(service, conn, flags, UserHandle.getUserId(Process.myUid())); } /** @hide */ diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index f4195d68794a..1e89bb2f1a98 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -37,7 +37,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.StrictMode; import android.os.Trace; -import android.os.UserId; +import android.os.UserHandle; import android.util.AndroidRuntimeException; import android.util.Slog; import android.view.CompatibilityInfoHolder; @@ -120,8 +120,8 @@ public final class LoadedApk { final int myUid = Process.myUid(); mResDir = aInfo.uid == myUid ? aInfo.sourceDir : aInfo.publicSourceDir; - if (!UserId.isSameUser(aInfo.uid, myUid) && !Process.isIsolated()) { - aInfo.dataDir = PackageManager.getDataDirForUser(UserId.getUserId(myUid), + if (!UserHandle.isSameUser(aInfo.uid, myUid) && !Process.isIsolated()) { + aInfo.dataDir = PackageManager.getDataDirForUser(UserHandle.getUserId(myUid), mPackageName); } mSharedLibraries = aInfo.sharedLibraryFiles; @@ -195,7 +195,7 @@ public final class LoadedApk { ApplicationInfo ai = null; try { ai = ActivityThread.getPackageManager().getApplicationInfo(packageName, - PackageManager.GET_SHARED_LIBRARY_FILES, UserId.myUserId()); + PackageManager.GET_SHARED_LIBRARY_FILES, UserHandle.myUserId()); } catch (RemoteException e) { throw new AssertionError(e); } @@ -358,7 +358,7 @@ public final class LoadedApk { IPackageManager pm = ActivityThread.getPackageManager(); android.content.pm.PackageInfo pi; try { - pi = pm.getPackageInfo(mPackageName, 0, UserId.myUserId()); + pi = pm.getPackageInfo(mPackageName, 0, UserHandle.myUserId()); } catch (RemoteException e) { throw new AssertionError(e); } diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index c320ee399606..f638f7e034c1 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -27,7 +27,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; -import android.os.UserId; +import android.os.UserHandle; import android.util.AndroidException; /** @@ -651,7 +651,7 @@ public final class PendingIntent implements Parcelable { try { int uid = ActivityManagerNative.getDefault() .getUidForIntentSender(mTarget); - return uid > 0 ? UserId.getUserId(uid) : -1; + return uid > 0 ? UserHandle.getUserId(uid) : -1; } catch (RemoteException e) { // Should never happen. return -1; diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index b8c99373e407..43a163dcf067 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -31,7 +31,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.UserId; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import android.util.Slog; @@ -847,7 +847,7 @@ public class SearchManager * @hide */ public Intent getAssistIntent(Context context) { - return getAssistIntent(context, UserId.myUserId()); + return getAssistIntent(context, UserHandle.myUserId()); } /** diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index b22179e71843..8a69c3af17c8 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -35,7 +35,7 @@ import android.os.OperationCanceledException; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.util.Log; import java.io.File; diff --git a/core/java/android/content/ContentService.java b/core/java/android/content/ContentService.java index 1a07504f2fbe..472fe9480bfa 100644 --- a/core/java/android/content/ContentService.java +++ b/core/java/android/content/ContentService.java @@ -26,7 +26,7 @@ import android.os.IBinder; import android.os.Parcel; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.UserId; +import android.os.UserHandle; import android.util.Log; import android.util.SparseIntArray; import android.Manifest; @@ -168,7 +168,7 @@ public final class ContentService extends IContentService.Stub { + ", syncToNetwork " + syncToNetwork); } - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); // This makes it so that future permission checks will be in the context of this // process rather than the caller's process. We will restore this before returning. long identityToken = clearCallingIdentity(); @@ -236,7 +236,7 @@ public final class ContentService extends IContentService.Stub { public void requestSync(Account account, String authority, Bundle extras) { ContentResolver.validateSyncExtrasBundle(extras); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); // This makes it so that future permission checks will be in the context of this // process rather than the caller's process. We will restore this before returning. @@ -259,7 +259,7 @@ public final class ContentService extends IContentService.Stub { * @param authority filter the pending and active syncs to cancel using this authority */ public void cancelSync(Account account, String authority) { - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); // This makes it so that future permission checks will be in the context of this // process rather than the caller's process. We will restore this before returning. @@ -294,7 +294,7 @@ public final class ContentService extends IContentService.Stub { public boolean getSyncAutomatically(Account account, String providerName) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS, "no permission to read the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -312,7 +312,7 @@ public final class ContentService extends IContentService.Stub { public void setSyncAutomatically(Account account, String providerName, boolean sync) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -330,7 +330,7 @@ public final class ContentService extends IContentService.Stub { long pollFrequency) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -344,7 +344,7 @@ public final class ContentService extends IContentService.Stub { public void removePeriodicSync(Account account, String authority, Bundle extras) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -358,7 +358,7 @@ public final class ContentService extends IContentService.Stub { public List<PeriodicSync> getPeriodicSyncs(Account account, String providerName) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS, "no permission to read the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -372,7 +372,7 @@ public final class ContentService extends IContentService.Stub { public int getIsSyncable(Account account, String providerName) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS, "no permission to read the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -390,7 +390,7 @@ public final class ContentService extends IContentService.Stub { public void setIsSyncable(Account account, String providerName, int syncable) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -407,7 +407,7 @@ public final class ContentService extends IContentService.Stub { public boolean getMasterSyncAutomatically() { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS, "no permission to read the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -424,7 +424,7 @@ public final class ContentService extends IContentService.Stub { public void setMasterSyncAutomatically(boolean flag) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -440,7 +440,7 @@ public final class ContentService extends IContentService.Stub { public boolean isSyncActive(Account account, String authority) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS, "no permission to read the sync stats"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -458,7 +458,7 @@ public final class ContentService extends IContentService.Stub { public List<SyncInfo> getCurrentSyncs() { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS, "no permission to read the sync stats"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -471,7 +471,7 @@ public final class ContentService extends IContentService.Stub { public SyncStatusInfo getSyncStatus(Account account, String authority) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS, "no permission to read the sync stats"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -489,7 +489,7 @@ public final class ContentService extends IContentService.Stub { public boolean isSyncPending(Account account, String authority) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS, "no permission to read the sync stats"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index 961864564be5..18014886491b 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -27,7 +27,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; -import android.os.UserId; +import android.os.UserHandle; import android.util.AndroidException; @@ -257,7 +257,7 @@ public class IntentSender implements Parcelable { try { int uid = ActivityManagerNative.getDefault() .getUidForIntentSender(mTarget); - return uid > 0 ? UserId.getUserId(uid) : -1; + return uid > 0 ? UserHandle.getUserId(uid) : -1; } catch (RemoteException e) { // Should never happen. return -1; diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java index e6303b9544db..3d3ff51a1f85 100644 --- a/core/java/android/content/SyncManager.java +++ b/core/java/android/content/SyncManager.java @@ -52,7 +52,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; -import android.os.UserId; +import android.os.UserHandle; import android.os.UserManager; import android.os.WorkSource; import android.provider.Settings; @@ -174,7 +174,7 @@ public class SyncManager implements OnAccountsUpdateListener { Log.v(TAG, "Internal storage is low."); } mStorageIsLow = true; - cancelActiveSync(null /* any account */, UserId.USER_ALL, + cancelActiveSync(null /* any account */, UserHandle.USER_ALL, null /* any authority */); } else if (Intent.ACTION_DEVICE_STORAGE_OK.equals(action)) { if (Log.isLoggable(TAG, Log.VERBOSE)) { @@ -195,7 +195,7 @@ public class SyncManager implements OnAccountsUpdateListener { private BroadcastReceiver mBackgroundDataSettingChanged = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (getConnectivityManager().getBackgroundDataSetting()) { - scheduleSync(null /* account */, UserId.USER_ALL, null /* authority */, + scheduleSync(null /* account */, UserHandle.USER_ALL, null /* authority */, new Bundle(), 0 /* delay */, false /* onlyThoseWithUnknownSyncableState */); } @@ -287,7 +287,7 @@ public class SyncManager implements OnAccountsUpdateListener { // a chance to set their syncable state. boolean onlyThoseWithUnkownSyncableState = justBootedUp; - scheduleSync(null, UserId.USER_ALL, null, null, 0 /* no delay */, + scheduleSync(null, UserHandle.USER_ALL, null, null, 0 /* no delay */, onlyThoseWithUnkownSyncableState); } } @@ -371,7 +371,7 @@ public class SyncManager implements OnAccountsUpdateListener { mSyncAdapters.setListener(new RegisteredServicesCacheListener<SyncAdapterType>() { public void onServiceChanged(SyncAdapterType type, boolean removed) { if (!removed) { - scheduleSync(null, UserId.USER_ALL, type.authority, null, 0 /* no delay */, + scheduleSync(null, UserHandle.USER_ALL, type.authority, null, 0 /* no delay */, false /* onlyThoseWithUnkownSyncableState */); } } @@ -517,7 +517,7 @@ public class SyncManager implements OnAccountsUpdateListener { } AccountAndUser[] accounts; - if (requestedAccount != null && userId != UserId.USER_ALL) { + if (requestedAccount != null && userId != UserHandle.USER_ALL) { accounts = new AccountAndUser[] { new AccountAndUser(requestedAccount, userId) }; } else { // if the accounts aren't configured yet then we can't support an account-less @@ -2180,7 +2180,7 @@ public class SyncManager implements OnAccountsUpdateListener { } } // check if the userid matches - if (userId != UserId.USER_ALL + if (userId != UserHandle.USER_ALL && userId != activeSyncContext.mSyncOperation.userId) { continue; } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index d906401bc0bb..ac750401a64e 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -28,7 +28,7 @@ import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.PatternMatcher; -import android.os.UserId; +import android.os.UserHandle; import android.util.AttributeSet; import android.util.Base64; import android.util.DisplayMetrics; @@ -249,7 +249,7 @@ public class PackageParser { return generatePackageInfo(p, gids, flags, firstInstallTime, lastUpdateTime, grantedPermissions, false, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, - UserId.getCallingUserId()); + UserHandle.getCallingUserId()); } /** @@ -263,7 +263,7 @@ public class PackageParser { HashSet<String> grantedPermissions, boolean stopped, int enabledState) { return generatePackageInfo(p, gids, flags, firstInstallTime, lastUpdateTime, - grantedPermissions, stopped, enabledState, UserId.getCallingUserId()); + grantedPermissions, stopped, enabledState, UserHandle.getCallingUserId()); } public static PackageInfo generatePackageInfo(PackageParser.Package p, @@ -3478,7 +3478,7 @@ public class PackageParser { public static ApplicationInfo generateApplicationInfo(Package p, int flags, boolean stopped, int enabledState) { - return generateApplicationInfo(p, flags, stopped, enabledState, UserId.getCallingUserId()); + return generateApplicationInfo(p, flags, stopped, enabledState, UserHandle.getCallingUserId()); } public static ApplicationInfo generateApplicationInfo(Package p, int flags, @@ -3508,7 +3508,7 @@ public class PackageParser { // Make shallow copy so we can store the metadata/libraries safely ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); if (userId != 0) { - ai.uid = UserId.getUid(userId, ai.uid); + ai.uid = UserHandle.getUid(userId, ai.uid); ai.dataDir = PackageManager.getDataDirForUser(userId, ai.packageName); } if ((flags & PackageManager.GET_META_DATA) != 0) { @@ -3616,7 +3616,7 @@ public class PackageParser { int enabledState, int userId) { if (s == null) return null; if (!copyNeeded(flags, s.owner, enabledState, s.metaData) - && userId == UserId.getUserId(s.info.applicationInfo.uid)) { + && userId == UserHandle.getUserId(s.info.applicationInfo.uid)) { return s.info; } // Make shallow copies so we can store the metadata safely diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 7b51119c1657..5d404568591e 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -82,7 +82,7 @@ public class Binder implements IBinder { * @hide */ public static final int getOrigCallingUid() { - if (UserId.MU_ENABLED) { + if (UserHandle.MU_ENABLED) { return getOrigCallingUidNative(); } else { return getCallingUid(); @@ -97,7 +97,7 @@ public class Binder implements IBinder { * @hide */ public static final int getOrigCallingUser() { - return UserId.getUserId(getOrigCallingUid()); + return UserHandle.getUserId(getOrigCallingUid()); } /** diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 93860aa859a7..5118f1af520a 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -654,7 +654,7 @@ public class Process { * distinct apps running under it each with their own uid. */ public static final int myUserHandle() { - return UserId.getUserId(myUid()); + return UserHandle.getUserId(myUid()); } /** @@ -662,7 +662,7 @@ public class Process { * @hide */ public static final boolean isIsolated() { - int uid = UserId.getAppId(myUid()); + int uid = UserHandle.getAppId(myUid()); return uid >= FIRST_ISOLATED_UID && uid <= LAST_ISOLATED_UID; } diff --git a/core/java/android/os/UserId.java b/core/java/android/os/UserHandle.java index 18a3062df575..577a8c61c57f 100644 --- a/core/java/android/os/UserId.java +++ b/core/java/android/os/UserHandle.java @@ -17,9 +17,10 @@ package android.os; /** + * Representation of a user on the device. * @hide */ -public final class UserId { +public final class UserHandle { /** * Range of IDs allocated for a user. * @@ -70,7 +71,7 @@ public final class UserId { public static boolean isApp(int uid) { if (uid > 0) { - uid = UserId.getAppId(uid); + uid = UserHandle.getAppId(uid); return uid >= Process.FIRST_APPLICATION_UID && uid <= Process.LAST_APPLICATION_UID; } else { return false; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e08ec1ffbcfa..6dbba4674d0d 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -41,7 +41,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; -import android.os.UserId; +import android.os.UserHandle; import android.speech.tts.TextToSpeech; import android.text.TextUtils; import android.util.AndroidException; @@ -2336,7 +2336,7 @@ public final class Settings { if (sLockSettings != null && !sIsSystemProcess && MOVED_TO_LOCK_SETTINGS.contains(name)) { try { - return sLockSettings.getString(name, "0", UserId.getCallingUserId()); + return sLockSettings.getString(name, "0", UserHandle.getCallingUserId()); } catch (RemoteException re) { // Fall through } diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java index b4f5e121d208..df85b2f8c61d 100644 --- a/core/java/android/server/search/SearchManagerService.java +++ b/core/java/android/server/search/SearchManagerService.java @@ -37,7 +37,7 @@ import android.database.ContentObserver; import android.os.Binder; import android.os.Process; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.util.Log; @@ -186,45 +186,45 @@ public class SearchManagerService extends ISearchManager.Stub { Log.e(TAG, "getSearchableInfo(), activity == null"); return null; } - return getSearchables(UserId.getCallingUserId()).getSearchableInfo(launchActivity); + return getSearchables(UserHandle.getCallingUserId()).getSearchableInfo(launchActivity); } /** * Returns a list of the searchable activities that can be included in global search. */ public List<SearchableInfo> getSearchablesInGlobalSearch() { - return getSearchables(UserId.getCallingUserId()).getSearchablesInGlobalSearchList(); + return getSearchables(UserHandle.getCallingUserId()).getSearchablesInGlobalSearchList(); } public List<ResolveInfo> getGlobalSearchActivities() { - return getSearchables(UserId.getCallingUserId()).getGlobalSearchActivities(); + return getSearchables(UserHandle.getCallingUserId()).getGlobalSearchActivities(); } /** * Gets the name of the global search activity. */ public ComponentName getGlobalSearchActivity() { - return getSearchables(UserId.getCallingUserId()).getGlobalSearchActivity(); + return getSearchables(UserHandle.getCallingUserId()).getGlobalSearchActivity(); } /** * Gets the name of the web search activity. */ public ComponentName getWebSearchActivity() { - return getSearchables(UserId.getCallingUserId()).getWebSearchActivity(); + return getSearchables(UserHandle.getCallingUserId()).getWebSearchActivity(); } @Override public ComponentName getAssistIntent(int userHandle) { try { - if (userHandle != UserId.getCallingUserId()) { + if (userHandle != UserHandle.getCallingUserId()) { // Requesting a different user, make sure that they have the permission if (ActivityManager.checkComponentPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, Binder.getCallingUid(), -1, true) == PackageManager.PERMISSION_GRANTED) { // Translate to the current user id, if caller wasn't aware - if (userHandle == UserId.USER_CURRENT) { + if (userHandle == UserHandle.USER_CURRENT) { long identity = Binder.clearCallingIdentity(); userHandle = ActivityManagerNative.getDefault().getCurrentUser().id; Binder.restoreCallingIdentity(identity); @@ -232,7 +232,7 @@ public class SearchManagerService extends ISearchManager.Stub { } else { String msg = "Permission Denial: " + "Request to getAssistIntent for " + userHandle - + " but is calling from user " + UserId.getCallingUserId() + + " but is calling from user " + UserHandle.getCallingUserId() + "; this requires " + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; Slog.w(TAG, msg); diff --git a/core/java/android/util/FloatMath.java b/core/java/android/util/FloatMath.java index 1d4eda41473c..e05169ad6ddf 100644 --- a/core/java/android/util/FloatMath.java +++ b/core/java/android/util/FloatMath.java @@ -80,4 +80,14 @@ public class FloatMath { * @return the exponential of value */ public static native float exp(float value); + + /** + * Returns {@code sqrt(}<i>{@code x}</i><sup>{@code 2}</sup>{@code +} <i> + * {@code y}</i><sup>{@code 2}</sup>{@code )}. + * + * @param x a float number + * @param y a float number + * @return the hypotenuse + */ + public static native float hypot(float x, float y); } diff --git a/core/java/android/util/Spline.java b/core/java/android/util/Spline.java new file mode 100644 index 000000000000..ed027eb18166 --- /dev/null +++ b/core/java/android/util/Spline.java @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.util; + +/** + * Performs spline interpolation given a set of control points. + * @hide + */ +public final class Spline { + private final float[] mX; + private final float[] mY; + private final float[] mM; + + private Spline(float[] x, float[] y, float[] m) { + mX = x; + mY = y; + mM = m; + } + + /** + * Creates a monotone cubic spline from a given set of control points. + * + * The spline is guaranteed to pass through each control point exactly. + * Moreover, assuming the control points are monotonic (Y is non-decreasing or + * non-increasing) then the interpolated values will also be monotonic. + * + * This function uses the Fritsch-Carlson method for computing the spline parameters. + * http://en.wikipedia.org/wiki/Monotone_cubic_interpolation + * + * @param x The X component of the control points, strictly increasing. + * @param y The Y component of the control points, monotonic. + * @return + * + * @throws IllegalArgumentException if the X or Y arrays are null, have + * different lengths or have fewer than 2 values. + * @throws IllegalArgumentException if the control points are not monotonic. + */ + public static Spline createMonotoneCubicSpline(float[] x, float[] y) { + if (x == null || y == null || x.length != y.length || x.length < 2) { + throw new IllegalArgumentException("There must be at least two control " + + "points and the arrays must be of equal length."); + } + + final int n = x.length; + float[] d = new float[n - 1]; // could optimize this out + float[] m = new float[n]; + + // Compute slopes of secant lines between successive points. + for (int i = 0; i < n - 1; i++) { + float h = x[i + 1] - x[i]; + if (h <= 0f) { + throw new IllegalArgumentException("The control points must all " + + "have strictly increasing X values."); + } + d[i] = (y[i + 1] - y[i]) / h; + } + + // Initialize the tangents as the average of the secants. + m[0] = d[0]; + for (int i = 1; i < n - 1; i++) { + m[i] = (d[i - 1] + d[i]) * 0.5f; + } + m[n - 1] = d[n - 2]; + + // Update the tangents to preserve monotonicity. + for (int i = 0; i < n - 1; i++) { + if (d[i] == 0f) { // successive Y values are equal + m[i] = 0f; + m[i + 1] = 0f; + } else { + float a = m[i] / d[i]; + float b = m[i + 1] / d[i]; + if (a < 0f || b < 0f) { + throw new IllegalArgumentException("The control points must have " + + "monotonic Y values."); + } + float h = FloatMath.hypot(a, b); + if (h > 9f) { + float t = 3f / h; + m[i] = t * a * d[i]; + m[i + 1] = t * b * d[i]; + } + } + } + return new Spline(x, y, m); + } + + /** + * Interpolates the value of Y = f(X) for given X. + * Clamps X to the domain of the spline. + * + * @param x The X value. + * @return The interpolated Y = f(X) value. + */ + public float interpolate(float x) { + // Handle the boundary cases. + final int n = mX.length; + if (Float.isNaN(x)) { + return x; + } + if (x <= mX[0]) { + return mY[0]; + } + if (x >= mX[n - 1]) { + return mY[n - 1]; + } + + // Find the index 'i' of the last point with smaller X. + // We know this will be within the spline due to the boundary tests. + int i = 0; + while (x >= mX[i + 1]) { + i += 1; + if (x == mX[i]) { + return mY[i]; + } + } + + // Perform cubic Hermite spline interpolation. + float h = mX[i + 1] - mX[i]; + float t = (x - mX[i]) / h; + return (mY[i] * (1 + 2 * t) + h * mM[i] * t) * (1 - t) * (1 - t) + + (mY[i + 1] * (3 - 2 * t) + h * mM[i + 1] * (t - 1)) * t * t; + } + + // For debugging. + @Override + public String toString() { + StringBuilder str = new StringBuilder(); + final int n = mX.length; + str.append("["); + for (int i = 0; i < n; i++) { + if (i != 0) { + str.append(", "); + } + str.append("(").append(mX[i]); + str.append(", ").append(mY[i]); + str.append(": ").append(mM[i]).append(")"); + } + str.append("]"); + return str.toString(); + } +} diff --git a/core/java/android/webkit/DeviceOrientationService.java b/core/java/android/webkit/DeviceOrientationService.java index 2e8656c54364..a4d240dc9f3a 100755 --- a/core/java/android/webkit/DeviceOrientationService.java +++ b/core/java/android/webkit/DeviceOrientationService.java @@ -123,7 +123,7 @@ final class DeviceOrientationService implements SensorEventListener { // The angles are in radians float[] rotationAngles = new float[3]; SensorManager.getOrientation(deviceRotationMatrix, rotationAngles); - double alpha = Math.toDegrees(-rotationAngles[0]) - 90.0; + double alpha = Math.toDegrees(-rotationAngles[0]); while (alpha < 0.0) { alpha += 360.0; } // [0, 360) double beta = Math.toDegrees(-rotationAngles[1]); while (beta < -180.0) { beta += 360.0; } // [-180, 180) diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 84fe8cefa784..e63c57f47d80 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -37,7 +37,7 @@ import android.os.Bundle; import android.os.PatternMatcher; import android.os.Process; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -133,7 +133,7 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte mAdapter = new ResolveListAdapter(this, intent, initialIntents, rList, mLaunchedFromUid); int count = mAdapter.getCount(); - if (mLaunchedFromUid < 0 || UserId.isIsolated(mLaunchedFromUid)) { + if (mLaunchedFromUid < 0 || UserHandle.isIsolated(mLaunchedFromUid)) { // Gulp! finish(); return; diff --git a/core/java/com/android/internal/statusbar/StatusBarNotification.java b/core/java/com/android/internal/statusbar/StatusBarNotification.java index 540d134937e8..cb87ac4729a5 100644 --- a/core/java/com/android/internal/statusbar/StatusBarNotification.java +++ b/core/java/com/android/internal/statusbar/StatusBarNotification.java @@ -19,7 +19,7 @@ package com.android.internal.statusbar; import android.app.Notification; import android.os.Parcel; import android.os.Parcelable; -import android.os.UserId; +import android.os.UserHandle; import android.widget.RemoteViews; @@ -136,7 +136,7 @@ public class StatusBarNotification implements Parcelable { /** Returns a userHandle for the instance of the app that posted this notification. */ public int getUserId() { - return UserId.getUserId(this.uid); + return UserHandle.getUserId(this.uid); } } diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index f77e8f3c6b96..4777c1621ae5 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -34,7 +34,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.os.storage.IMountService; import android.provider.Settings; import android.security.KeyStore; @@ -246,7 +246,7 @@ public class LockPatternUtils { if (callingUid == android.os.Process.SYSTEM_UID) { return mCurrentUserId; } else { - return UserId.getUserId(callingUid); + return UserHandle.getUserId(callingUid); } } diff --git a/core/java/com/android/internal/widget/LockSettingsService.java b/core/java/com/android/internal/widget/LockSettingsService.java index 2fb81ac7b069..350e006d3595 100644 --- a/core/java/com/android/internal/widget/LockSettingsService.java +++ b/core/java/com/android/internal/widget/LockSettingsService.java @@ -25,7 +25,7 @@ import android.database.sqlite.SQLiteOpenHelper; import android.os.Binder; import android.os.RemoteException; import android.os.SystemProperties; -import android.os.UserId; +import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.Secure; import android.text.TextUtils; @@ -97,7 +97,7 @@ public class LockSettingsService extends ILockSettings.Stub { private static final void checkWritePermission(int userId) { final int callingUid = Binder.getCallingUid(); - if (UserId.getAppId(callingUid) != android.os.Process.SYSTEM_UID) { + if (UserHandle.getAppId(callingUid) != android.os.Process.SYSTEM_UID) { throw new SecurityException("uid=" + callingUid + " not authorized to write lock settings"); } @@ -105,7 +105,7 @@ public class LockSettingsService extends ILockSettings.Stub { private static final void checkPasswordReadPermission(int userId) { final int callingUid = Binder.getCallingUid(); - if (UserId.getAppId(callingUid) != android.os.Process.SYSTEM_UID) { + if (UserHandle.getAppId(callingUid) != android.os.Process.SYSTEM_UID) { throw new SecurityException("uid=" + callingUid + " not authorized to read lock password"); } @@ -113,8 +113,8 @@ public class LockSettingsService extends ILockSettings.Stub { private static final void checkReadPermission(int userId) { final int callingUid = Binder.getCallingUid(); - if (UserId.getAppId(callingUid) != android.os.Process.SYSTEM_UID - && UserId.getUserId(callingUid) != userId) { + if (UserHandle.getAppId(callingUid) != android.os.Process.SYSTEM_UID + && UserHandle.getUserId(callingUid) != userId) { throw new SecurityException("uid=" + callingUid + " not authorized to read settings of user " + userId); } diff --git a/core/jni/android_util_FloatMath.cpp b/core/jni/android_util_FloatMath.cpp index e30756b5dee3..529fbe9b64a8 100644 --- a/core/jni/android_util_FloatMath.cpp +++ b/core/jni/android_util_FloatMath.cpp @@ -29,6 +29,10 @@ public: static float ExpF(JNIEnv* env, jobject clazz, float x) { return expf(x); } + + static float HypotF(JNIEnv* env, jobject clazz, float x, float y) { + return hypotf(x, y); + } }; static JNINativeMethod gMathUtilsMethods[] = { @@ -38,6 +42,7 @@ static JNINativeMethod gMathUtilsMethods[] = { {"cos", "(F)F", (void*) MathUtilsGlue::CosF}, {"sqrt", "(F)F", (void*) MathUtilsGlue::SqrtF}, {"exp", "(F)F", (void*) MathUtilsGlue::ExpF}, + {"hypot", "(FF)F", (void*) MathUtilsGlue::HypotF}, }; int register_android_util_FloatMath(JNIEnv* env) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index ee0ff8ed0450..e3c957beb7e9 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -533,13 +533,22 @@ <integer name="config_longPressOnHomeBehavior">2</integer> <!-- Array of light sensor LUX values to define our levels for auto backlight brightness support. - The N entries of this array define N + 1 zones as follows: + The N entries of this array define N + 1 control points as follows: - Zone 0: 0 <= LUX < array[0] - Zone 1: array[0] <= LUX < array[1] + Point 1: LUX <= 0 (implicit) + Point 2: 0 < level[1] == LUX < level[2] ... - Zone N: array[N - 1] <= LUX < array[N] - Zone N + 1: array[N] <= LUX < infinity + Point N: level[N - 1] == LUX < level[N] + Point N + 1: level[N] <= LUX < infinity + + The control points must be strictly increasing. Each control point + corresponds to an entry in the brightness backlight values arrays. + For example, if LUX == level[1] (first element of the levels array) + then the brightness will be determined by value[1] (first element + of the brightness values array). + + Spline interpolation is used to determine the auto-brightness + backlight values for LUX levels between these control points. Must be overridden in platform specific overlays --> <integer-array name="config_autoBrightnessLevels"> @@ -552,6 +561,7 @@ <!-- Array of output values for LCD backlight corresponding to the LUX values in the config_autoBrightnessLevels array. This array should have size one greater than the size of the config_autoBrightnessLevels array. + The brightness values must be between 0 and 255 and be non-decreasing. This must be overridden in platform specific overlays --> <integer-array name="config_autoBrightnessLcdBacklightValues"> </integer-array> @@ -559,6 +569,7 @@ <!-- Array of output values for button backlight corresponding to the LUX values in the config_autoBrightnessLevels array. This array should have size one greater than the size of the config_autoBrightnessLevels array. + The brightness values must be between 0 and 255 and be non-decreasing. This must be overridden in platform specific overlays --> <integer-array name="config_autoBrightnessButtonBacklightValues"> </integer-array> @@ -566,6 +577,7 @@ <!-- Array of output values for keyboard backlight corresponding to the LUX values in the config_autoBrightnessLevels array. This array should have size one greater than the size of the config_autoBrightnessLevels array. + The brightness values must be between 0 and 255 and be non-decreasing. This must be overridden in platform specific overlays --> <integer-array name="config_autoBrightnessKeyboardBacklightValues"> </integer-array> diff --git a/core/tests/coretests/src/android/content/pm/AppCacheTest.java b/core/tests/coretests/src/android/content/pm/AppCacheTest.java index 0c31e2d011f1..8d53db975423 100755 --- a/core/tests/coretests/src/android/content/pm/AppCacheTest.java +++ b/core/tests/coretests/src/android/content/pm/AppCacheTest.java @@ -24,7 +24,7 @@ import android.content.IntentFilter; import android.os.RemoteException; import android.os.ServiceManager; import android.os.StatFs; -import android.os.UserId; +import android.os.UserHandle; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; @@ -719,7 +719,7 @@ public class AppCacheTest extends AndroidTestCase { File getDataDir() { try { ApplicationInfo appInfo = getPm().getApplicationInfo(mContext.getPackageName(), 0, - UserId.myUserId()); + UserHandle.myUserId()); return new File(appInfo.dataDir); } catch (RemoteException e) { throw new RuntimeException("Pacakge manager dead", e); @@ -748,7 +748,7 @@ public class AppCacheTest extends AndroidTestCase { @LargeTest public void testClearApplicationUserDataNoObserver() throws Exception { - getPm().clearApplicationUserData(mContext.getPackageName(), null, UserId.myUserId()); + getPm().clearApplicationUserData(mContext.getPackageName(), null, UserHandle.myUserId()); //sleep for 1 minute Thread.sleep(60*1000); //confirm files dont exist diff --git a/core/tests/coretests/src/android/os/ProcessTest.java b/core/tests/coretests/src/android/os/ProcessTest.java index 598a8d2336cf..1f5b7c829831 100644 --- a/core/tests/coretests/src/android/os/ProcessTest.java +++ b/core/tests/coretests/src/android/os/ProcessTest.java @@ -18,7 +18,7 @@ package android.os; import android.os.Process; -import android.os.UserId; +import android.os.UserHandle; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; @@ -32,10 +32,10 @@ public class ProcessTest extends TestCase { assertEquals(android.os.Process.SYSTEM_UID, Process.getUidForName("system")); assertEquals(Process.BLUETOOTH_UID, Process.getUidForName("bluetooth")); assertEquals(Process.FIRST_APPLICATION_UID, Process.getUidForName("u0_a0")); - assertEquals(UserId.getUid(1, Process.SYSTEM_UID), Process.getUidForName("u1_system")); - assertEquals(UserId.getUid(2, Process.FIRST_ISOLATED_UID), + assertEquals(UserHandle.getUid(1, Process.SYSTEM_UID), Process.getUidForName("u1_system")); + assertEquals(UserHandle.getUid(2, Process.FIRST_ISOLATED_UID), Process.getUidForName("u2_i0")); - assertEquals(UserId.getUid(3, Process.FIRST_APPLICATION_UID + 100), + assertEquals(UserHandle.getUid(3, Process.FIRST_APPLICATION_UID + 100), Process.getUidForName("u3_a100")); } diff --git a/opengl/java/com/google/android/gles_jni/GLImpl.java b/opengl/java/com/google/android/gles_jni/GLImpl.java index 07f9e91c4d35..6b23be97a7f8 100644 --- a/opengl/java/com/google/android/gles_jni/GLImpl.java +++ b/opengl/java/com/google/android/gles_jni/GLImpl.java @@ -23,7 +23,7 @@ import android.app.AppGlobals; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.os.Build; -import android.os.UserId; +import android.os.UserHandle; import android.util.Log; import java.nio.Buffer; @@ -68,7 +68,7 @@ public class GLImpl implements GL10, GL10Ext, GL11, GL11Ext, GL11ExtensionPack { int version = 0; IPackageManager pm = AppGlobals.getPackageManager(); try { - ApplicationInfo applicationInfo = pm.getApplicationInfo(appName, 0, UserId.myUserId()); + ApplicationInfo applicationInfo = pm.getApplicationInfo(appName, 0, UserHandle.myUserId()); if (applicationInfo != null) { version = applicationInfo.targetSdkVersion; } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 4552a55d43a8..1481eb21466f 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -38,7 +38,6 @@ import android.text.TextUtils; import android.util.Log; import com.android.internal.content.PackageHelper; -import com.android.internal.telephony.BaseCommands; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RILConstants; @@ -65,7 +64,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion' // is properly propagated through your change. Not doing so will result in a loss of user // settings. - private static final int DATABASE_VERSION = 80; + private static final int DATABASE_VERSION = 81; private Context mContext; @@ -1073,9 +1072,55 @@ public class DatabaseHelper extends SQLiteOpenHelper { upgradeVersion = 79; } + if (upgradeVersion == 79) { + // Before touch exploration was a global setting controlled by the user + // via the UI. However, if the enabled accessibility services do not + // handle touch exploration mode, enabling it makes no sense. Therefore, + // now the services request touch exploration mode and the user is + // presented with a dialog to allow that and if she does we store that + // in the database. As a result of this change a user that has enabled + // accessibility, touch exploration, and some accessibility services + // may lose touch exploration state, thus rendering the device useless + // unless sighted help is provided, since the enabled service(s) are + // not in the list of services to which the user granted a permission + // to put the device in touch explore mode. Here we are allowing all + // enabled accessibility services to toggle touch exploration provided + // accessibility and touch exploration are enabled and no services can + // toggle touch exploration. Note that the user has already manually + // enabled the services and touch exploration which means the she has + // given consent to have these services work in touch exploration mode. + final boolean accessibilityEnabled = getIntValueFromTable(db, "secure", + Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1; + final boolean touchExplorationEnabled = getIntValueFromTable(db, "secure", + Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0) == 1; + if (accessibilityEnabled && touchExplorationEnabled) { + String enabledServices = getStringValueFromTable(db, "secure", + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, ""); + String touchExplorationGrantedServices = getStringValueFromTable(db, "secure", + Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, ""); + if (TextUtils.isEmpty(touchExplorationGrantedServices) + && !TextUtils.isEmpty(enabledServices)) { + SQLiteStatement stmt = null; + try { + db.beginTransaction(); + stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)" + + " VALUES(?,?);"); + loadSetting(stmt, + Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, + enabledServices); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + if (stmt != null) stmt.close(); + } + } + } + upgradeVersion = 80; + } + // vvv Jelly Bean MR1 changes begin here vvv - if (upgradeVersion == 79) { + if (upgradeVersion == 80) { // update screensaver settings db.beginTransaction(); SQLiteStatement stmt = null; @@ -1093,10 +1138,9 @@ public class DatabaseHelper extends SQLiteOpenHelper { db.endTransaction(); if (stmt != null) stmt.close(); } - upgradeVersion = 80; + upgradeVersion = 81; } - // *** Remember to update DATABASE_VERSION above! if (upgradeVersion != currentVersion) { @@ -1743,18 +1787,28 @@ public class DatabaseHelper extends SQLiteOpenHelper { } private int getIntValueFromSystem(SQLiteDatabase db, String name, int defaultValue) { - int value = defaultValue; + return getIntValueFromTable(db, "system", name, defaultValue); + } + + private int getIntValueFromTable(SQLiteDatabase db, String table, String name, + int defaultValue) { + String value = getStringValueFromTable(db, table, name, null); + return (value != null) ? Integer.parseInt(value) : defaultValue; + } + + private String getStringValueFromTable(SQLiteDatabase db, String table, String name, + String defaultValue) { Cursor c = null; try { - c = db.query("system", new String[] { Settings.System.VALUE }, "name='" + name + "'", + c = db.query(table, new String[] { Settings.System.VALUE }, "name='" + name + "'", null, null, null, null); if (c != null && c.moveToFirst()) { String val = c.getString(0); - value = val == null ? defaultValue : Integer.parseInt(val); + return val == null ? defaultValue : val; } } finally { if (c != null) c.close(); } - return value; + return defaultValue; } } diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java index b36e71a00cf3..a2f43fd0118b 100644 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java @@ -24,7 +24,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Resources; -import android.os.UserId; +import android.os.UserHandle; import android.os.Vibrator; import android.provider.Settings; import android.util.AttributeSet; @@ -75,14 +75,14 @@ public class SearchPanelView extends FrameLayout implements mBar.animateCollapse(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL); // Launch Assist Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, UserId.USER_CURRENT); + .getAssistIntent(mContext, UserHandle.USER_CURRENT); if (intent == null) return; try { ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, R.anim.search_launch_enter, R.anim.search_launch_exit, getHandler(), this); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivityAsUser(intent, opts.toBundle(), UserId.USER_CURRENT); + mContext.startActivityAsUser(intent, opts.toBundle(), UserHandle.USER_CURRENT); } catch (ActivityNotFoundException e) { Slog.w(TAG, "Activity not found for " + intent.getAction()); onAnimationStarted(); @@ -143,7 +143,7 @@ public class SearchPanelView extends FrameLayout implements private void maybeSwapSearchIcon() { Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, UserId.USER_CURRENT); + .getAssistIntent(mContext, UserHandle.USER_CURRENT); if (intent != null) { ComponentName component = intent.getComponent(); if (component == null || !mGlowPadView.replaceTargetDrawablesIfPresent(component, @@ -281,6 +281,6 @@ public class SearchPanelView extends FrameLayout implements public boolean isAssistantAvailable() { return ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, UserId.USER_CURRENT) != null; + .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null; } } diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java b/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java index 3e03f8573b5b..4d8c168a962a 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java @@ -30,7 +30,7 @@ import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Handler; import android.os.Process; -import android.os.UserId; +import android.os.UserHandle; import android.util.Log; import com.android.systemui.R; @@ -245,7 +245,7 @@ public class RecentTasksLoader { final List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasksForUser(MAX_TASKS, - ActivityManager.RECENT_IGNORE_UNAVAILABLE, UserId.USER_CURRENT); + ActivityManager.RECENT_IGNORE_UNAVAILABLE, UserHandle.USER_CURRENT); int numTasks = recentTasks.size(); ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME).resolveActivityInfo(pm, 0); diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java index bb647c3146a7..7d361520c979 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java @@ -36,7 +36,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.UserId; +import android.os.UserHandle; import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; @@ -790,7 +790,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_NEW_TASK); if (DEBUG) Log.v(TAG, "Starting activity " + intent); - context.startActivityAsUser(intent, opts.toBundle(), UserId.USER_CURRENT); + context.startActivityAsUser(intent, opts.toBundle(), UserHandle.USER_CURRENT); } if (usingDrawingCache) { holder.thumbnailViewImage.setDrawingCacheEnabled(false); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index c9c775353ba3..75985373973c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -49,7 +49,7 @@ import android.os.IBinder; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.UserId; +import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index 78ec4b6373ff..427cd8c9c969 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -69,8 +69,15 @@ public class PanelBar extends FrameLayout { return mPanels.get((int)(N * x / getMeasuredWidth())); } + public boolean isEnabled() { + return true; + } + @Override public boolean onTouchEvent(MotionEvent event) { + // Allow subclasses to implement enable/disable semantics + if (!isEnabled()) return false; + // figure out which panel needs to be talked to here if (event.getAction() == MotionEvent.ACTION_DOWN) { mTouchingPanel = selectPanelForTouchX(event.getX()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 4ce4e293790e..ad06c1b1f5c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -46,7 +46,7 @@ import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.provider.Settings; import android.service.dreams.IDreamManager; import android.util.DisplayMetrics; @@ -1309,10 +1309,6 @@ public class PhoneStatusBar extends BaseStatusBar { mGestureRec.add(event); - if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { - return false; - } - return false; } @@ -1787,7 +1783,7 @@ public class PhoneStatusBar extends BaseStatusBar { } catch (RemoteException e) { } v.getContext().startActivityAsUser(new Intent(Settings.ACTION_SETTINGS) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), UserId.USER_CURRENT); + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), UserHandle.USER_CURRENT); animateCollapse(); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 924e45d6d66d..a42e455c2bfc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone; import android.app.ActivityManager; +import android.app.StatusBarManager; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -70,6 +71,11 @@ public class PhoneStatusBarView extends PanelBar { } @Override + public boolean isEnabled() { + return ((mBar.mDisabled & StatusBarManager.DISABLE_EXPAND) == 0); + } + + @Override public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { if (super.onRequestSendAccessibilityEvent(child, event)) { // The status bar is very small so augment the view that the user is touching diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java index da161a95c247..ffe69e223e53 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java @@ -19,7 +19,7 @@ package com.android.systemui.statusbar.tablet; import android.app.StatusBarManager; import android.content.Context; import android.content.Intent; -import android.os.UserId; +import android.os.UserHandle; import android.provider.Settings; import android.util.AttributeSet; import android.util.Slog; @@ -119,7 +119,7 @@ public class SettingsView extends LinearLayout implements View.OnClickListener { // ---------------------------- private void onClickSettings() { getContext().startActivityAsUser(new Intent(Settings.ACTION_SETTINGS) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), UserId.USER_CURRENT); + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), UserHandle.USER_CURRENT); getStatusBarManager().collapse(); } } diff --git a/policy/src/com/android/internal/policy/impl/LockScreen.java b/policy/src/com/android/internal/policy/impl/LockScreen.java index 86451721adb6..5f5c1050ecb7 100644 --- a/policy/src/com/android/internal/policy/impl/LockScreen.java +++ b/policy/src/com/android/internal/policy/impl/LockScreen.java @@ -32,7 +32,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; -import android.os.UserId; +import android.os.UserHandle; import android.os.Vibrator; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -277,7 +277,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen { // Update the search icon with drawable from the search .apk if (!mSearchDisabled) { Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, UserId.USER_CURRENT); + .getAssistIntent(mContext, UserHandle.USER_CURRENT); if (intent != null) { // XXX Hack. We need to substitute the icon here but haven't formalized // the public API. The "_google" metadata will be going away, so @@ -313,7 +313,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen { case com.android.internal.R.drawable.ic_action_assist_generic: Intent assistIntent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, UserId.USER_CURRENT); + .getAssistIntent(mContext, UserHandle.USER_CURRENT); if (assistIntent != null) { launchActivity(assistIntent); } else { @@ -354,7 +354,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen { Log.w(TAG, "can't dismiss keyguard on launch"); } try { - mContext.startActivityAsUser(intent, UserId.USER_CURRENT); + mContext.startActivityAsUser(intent, UserHandle.USER_CURRENT); } catch (ActivityNotFoundException e) { Log.w(TAG, "Activity not found for intent + " + intent.getAction()); } @@ -532,7 +532,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen { } boolean searchActionAvailable = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, UserId.USER_CURRENT) != null; + .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null; mCameraDisabled = disabledByAdmin || disabledBySimState || !cameraTargetPresent; mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent; mUnlockWidgetMethods.updateResources(); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index c036e1b94835..b91eb00c3e31 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -54,7 +54,7 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UEventObserver; -import android.os.UserId; +import android.os.UserHandle; import android.os.Vibrator; import android.provider.Settings; @@ -2064,7 +2064,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (searchManager != null) { searchManager.stopSearch(); } - mContext.startActivityAsUser(intent, UserId.USER_CURRENT); + mContext.startActivityAsUser(intent, UserHandle.USER_CURRENT); } catch (ActivityNotFoundException e) { Slog.w(TAG, "No activity to handle assist long press action.", e); } @@ -2073,13 +2073,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { private void launchAssistAction() { sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST); Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, UserId.USER_CURRENT); + .getAssistIntent(mContext, UserHandle.USER_CURRENT); if (intent != null) { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); try { - mContext.startActivityAsUser(intent, UserId.USER_CURRENT); + mContext.startActivityAsUser(intent, UserHandle.USER_CURRENT); } catch (ActivityNotFoundException e) { Slog.w(TAG, "No activity to handle assist action.", e); } diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java index 48f967c4a4be..5250dfc351b0 100644 --- a/services/java/com/android/server/AppWidgetServiceImpl.java +++ b/services/java/com/android/server/AppWidgetServiceImpl.java @@ -43,7 +43,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.util.AtomicFile; import android.util.AttributeSet; import android.util.Log; @@ -593,7 +593,7 @@ class AppWidgetServiceImpl { private boolean callerHasBindAppWidgetPermission(String packageName) { int callingUid = Binder.getCallingUid(); try { - if (!UserId.isSameApp(callingUid, getUidForPackage(packageName))) { + if (!UserHandle.isSameApp(callingUid, getUidForPackage(packageName))) { return false; } } catch (Exception e) { @@ -665,7 +665,7 @@ class AppWidgetServiceImpl { mBoundRemoteViewsServices.remove(key); } - int userId = UserId.getUserId(id.provider.uid); + int userId = UserHandle.getUserId(id.provider.uid); // Bind to the RemoteViewsService (which will trigger a callback to the // RemoteViewsAdapter.onServiceConnected()) final long token = Binder.clearCallingIdentity(); @@ -756,7 +756,7 @@ class AppWidgetServiceImpl { } }; - int userId = UserId.getUserId(id.provider.uid); + int userId = UserHandle.getUserId(id.provider.uid); // Bind to the service and remove the static intent->factory mapping in the // RemoteViewsService. final long token = Binder.clearCallingIdentity(); @@ -1026,7 +1026,7 @@ class AppWidgetServiceImpl { } }; - int userId = UserId.getUserId(id.provider.uid); + int userId = UserHandle.getUserId(id.provider.uid); // Bind to the service and call onDataSetChanged() final long token = Binder.clearCallingIdentity(); try { @@ -1375,7 +1375,7 @@ class AppWidgetServiceImpl { throw new IllegalArgumentException("packageName and uid don't match packageName=" + packageName); } - if (!UserId.isSameApp(callingUid, packageUid)) { + if (!UserHandle.isSameApp(callingUid, packageUid)) { throw new IllegalArgumentException("packageName and uid don't match packageName=" + packageName); } diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 45428402d8d4..8be0ba8af3e7 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -65,7 +65,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.os.WorkSource; import android.os.storage.IMountService; import android.provider.Settings; @@ -4846,8 +4846,8 @@ class BackupManagerService extends IBackupManager.Stub { // ----- IBackupManager binder interface ----- public void dataChanged(final String packageName) { - final int callingUserHandle = UserId.getCallingUserId(); - if (callingUserHandle != UserId.USER_OWNER) { + final int callingUserHandle = UserHandle.getCallingUserId(); + if (callingUserHandle != UserHandle.USER_OWNER) { // App is running under a non-owner user profile. For now, we do not back // up data from secondary user profiles. // TODO: backups for all user profiles. @@ -4950,8 +4950,8 @@ class BackupManagerService extends IBackupManager.Stub { boolean doAllApps, boolean includeSystem, String[] pkgList) { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "fullBackup"); - final int callingUserHandle = UserId.getCallingUserId(); - if (callingUserHandle != UserId.USER_OWNER) { + final int callingUserHandle = UserHandle.getCallingUserId(); + if (callingUserHandle != UserHandle.USER_OWNER) { throw new IllegalStateException("Backup supported only for the device owner"); } @@ -5019,8 +5019,8 @@ class BackupManagerService extends IBackupManager.Stub { public void fullRestore(ParcelFileDescriptor fd) { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "fullRestore"); - final int callingUserHandle = UserId.getCallingUserId(); - if (callingUserHandle != UserId.USER_OWNER) { + final int callingUserHandle = UserHandle.getCallingUserId(); + if (callingUserHandle != UserHandle.USER_OWNER) { throw new IllegalStateException("Restore supported only for the device owner"); } diff --git a/services/java/com/android/server/ClipboardService.java b/services/java/com/android/server/ClipboardService.java index 8a6a5507041f..baf33a9c23d5 100644 --- a/services/java/com/android/server/ClipboardService.java +++ b/services/java/com/android/server/ClipboardService.java @@ -36,7 +36,7 @@ import android.os.Parcel; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; @@ -115,7 +115,7 @@ public class ClipboardService extends IClipboard.Stub { } private PerUserClipboard getClipboard() { - return getClipboard(UserId.getCallingUserId()); + return getClipboard(UserHandle.getCallingUserId()); } private PerUserClipboard getClipboard(int userId) { @@ -258,7 +258,7 @@ public class ClipboardService extends IClipboard.Stub { PackageInfo pi; try { pi = mPm.getPackageInfo(pkg, 0); - if (!UserId.isSameApp(pi.applicationInfo.uid, uid)) { + if (!UserHandle.isSameApp(pi.applicationInfo.uid, uid)) { throw new SecurityException("Calling uid " + uid + " does not own package " + pkg); } diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java index 04267a335294..bb5d55266c21 100644 --- a/services/java/com/android/server/MountService.java +++ b/services/java/com/android/server/MountService.java @@ -48,7 +48,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; -import android.os.UserId; +import android.os.UserHandle; import android.os.storage.IMountService; import android.os.storage.IMountServiceListener; import android.os.storage.IMountShutdownObserver; @@ -1713,7 +1713,7 @@ class MountService extends IMountService.Stub return false; } - final int packageUid = mPms.getPackageUid(packageName, UserId.getUserId(callerUid)); + final int packageUid = mPms.getPackageUid(packageName, UserHandle.getUserId(callerUid)); if (DEBUG_OBB) { Slog.d(TAG, "packageName = " + packageName + ", packageUid = " + diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 798915b7286f..a565d089b36c 100755 --- a/services/java/com/android/server/NotificationManagerService.java +++ b/services/java/com/android/server/NotificationManagerService.java @@ -48,7 +48,7 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.UserId; +import android.os.UserHandle; import android.os.Vibrator; import android.provider.Settings; import android.service.dreams.IDreamManager; @@ -1286,7 +1286,7 @@ public class NotificationManagerService extends INotificationManager.Stub try { ApplicationInfo ai = mContext.getPackageManager().getApplicationInfo( pkg, 0); - if (!UserId.isSameApp(ai.uid, uid)) { + if (!UserHandle.isSameApp(ai.uid, uid)) { throw new SecurityException("Calling uid " + uid + " gave package" + pkg + " which is owned by uid " + ai.uid); } diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java index d97d335a1d5c..c5243a2881ef 100644 --- a/services/java/com/android/server/WallpaperManagerService.java +++ b/services/java/com/android/server/WallpaperManagerService.java @@ -47,7 +47,7 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteCallbackList; import android.os.ServiceManager; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.service.wallpaper.IWallpaperConnection; import android.service.wallpaper.IWallpaperEngine; import android.service.wallpaper.IWallpaperService; @@ -483,7 +483,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { public void clearWallpaper() { if (DEBUG) Slog.v(TAG, "clearWallpaper"); synchronized (mLock) { - clearWallpaperLocked(false, UserId.getCallingUserId()); + clearWallpaperLocked(false, UserHandle.getCallingUserId()); } } @@ -520,7 +520,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { public void setDimensionHints(int width, int height) throws RemoteException { checkPermission(android.Manifest.permission.SET_WALLPAPER_HINTS); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); WallpaperData wallpaper = mWallpaperMap.get(userId); if (wallpaper == null) { throw new IllegalStateException("Wallpaper not yet initialized for user " + userId); @@ -551,14 +551,14 @@ class WallpaperManagerService extends IWallpaperManager.Stub { public int getWidthHint() throws RemoteException { synchronized (mLock) { - WallpaperData wallpaper = mWallpaperMap.get(UserId.getCallingUserId()); + WallpaperData wallpaper = mWallpaperMap.get(UserHandle.getCallingUserId()); return wallpaper.width; } } public int getHeightHint() throws RemoteException { synchronized (mLock) { - WallpaperData wallpaper = mWallpaperMap.get(UserId.getCallingUserId()); + WallpaperData wallpaper = mWallpaperMap.get(UserHandle.getCallingUserId()); return wallpaper.height; } } @@ -573,7 +573,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { if (callingUid == android.os.Process.SYSTEM_UID) { wallpaperUserId = mCurrentUserId; } else { - wallpaperUserId = UserId.getUserId(callingUid); + wallpaperUserId = UserHandle.getUserId(callingUid); } WallpaperData wallpaper = mWallpaperMap.get(wallpaperUserId); try { @@ -596,7 +596,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { } public WallpaperInfo getWallpaperInfo() { - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); synchronized (mLock) { WallpaperData wallpaper = mWallpaperMap.get(userId); if (wallpaper.connection != null) { @@ -608,7 +608,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { public ParcelFileDescriptor setWallpaper(String name) { if (DEBUG) Slog.v(TAG, "setWallpaper"); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); WallpaperData wallpaper = mWallpaperMap.get(userId); if (wallpaper == null) { throw new IllegalStateException("Wallpaper not yet initialized for user " + userId); @@ -651,7 +651,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { public void setWallpaperComponent(ComponentName name) { if (DEBUG) Slog.v(TAG, "setWallpaperComponent name=" + name); - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); WallpaperData wallpaper = mWallpaperMap.get(userId); if (wallpaper == null) { throw new IllegalStateException("Wallpaper not yet initialized for user " + userId); diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java index 632c2f29f98f..d8ccabb3fb93 100644 --- a/services/java/com/android/server/am/ActiveServices.java +++ b/services/java/com/android/server/am/ActiveServices.java @@ -51,7 +51,7 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.util.EventLog; import android.util.Log; import android.util.Slog; @@ -226,7 +226,7 @@ public class ActiveServices { ServiceLookupResult res = retrieveServiceLocked(service, resolvedType, - callingPid, callingUid, UserId.getUserId(callingUid), true); + callingPid, callingUid, UserHandle.getUserId(callingUid), true); if (res == null) { return null; } @@ -279,7 +279,7 @@ public class ActiveServices { // If this service is active, make sure it is stopped. ServiceLookupResult r = retrieveServiceLocked(service, resolvedType, Binder.getCallingPid(), Binder.getCallingUid(), - callerApp == null ? UserId.getCallingUserId() : callerApp.userId, + callerApp == null ? UserHandle.getCallingUserId() : callerApp.userId, false); if (r != null) { if (r.record != null) { @@ -300,7 +300,7 @@ public class ActiveServices { IBinder peekServiceLocked(Intent service, String resolvedType) { ServiceLookupResult r = retrieveServiceLocked(service, resolvedType, Binder.getCallingPid(), Binder.getCallingUid(), - UserId.getCallingUserId(), false); + UserHandle.getCallingUserId(), false); IBinder ret = null; if (r != null) { @@ -759,8 +759,8 @@ public class ActiveServices { } r = new ServiceRecord(mAm, ss, name, filter, sInfo, res); res.setService(r); - mServiceMap.putServiceByName(name, UserId.getUserId(r.appInfo.uid), r); - mServiceMap.putServiceByIntent(filter, UserId.getUserId(r.appInfo.uid), r); + mServiceMap.putServiceByName(name, UserHandle.getUserId(r.appInfo.uid), r); + mServiceMap.putServiceByIntent(filter, UserHandle.getUserId(r.appInfo.uid), r); // Make sure this component isn't in the pending list. int N = mPendingServices.size(); @@ -1725,7 +1725,7 @@ public class ActiveServices { ArrayList<ActivityManager.RunningServiceInfo> res = new ArrayList<ActivityManager.RunningServiceInfo>(); - int userId = UserId.getUserId(Binder.getCallingUid()); + int userId = UserHandle.getUserId(Binder.getCallingUid()); if (mServiceMap.getAllServices(userId).size() > 0) { Iterator<ServiceRecord> it = mServiceMap.getAllServices(userId).iterator(); @@ -1746,7 +1746,7 @@ public class ActiveServices { } public PendingIntent getRunningServiceControlPanelLocked(ComponentName name) { - int userId = UserId.getUserId(Binder.getCallingUid()); + int userId = UserHandle.getUserId(Binder.getCallingUid()); ServiceRecord r = mServiceMap.getServiceByName(name, userId); if (r != null) { for (ArrayList<ConnectionRecord> conn : r.connections.values()) { diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 0c378c9f5431..0eb998332859 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -111,7 +111,7 @@ import android.os.ServiceManager; import android.os.StrictMode; import android.os.SystemClock; import android.os.SystemProperties; -import android.os.UserId; +import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.text.format.Time; @@ -1084,7 +1084,7 @@ public final class ActivityManagerService extends ActivityManagerNative boolean restart = (msg.arg2 == 1); String pkg = (String) msg.obj; forceStopPackageLocked(pkg, uid, restart, false, true, false, - UserId.getUserId(uid)); + UserHandle.getUserId(uid)); } } break; case FINALIZE_PENDING_INTENT_MSG: { @@ -1829,7 +1829,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (procs == null) return null; final int N = procs.size(); for (int i = 0; i < N; i++) { - if (UserId.isSameUser(procs.keyAt(i), uid)) return procs.valueAt(i); + if (UserHandle.isSameUser(procs.keyAt(i), uid)) return procs.valueAt(i); } } ProcessRecord proc = mProcessNames.get(processName, uid); @@ -2195,7 +2195,7 @@ public final class ActivityManagerService extends ActivityManagerNative } void enforceNotIsolatedCaller(String caller) { - if (UserId.isIsolated(Binder.getCallingUid())) { + if (UserHandle.isIsolated(Binder.getCallingUid())) { throw new SecurityException("Isolated process not allowed to call " + caller); } } @@ -2324,7 +2324,7 @@ public final class ActivityManagerService extends ActivityManagerNative String resultWho, int requestCode, int startFlags, String profileFile, ParcelFileDescriptor profileFd, Bundle options) { return startActivityAsUser(caller, intent, resolvedType, resultTo, resultWho, requestCode, - startFlags, profileFile, profileFd, options, UserId.getCallingUserId()); + startFlags, profileFile, profileFd, options, UserHandle.getCallingUserId()); } public final int startActivityAsUser(IApplicationThread caller, @@ -2332,20 +2332,20 @@ public final class ActivityManagerService extends ActivityManagerNative String resultWho, int requestCode, int startFlags, String profileFile, ParcelFileDescriptor profileFd, Bundle options, int userId) { enforceNotIsolatedCaller("startActivity"); - if (userId != UserId.getCallingUserId()) { + if (userId != UserHandle.getCallingUserId()) { // Requesting a different user, make sure that they have the permission if (checkComponentPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, Binder.getCallingPid(), Binder.getCallingUid(), -1, true) == PackageManager.PERMISSION_GRANTED) { // Translate to the current user id, if caller wasn't aware - if (userId == UserId.USER_CURRENT) { + if (userId == UserHandle.USER_CURRENT) { userId = mCurrentUserId; } } else { String msg = "Permission Denial: " + "Request to startActivity as user " + userId - + " but is calling from user " + UserId.getCallingUserId() + + " but is calling from user " + UserHandle.getCallingUserId() + "; this requires " + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; Slog.w(TAG, msg); @@ -2457,7 +2457,7 @@ public final class ActivityManagerService extends ActivityManagerNative AppGlobals.getPackageManager().queryIntentActivities( intent, r.resolvedType, PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS, - UserId.getCallingUserId()); + UserHandle.getCallingUserId()); // Look for the original activity in the list... final int N = resolves != null ? resolves.size() : 0; @@ -2562,7 +2562,7 @@ public final class ActivityManagerService extends ActivityManagerNative "startActivityInPackage only available to the system"); } int ret = mMainStack.startActivities(null, uid, intents, resolvedTypes, resultTo, - options, UserId.getUserId(uid)); + options, UserHandle.getUserId(uid)); return ret; } @@ -3428,7 +3428,7 @@ public final class ActivityManagerService extends ActivityManagerNative throw new SecurityException(msg); } - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); long callingId = Binder.clearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); @@ -3502,7 +3502,7 @@ public final class ActivityManagerService extends ActivityManagerNative Slog.w(TAG, msg); throw new SecurityException(msg); } - final int userId = UserId.getCallingUserId(); + final int userId = UserHandle.getCallingUserId(); long callingId = Binder.clearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); @@ -3638,7 +3638,7 @@ public final class ActivityManagerService extends ActivityManagerNative } private void forceStopPackageLocked(final String packageName, int uid) { - forceStopPackageLocked(packageName, uid, false, false, true, false, UserId.getUserId(uid)); + forceStopPackageLocked(packageName, uid, false, false, true, false, UserHandle.getUserId(uid)); Intent intent = new Intent(Intent.ACTION_PACKAGE_RESTARTED, Uri.fromParts("package", packageName, null)); if (!mProcessesReady) { @@ -3648,7 +3648,7 @@ public final class ActivityManagerService extends ActivityManagerNative broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, false, false, - MY_PID, Process.SYSTEM_UID, UserId.getUserId(uid)); + MY_PID, Process.SYSTEM_UID, UserHandle.getUserId(uid)); } private final boolean killPackageProcessesLocked(String packageName, int uid, @@ -4369,8 +4369,8 @@ public final class ActivityManagerService extends ActivityManagerNative try { if (callingUid != 0 && callingUid != Process.SYSTEM_UID) { int uid = AppGlobals.getPackageManager() - .getPackageUid(packageName, UserId.getUserId(callingUid)); - if (!UserId.isSameApp(callingUid, uid)) { + .getPackageUid(packageName, UserHandle.getUserId(callingUid)); + if (!UserHandle.isSameApp(callingUid, uid)) { String msg = "Permission Denial: getIntentSender() from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() @@ -4466,8 +4466,8 @@ public final class ActivityManagerService extends ActivityManagerNative PendingIntentRecord rec = (PendingIntentRecord)sender; try { int uid = AppGlobals.getPackageManager() - .getPackageUid(rec.key.packageName, UserId.getCallingUserId()); - if (!UserId.isSameApp(uid, Binder.getCallingUid())) { + .getPackageUid(rec.key.packageName, UserHandle.getCallingUserId()); + if (!UserHandle.isSameApp(uid, Binder.getCallingUid())) { String msg = "Permission Denial: cancelIntentSender() from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() @@ -4686,7 +4686,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (permission == null) { return PackageManager.PERMISSION_DENIED; } - return checkComponentPermission(permission, pid, UserId.getAppId(uid), -1, true); + return checkComponentPermission(permission, pid, UserHandle.getAppId(uid), -1, true); } /** @@ -4696,7 +4696,7 @@ public final class ActivityManagerService extends ActivityManagerNative int checkCallingPermission(String permission) { return checkPermission(permission, Binder.getCallingPid(), - UserId.getAppId(Binder.getCallingUid())); + UserHandle.getAppId(Binder.getCallingUid())); } /** @@ -4827,7 +4827,7 @@ public final class ActivityManagerService extends ActivityManagerNative pid = tlsIdentity.pid; } - uid = UserId.getAppId(uid); + uid = UserHandle.getAppId(uid); // Our own process gets to do everything. if (pid == MY_PID) { return PackageManager.PERMISSION_GRANTED; @@ -4873,13 +4873,13 @@ public final class ActivityManagerService extends ActivityManagerNative String name = uri.getAuthority(); ProviderInfo pi = null; ContentProviderRecord cpr = mProviderMap.getProviderByName(name, - UserId.getUserId(callingUid)); + UserHandle.getUserId(callingUid)); if (cpr != null) { pi = cpr.info; } else { try { pi = pm.resolveContentProvider(name, - PackageManager.GET_URI_PERMISSION_PATTERNS, UserId.getUserId(callingUid)); + PackageManager.GET_URI_PERMISSION_PATTERNS, UserHandle.getUserId(callingUid)); } catch (RemoteException ex) { } } @@ -4891,7 +4891,7 @@ public final class ActivityManagerService extends ActivityManagerNative int targetUid = lastTargetUid; if (targetUid < 0 && targetPkg != null) { try { - targetUid = pm.getPackageUid(targetPkg, UserId.getUserId(callingUid)); + targetUid = pm.getPackageUid(targetPkg, UserHandle.getUserId(callingUid)); if (targetUid < 0) { if (DEBUG_URI_PERMISSION) Slog.v(TAG, "Can't grant URI permission no uid for: " + targetPkg); @@ -5183,7 +5183,7 @@ public final class ActivityManagerService extends ActivityManagerNative final String authority = uri.getAuthority(); ProviderInfo pi = null; - int userId = UserId.getUserId(callingUid); + int userId = UserHandle.getUserId(callingUid); ContentProviderRecord cpr = mProviderMap.getProviderByName(authority, userId); if (cpr != null) { pi = cpr.info; @@ -5521,7 +5521,7 @@ public final class ActivityManagerService extends ActivityManagerNative public List<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags, int userId) { final int callingUid = Binder.getCallingUid(); - if (userId != UserId.getCallingUserId()) { + if (userId != UserHandle.getCallingUserId()) { // Check if the caller is holding permissions for cross-user requests. if (checkComponentPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, @@ -5529,13 +5529,13 @@ public final class ActivityManagerService extends ActivityManagerNative != PackageManager.PERMISSION_GRANTED) { String msg = "Permission Denial: " + "Request to get recent tasks for user " + userId - + " but is calling from user " + UserId.getUserId(callingUid) + + " but is calling from user " + UserHandle.getUserId(callingUid) + "; this requires " + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; Slog.w(TAG, msg); throw new SecurityException(msg); } else { - if (userId == UserId.USER_CURRENT) { + if (userId == UserHandle.USER_CURRENT) { userId = mCurrentUserId; } } @@ -6006,7 +6006,7 @@ public final class ActivityManagerService extends ActivityManagerNative (ProviderInfo)providers.get(i); boolean singleton = isSingleton(cpi.processName, cpi.applicationInfo, cpi.name, cpi.flags); - if (singleton && UserId.getUserId(app.uid) != 0) { + if (singleton && UserHandle.getUserId(app.uid) != 0) { // This is a singleton provider, but a user besides the // default user is asking to initialize a process it runs // in... well, no, it doesn't actually run in this process, @@ -6177,7 +6177,7 @@ public final class ActivityManagerService extends ActivityManagerNative } // First check if this content provider has been published... - int userId = UserId.getUserId(r != null ? r.uid : Binder.getCallingUid()); + int userId = UserHandle.getUserId(r != null ? r.uid : Binder.getCallingUid()); cpr = mProviderMap.getProviderByName(name, userId); boolean providerRunning = cpr != null; if (providerRunning) { @@ -6725,7 +6725,7 @@ public final class ActivityManagerService extends ActivityManagerNative BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics(); int uid = info.uid; if (isolated) { - int userId = UserId.getUserId(uid); + int userId = UserHandle.getUserId(uid); int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1; uid = 0; while (true) { @@ -6733,7 +6733,7 @@ public final class ActivityManagerService extends ActivityManagerNative || mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) { mNextIsolatedProcessUid = Process.FIRST_ISOLATED_UID; } - uid = UserId.getUid(userId, mNextIsolatedProcessUid); + uid = UserHandle.getUid(userId, mNextIsolatedProcessUid); mNextIsolatedProcessUid++; if (mIsolatedProcesses.indexOfKey(uid) < 0) { // No process for this uid, use it. @@ -6771,7 +6771,7 @@ public final class ActivityManagerService extends ActivityManagerNative // This package really, really can not be stopped. try { AppGlobals.getPackageManager().setPackageStoppedState( - info.packageName, false, UserId.getUserId(app.uid)); + info.packageName, false, UserHandle.getUserId(app.uid)); } catch (RemoteException e) { } catch (IllegalArgumentException e) { Slog.w(TAG, "Failed trying to unstop package " @@ -8509,7 +8509,7 @@ public final class ActivityManagerService extends ActivityManagerNative IPackageManager pm = AppGlobals.getPackageManager(); for (String pkg : extList) { try { - ApplicationInfo info = pm.getApplicationInfo(pkg, 0, UserId.getCallingUserId()); + ApplicationInfo info = pm.getApplicationInfo(pkg, 0, UserHandle.getCallingUserId()); if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { retList.add(info); } @@ -10258,10 +10258,10 @@ public final class ActivityManagerService extends ActivityManagerNative cpr.launchingApp = null; cpr.notifyAll(); } - mProviderMap.removeProviderByClass(cpr.name, UserId.getUserId(cpr.uid)); + mProviderMap.removeProviderByClass(cpr.name, UserHandle.getUserId(cpr.uid)); String names[] = cpr.info.authority.split(";"); for (int j = 0; j < names.length; j++) { - mProviderMap.removeProviderByName(names[j], UserId.getUserId(cpr.uid)); + mProviderMap.removeProviderByName(names[j], UserHandle.getUserId(cpr.uid)); } } @@ -10599,7 +10599,7 @@ public final class ActivityManagerService extends ActivityManagerNative boolean isSingleton(String componentProcessName, ApplicationInfo aInfo, String className, int flags) { boolean result = false; - if (UserId.getAppId(aInfo.uid) >= Process.FIRST_APPLICATION_UID) { + if (UserHandle.getAppId(aInfo.uid) >= Process.FIRST_APPLICATION_UID) { if ((flags&ServiceInfo.FLAG_SINGLE_USER) != 0) { if (ActivityManager.checkUidPermission( android.Manifest.permission.INTERACT_ACROSS_USERS, @@ -10704,7 +10704,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Backup agent is now in use, its package can't be stopped. try { AppGlobals.getPackageManager().setPackageStoppedState( - app.packageName, false, UserId.getUserId(app.uid)); + app.packageName, false, UserHandle.getUserId(app.uid)); } catch (RemoteException e) { } catch (IllegalArgumentException e) { Slog.w(TAG, "Failed trying to unstop package " @@ -11046,7 +11046,7 @@ public final class ActivityManagerService extends ActivityManagerNative // If the caller is trying to send this broadcast to a different // user, verify that is allowed. - if (UserId.getUserId(callingUid) != userId) { + if (UserHandle.getUserId(callingUid) != userId) { if (checkComponentPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingPid, callingUid, -1, true) @@ -11060,7 +11060,7 @@ public final class ActivityManagerService extends ActivityManagerNative String msg = "Permission Denial: " + intent.getAction() + " broadcast from " + callerPackage + " asks to send as user " + userId - + " but is calling from user " + UserId.getUserId(callingUid) + + " but is calling from user " + UserHandle.getUserId(callingUid) + "; this requires " + android.Manifest.permission.INTERACT_ACROSS_USERS; Slog.w(TAG, msg); @@ -11553,7 +11553,7 @@ public final class ActivityManagerService extends ActivityManagerNative throw new SecurityException(msg); } - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); final long origId = Binder.clearCallingIdentity(); // Instrumentation can kill and relaunch even persistent processes forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, userId); @@ -11616,7 +11616,7 @@ public final class ActivityManagerService extends ActivityManagerNative public void finishInstrumentation(IApplicationThread target, int resultCode, Bundle results) { - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); // Refuse possible leaked file descriptors if (results != null && results.hasFileDescriptors()) { throw new IllegalArgumentException("File descriptors passed in Intent"); @@ -11929,7 +11929,7 @@ public final class ActivityManagerService extends ActivityManagerNative } else { try { ActivityInfo aInfo = AppGlobals.getPackageManager().getActivityInfo( - destIntent.getComponent(), 0, UserId.getCallingUserId()); + destIntent.getComponent(), 0, UserHandle.getCallingUserId()); int res = mMainStack.startActivityLocked(srec.app.thread, destIntent, null, aInfo, parent.appToken, null, 0, -1, parent.launchedFromUid, 0, null, true, null); @@ -13509,7 +13509,7 @@ public final class ActivityManagerService extends ActivityManagerNative for (Entry<String, SparseArray<ProcessRecord>> uidMap : map.entrySet()) { SparseArray<ProcessRecord> uids = uidMap.getValue(); for (int i = 0; i < uids.size(); i++) { - if (UserId.getUserId(uids.keyAt(i)) == extraUserId) { + if (UserHandle.getUserId(uids.keyAt(i)) == extraUserId) { pkgAndUids.add(new Pair<String,Integer>(uidMap.getKey(), uids.keyAt(i))); } } @@ -13535,14 +13535,14 @@ public final class ActivityManagerService extends ActivityManagerNative } private void checkValidCaller(int uid, int userId) { - if (UserId.getUserId(uid) == userId || uid == Process.SYSTEM_UID || uid == 0) return; + if (UserHandle.getUserId(uid) == userId || uid == Process.SYSTEM_UID || uid == 0) return; throw new SecurityException("Caller uid=" + uid + " is not privileged to communicate with user=" + userId); } private int applyUserId(int uid, int userId) { - return UserId.getUid(userId, uid); + return UserHandle.getUid(userId, uid); } ApplicationInfo getAppInfoForUser(ApplicationInfo info, int userId) { @@ -13556,7 +13556,7 @@ public final class ActivityManagerService extends ActivityManagerNative ActivityInfo getActivityInfoForUser(ActivityInfo aInfo, int userId) { if (aInfo == null - || (userId < 1 && aInfo.applicationInfo.uid < UserId.PER_USER_RANGE)) { + || (userId < 1 && aInfo.applicationInfo.uid < UserHandle.PER_USER_RANGE)) { return aInfo; } diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java index c40abb736010..b0d480c17efc 100644 --- a/services/java/com/android/server/am/ActivityRecord.java +++ b/services/java/com/android/server/am/ActivityRecord.java @@ -37,7 +37,7 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.util.EventLog; import android.util.Log; import android.util.Slog; @@ -321,7 +321,7 @@ final class ActivityRecord { appToken = new Token(this); info = aInfo; launchedFromUid = _launchedFromUid; - userId = UserId.getUserId(aInfo.applicationInfo.uid); + userId = UserHandle.getUserId(aInfo.applicationInfo.uid); intent = _intent; shortComponentName = _intent.getComponent().flattenToShortString(); resolvedType = _resolvedType; diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 196a2591e9bb..1e0827f8b9db 100755 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -55,7 +55,7 @@ import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.util.EventLog; import android.util.Log; import android.util.Slog; @@ -501,7 +501,7 @@ final class ActivityStack { TaskRecord cp = null; - final int userId = UserId.getUserId(info.applicationInfo.uid); + final int userId = UserHandle.getUserId(info.applicationInfo.uid); final int N = mHistory.size(); for (int i=(N-1); i>=0; i--) { ActivityRecord r = mHistory.get(i); @@ -545,7 +545,7 @@ final class ActivityStack { if (info.targetActivity != null) { cls = new ComponentName(info.packageName, info.targetActivity); } - final int userId = UserId.getUserId(info.applicationInfo.uid); + final int userId = UserHandle.getUserId(info.applicationInfo.uid); final int N = mHistory.size(); for (int i=(N-1); i>=0; i--) { @@ -2406,7 +2406,7 @@ final class ActivityStack { } if (err == ActivityManager.START_SUCCESS) { - final int userId = aInfo != null ? UserId.getUserId(aInfo.applicationInfo.uid) : 0; + final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; Slog.i(TAG, "START {" + intent.toShortString(true, true, true, false) + " u=" + userId + "} from pid " + (callerApp != null ? callerApp.pid : callingPid)); } diff --git a/services/java/com/android/server/am/BroadcastQueue.java b/services/java/com/android/server/am/BroadcastQueue.java index 76ddb965e475..7873dd82f39c 100644 --- a/services/java/com/android/server/am/BroadcastQueue.java +++ b/services/java/com/android/server/am/BroadcastQueue.java @@ -36,7 +36,7 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.util.EventLog; import android.util.Slog; @@ -373,7 +373,7 @@ public class BroadcastQueue { BroadcastFilter filter, boolean ordered) { boolean skip = false; if (r.onlySendToCaller) { - if (!UserId.isSameApp(r.callingUid, filter.owningUid)) { + if (!UserHandle.isSameApp(r.callingUid, filter.owningUid)) { Slog.w(TAG, "Permission Denial: broadcasting " + r.intent.toString() + " from " + r.callerPackage + " (pid=" @@ -668,7 +668,7 @@ public class BroadcastQueue { boolean skip = false; if (r.onlySendToCaller) { - if (!UserId.isSameApp(r.callingUid, info.activityInfo.applicationInfo.uid)) { + if (!UserHandle.isSameApp(r.callingUid, info.activityInfo.applicationInfo.uid)) { Slog.w(TAG, "Permission Denial: broadcasting " + r.intent.toString() + " from " + r.callerPackage + " (pid=" @@ -766,7 +766,7 @@ public class BroadcastQueue { info.activityInfo = mService.getActivityInfoForUser(info.activityInfo, 0); } r.curReceiver = info.activityInfo; - if (DEBUG_MU && r.callingUid > UserId.PER_USER_RANGE) { + if (DEBUG_MU && r.callingUid > UserHandle.PER_USER_RANGE) { Slog.v(TAG_MU, "Updated broadcast record activity info for secondary user, " + info.activityInfo + ", callingUid = " + r.callingUid + ", uid = " + info.activityInfo.applicationInfo.uid); @@ -775,7 +775,7 @@ public class BroadcastQueue { // Broadcast is being executed, its package can't be stopped. try { AppGlobals.getPackageManager().setPackageStoppedState( - r.curComponent.getPackageName(), false, UserId.getUserId(r.callingUid)); + r.curComponent.getPackageName(), false, UserHandle.getUserId(r.callingUid)); } catch (RemoteException e) { } catch (IllegalArgumentException e) { Slog.w(TAG, "Failed trying to unstop package " diff --git a/services/java/com/android/server/am/PendingIntentRecord.java b/services/java/com/android/server/am/PendingIntentRecord.java index ad15da1a9211..d3b851026aac 100644 --- a/services/java/com/android/server/am/PendingIntentRecord.java +++ b/services/java/com/android/server/am/PendingIntentRecord.java @@ -25,7 +25,7 @@ import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.util.Slog; import java.io.PrintWriter; @@ -259,7 +259,7 @@ class PendingIntentRecord extends IIntentSender.Stub { owner.broadcastIntentInPackage(key.packageName, uid, finalIntent, resolvedType, finishedReceiver, code, null, null, - requiredPermission, (finishedReceiver != null), false, UserId + requiredPermission, (finishedReceiver != null), false, UserHandle .getUserId(uid)); sendFinish = false; } catch (RuntimeException e) { diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java index 42b770894ad8..d37242259e08 100644 --- a/services/java/com/android/server/am/ProcessRecord.java +++ b/services/java/com/android/server/am/ProcessRecord.java @@ -30,7 +30,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.Process; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.util.PrintWriterPrinter; import android.util.TimeUtils; @@ -313,7 +313,7 @@ class ProcessRecord { info = _info; isolated = _info.uid != _uid; uid = _uid; - userId = UserId.getUserId(_uid); + userId = UserHandle.getUserId(_uid); processName = _processName; pkgList.add(_info.packageName); thread = _thread; @@ -396,7 +396,7 @@ class ProcessRecord { sb.append(info.uid%Process.FIRST_APPLICATION_UID); if (uid != info.uid) { sb.append('i'); - sb.append(UserId.getAppId(uid) - Process.FIRST_ISOLATED_UID); + sb.append(UserHandle.getAppId(uid) - Process.FIRST_ISOLATED_UID); } } } diff --git a/services/java/com/android/server/am/ProviderMap.java b/services/java/com/android/server/am/ProviderMap.java index 405718f492c2..ab2e428298eb 100644 --- a/services/java/com/android/server/am/ProviderMap.java +++ b/services/java/com/android/server/am/ProviderMap.java @@ -20,7 +20,7 @@ import android.content.ComponentName; import android.os.Binder; import android.os.Process; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.util.Slog; import android.util.SparseArray; @@ -98,7 +98,7 @@ public class ProviderMap { if (record.singleton) { mSingletonByName.put(name, record); } else { - final int userId = UserId.getUserId(record.appInfo.uid); + final int userId = UserHandle.getUserId(record.appInfo.uid); getProvidersByName(userId).put(name, record); } } @@ -111,7 +111,7 @@ public class ProviderMap { if (record.singleton) { mSingletonByClass.put(name, record); } else { - final int userId = UserId.getUserId(record.appInfo.uid); + final int userId = UserHandle.getUserId(record.appInfo.uid); getProvidersByClass(userId).put(name, record); } } diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java index 828eef767f44..41386e47febd 100644 --- a/services/java/com/android/server/am/ServiceRecord.java +++ b/services/java/com/android/server/am/ServiceRecord.java @@ -31,7 +31,7 @@ import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.util.Slog; import android.util.TimeUtils; @@ -296,7 +296,7 @@ class ServiceRecord extends Binder { this.restarter = restarter; createTime = SystemClock.elapsedRealtime(); lastActivity = SystemClock.uptimeMillis(); - userId = UserId.getUserId(appInfo.uid); + userId = UserHandle.getUserId(appInfo.uid); } public AppBindRecord retrieveAppBindingLocked(Intent intent, diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java index 3a767c27581d..1bae9ca53adf 100644 --- a/services/java/com/android/server/am/TaskRecord.java +++ b/services/java/com/android/server/am/TaskRecord.java @@ -19,7 +19,7 @@ package com.android.server.am; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; -import android.os.UserId; +import android.os.UserHandle; import android.util.Slog; import java.io.PrintWriter; @@ -101,7 +101,7 @@ class TaskRecord extends ThumbnailHolder { } if (info.applicationInfo != null) { - userId = UserId.getUserId(info.applicationInfo.uid); + userId = UserHandle.getUserId(info.applicationInfo.uid); } } diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java index 46c24b0baa55..a7cba5a1ed6d 100644 --- a/services/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java @@ -112,7 +112,7 @@ import android.os.Message; import android.os.MessageQueue.IdleHandler; import android.os.RemoteCallbackList; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.telephony.TelephonyManager; @@ -426,7 +426,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final String action = intent.getAction(); final int uid = intent.getIntExtra(EXTRA_UID, 0); - final int appId = UserId.getAppId(uid); + final int appId = UserHandle.getAppId(uid); synchronized (mRulesLock) { if (ACTION_PACKAGE_ADDED.equals(action)) { // NOTE: PACKAGE_ADDED is currently only sent once, and is @@ -1188,8 +1188,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final int uid = readIntAttribute(in, ATTR_UID); final int policy = readIntAttribute(in, ATTR_POLICY); - final int appId = UserId.getAppId(uid); - if (UserId.isApp(appId)) { + final int appId = UserHandle.getAppId(uid); + if (UserHandle.isApp(appId)) { setAppPolicyUnchecked(appId, policy, false); } else { Slog.w(TAG, "unable to apply policy to UID " + uid + "; ignoring"); @@ -1198,7 +1198,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final int appId = readIntAttribute(in, ATTR_APP_ID); final int policy = readIntAttribute(in, ATTR_POLICY); - if (UserId.isApp(appId)) { + if (UserHandle.isApp(appId)) { setAppPolicyUnchecked(appId, policy, false); } else { Slog.w(TAG, "unable to apply policy to appId " + appId + "; ignoring"); @@ -1304,7 +1304,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public void setAppPolicy(int appId, int policy) { mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); - if (!UserId.isApp(appId)) { + if (!UserHandle.isApp(appId)) { throw new IllegalArgumentException("cannot apply policy to appId " + appId); } @@ -1698,7 +1698,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final PackageManager pm = mContext.getPackageManager(); final List<ApplicationInfo> apps = pm.getInstalledApplications(0); for (ApplicationInfo app : apps) { - final int appId = UserId.getAppId(app.uid); + final int appId = UserHandle.getAppId(app.uid); updateRulesForAppLocked(appId); } @@ -1710,7 +1710,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private void updateRulesForAppLocked(int appId) { UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); for (UserInfo user : um.getUsers()) { - final int uid = UserId.getUid(user.id, appId); + final int uid = UserHandle.getUid(user.id, appId); updateRulesForUidLocked(uid); } } @@ -1718,7 +1718,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static boolean isUidValidForRules(int uid) { // allow rules on specific system services, and any apps if (uid == android.os.Process.MEDIA_UID || uid == android.os.Process.DRM_UID - || UserId.isApp(uid)) { + || UserHandle.isApp(uid)) { return true; } @@ -1728,7 +1728,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private void updateRulesForUidLocked(int uid) { if (!isUidValidForRules(uid)) return; - final int appId = UserId.getAppId(uid); + final int appId = UserHandle.getAppId(uid); final int appPolicy = getAppPolicy(appId); final boolean uidForeground = isUidForeground(uid); diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 4befb9e24ef4..9e943335196f 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -100,7 +100,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; -import android.os.UserId; +import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings.Secure; import android.security.SystemKeyStore; @@ -691,15 +691,15 @@ public class PackageManagerService extends IPackageManager.Stub { } sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, res.pkg.applicationInfo.packageName, - extras, null, null, UserId.USER_ALL); + extras, null, null, UserHandle.USER_ALL); if (update) { sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, res.pkg.applicationInfo.packageName, - extras, null, null, UserId.USER_ALL); + extras, null, null, UserHandle.USER_ALL); sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED, null, null, res.pkg.applicationInfo.packageName, null, - UserId.USER_ALL); + UserHandle.USER_ALL); } if (res.removedInfo.args != null) { // Remove the replaced package's older resources safely now @@ -1630,14 +1630,14 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); if(p != null) { - return UserId.getUid(userId, p.applicationInfo.uid); + return UserHandle.getUid(userId, p.applicationInfo.uid); } PackageSetting ps = mSettings.mPackages.get(packageName); if((ps == null) || (ps.pkg == null) || (ps.pkg.applicationInfo == null)) { return -1; } p = ps.pkg; - return p != null ? UserId.getUid(userId, p.applicationInfo.uid) : -1; + return p != null ? UserHandle.getUid(userId, p.applicationInfo.uid) : -1; } } @@ -1961,7 +1961,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private void checkValidCaller(int uid, int userId) { - if (UserId.getUserId(uid) == userId || uid == Process.SYSTEM_UID || uid == 0) + if (UserHandle.getUserId(uid) == userId || uid == Process.SYSTEM_UID || uid == 0) return; throw new SecurityException("Caller uid=" + uid @@ -1990,7 +1990,7 @@ public class PackageManagerService extends IPackageManager.Stub { public int checkUidPermission(String permName, int uid) { synchronized (mPackages) { - Object obj = mSettings.getUserIdLPr(UserId.getAppId(uid)); + Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); if (obj != null) { GrantedPermissions gp = (GrantedPermissions)obj; if (gp.grantedPermissions.contains(permName)) { @@ -2024,7 +2024,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (permName != null) { BasePermission bp = findPermissionTreeLP(permName); if (bp != null) { - if (bp.uid == UserId.getAppId(Binder.getCallingUid())) { + if (bp.uid == UserHandle.getAppId(Binder.getCallingUid())) { return bp; } throw new SecurityException("Calling uid " @@ -2227,8 +2227,8 @@ public class PackageManagerService extends IPackageManager.Stub { public int checkUidSignatures(int uid1, int uid2) { // Map to base uids. - uid1 = UserId.getAppId(uid1); - uid2 = UserId.getAppId(uid2); + uid1 = UserHandle.getAppId(uid1); + uid2 = UserHandle.getAppId(uid2); // reader synchronized (mPackages) { Signature[] s1; @@ -2286,7 +2286,7 @@ public class PackageManagerService extends IPackageManager.Stub { } public String[] getPackagesForUid(int uid) { - uid = UserId.getAppId(uid); + uid = UserHandle.getAppId(uid); // reader synchronized (mPackages) { Object obj = mSettings.getUserIdLPr(uid); @@ -2311,7 +2311,7 @@ public class PackageManagerService extends IPackageManager.Stub { public String getNameForUid(int uid) { // reader synchronized (mPackages) { - Object obj = mSettings.getUserIdLPr(UserId.getAppId(uid)); + Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); if (obj instanceof SharedUserSetting) { final SharedUserSetting sus = (SharedUserSetting) obj; return sus.name + ":" + sus.userId; @@ -2791,7 +2791,7 @@ public class PackageManagerService extends IPackageManager.Stub { final ParceledListSlice<PackageInfo> list = new ParceledListSlice<PackageInfo>(); final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; final String[] keys; - int userId = UserId.getCallingUserId(); + int userId = UserHandle.getCallingUserId(); // writer synchronized (mPackages) { @@ -2890,7 +2890,7 @@ public class PackageManagerService extends IPackageManager.Stub { // reader synchronized (mPackages) { final Iterator<PackageParser.Package> i = mPackages.values().iterator(); - final int userId = UserId.getCallingUserId(); + final int userId = UserHandle.getCallingUserId(); while (i.hasNext()) { final PackageParser.Package p = i.next(); if (p.applicationInfo != null @@ -2938,7 +2938,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mPackages) { final Iterator<Map.Entry<String, PackageParser.Provider>> i = mProviders.entrySet() .iterator(); - final int userId = UserId.getCallingUserId(); + final int userId = UserHandle.getCallingUserId(); while (i.hasNext()) { Map.Entry<String, PackageParser.Provider> entry = i.next(); PackageParser.Provider p = entry.getValue(); @@ -2965,14 +2965,14 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mPackages) { final Iterator<PackageParser.Provider> i = mProvidersByComponent.values().iterator(); final int userId = processName != null ? - UserId.getUserId(uid) : UserId.getCallingUserId(); + UserHandle.getUserId(uid) : UserHandle.getCallingUserId(); while (i.hasNext()) { final PackageParser.Provider p = i.next(); PackageSetting ps = mSettings.mPackages.get(p.owner.packageName); if (p.info.authority != null && (processName == null || (p.info.processName.equals(processName) - && UserId.isSameApp(p.info.applicationInfo.uid, uid))) + && UserHandle.isSameApp(p.info.applicationInfo.uid, uid))) && mSettings.isEnabledLPr(p.info, flags, userId) && (!mSafeMode || (p.info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)) { @@ -5148,7 +5148,7 @@ public class PackageManagerService extends IPackageManager.Stub { IActivityManager am = ActivityManagerNative.getDefault(); if (am != null) { try { - int[] userIds = userId == UserId.USER_ALL + int[] userIds = userId == UserHandle.USER_ALL ? sUserManager.getUserIds() : new int[] {userId}; for (int id : userIds) { @@ -5163,7 +5163,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Modify the UID when posting to other users int uid = intent.getIntExtra(Intent.EXTRA_UID, -1); if (uid > 0 && id > 0) { - uid = UserId.getUid(id, UserId.getAppId(uid)); + uid = UserHandle.getUid(id, UserHandle.getAppId(uid)); intent.putExtra(Intent.EXTRA_UID, uid); } intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); @@ -5312,13 +5312,13 @@ public class PackageManagerService extends IPackageManager.Stub { extras.putInt(Intent.EXTRA_UID, removedUid); extras.putBoolean(Intent.EXTRA_DATA_REMOVED, false); sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, removedPackage, - extras, null, null, UserId.USER_ALL); + extras, null, null, UserHandle.USER_ALL); } if (addedPackage != null) { Bundle extras = new Bundle(1); extras.putInt(Intent.EXTRA_UID, addedUid); sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, addedPackage, - extras, null, null, UserId.USER_ALL); + extras, null, null, UserHandle.USER_ALL); } } @@ -7539,11 +7539,11 @@ public class PackageManagerService extends IPackageManager.Stub { extras.putBoolean(Intent.EXTRA_REPLACING, true); sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, - extras, null, null, UserId.USER_ALL); + extras, null, null, UserHandle.USER_ALL); sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName, - extras, null, null, UserId.USER_ALL); + extras, null, null, UserHandle.USER_ALL); sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED, null, - null, packageName, null, UserId.USER_ALL); + null, packageName, null, UserHandle.USER_ALL); } } // Force a gc here. @@ -7576,15 +7576,15 @@ public class PackageManagerService extends IPackageManager.Stub { } if (removedPackage != null) { sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, removedPackage, - extras, null, null, UserId.USER_ALL); + extras, null, null, UserHandle.USER_ALL); if (fullRemove && !replacing) { sendPackageBroadcast(Intent.ACTION_PACKAGE_FULLY_REMOVED, removedPackage, - extras, null, null, UserId.USER_ALL); + extras, null, null, UserHandle.USER_ALL); } } if (removedUid >= 0) { sendPackageBroadcast(Intent.ACTION_UID_REMOVED, null, extras, null, null, - UserId.getUserId(removedUid)); + UserHandle.getUserId(removedUid)); } } } @@ -7948,7 +7948,7 @@ public class PackageManagerService extends IPackageManager.Stub { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.DELETE_CACHE_FILES, null); // Queue up an async operation since the package deletion may take a little while. - final int userId = UserId.getCallingUserId(); + final int userId = UserHandle.getCallingUserId(); mHandler.post(new Runnable() { public void run() { mHandler.removeCallbacks(this); @@ -8303,7 +8303,7 @@ public class PackageManagerService extends IPackageManager.Stub { + "/" + className); } // Allow root and verify that userId is not being specified by a different user - if (!allowedByPermission && !UserId.isSameApp(uid, pkgSetting.appId)) { + if (!allowedByPermission && !UserHandle.isSameApp(uid, pkgSetting.appId)) { throw new SecurityException( "Permission Denial: attempt to change component state from pid=" + Binder.getCallingPid() @@ -8352,7 +8352,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } mSettings.writePackageRestrictionsLPr(userId); - packageUid = UserId.getUid(userId, pkgSetting.appId); + packageUid = UserHandle.getUid(userId, pkgSetting.appId); components = mPendingBroadcasts.get(packageName); final boolean newPackage = components == null; if (newPackage) { @@ -8401,7 +8401,7 @@ public class PackageManagerService extends IPackageManager.Stub { extras.putBoolean(Intent.EXTRA_DONT_KILL_APP, killFlag); extras.putInt(Intent.EXTRA_UID, packageUid); sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageName, extras, null, null, - UserId.getUserId(packageUid)); + UserHandle.getUserId(packageUid)); } public void setPackageStoppedState(String packageName, boolean stopped, int userId) { @@ -9027,7 +9027,7 @@ public class PackageManagerService extends IPackageManager.Stub { } String action = mediaStatus ? Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE : Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE; - sendPackageBroadcast(action, null, extras, null, finishedReceiver, UserId.USER_ALL); + sendPackageBroadcast(action, null, extras, null, finishedReceiver, UserHandle.USER_ALL); } } diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java index add91d3a62bf..cfc0f5c56eba 100644 --- a/services/java/com/android/server/pm/Settings.java +++ b/services/java/com/android/server/pm/Settings.java @@ -49,7 +49,7 @@ import android.os.Environment; import android.os.FileUtils; import android.os.Process; import android.os.RemoteException; -import android.os.UserId; +import android.os.UserHandle; import android.util.Log; import android.util.Slog; import android.util.SparseArray; @@ -2353,7 +2353,7 @@ final class Settings { boolean setPackageStoppedStateLPw(String packageName, boolean stopped, boolean allowedByPermission, int uid, int userId) { - int appId = UserId.getAppId(uid); + int appId = UserHandle.getAppId(uid); final PackageSetting pkgSetting = mPackages.get(packageName); if (pkgSetting == null) { throw new IllegalArgumentException("Unknown package: " + packageName); diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java index b55dd247ce21..725d67d35c4f 100644 --- a/services/java/com/android/server/pm/UserManagerService.java +++ b/services/java/com/android/server/pm/UserManagerService.java @@ -34,7 +34,7 @@ import android.os.IUserManager; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.SystemClock; -import android.os.UserId; +import android.os.UserHandle; import android.util.Log; import android.util.Slog; import android.util.SparseArray; @@ -539,7 +539,7 @@ public class UserManagerService extends IUserManager.Stub { // Don't do it for the primary user, it will become recursive. if (userId == 0) continue; - mInstaller.createUserData(packageName, UserId.getUid(userId, uid), + mInstaller.createUserData(packageName, UserHandle.getUid(userId, uid), userId); } } diff --git a/services/java/com/android/server/power/DisplayPowerController.java b/services/java/com/android/server/power/DisplayPowerController.java index 50d3f81374df..b0c79fa13d95 100644 --- a/services/java/com/android/server/power/DisplayPowerController.java +++ b/services/java/com/android/server/power/DisplayPowerController.java @@ -33,11 +33,11 @@ import android.os.Looper; import android.os.Message; import android.os.SystemClock; import android.util.Slog; +import android.util.Spline; import android.util.TimeUtils; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @@ -96,9 +96,20 @@ final class DisplayPowerController { // Filter time constant in milliseconds for computing a moving // average of light samples. Different constants are used - // to adapt to brighter or dimmer environments. - private static final long BRIGHTENING_LIGHT_TIME_CONSTANT = 2500; // 2.5 sec - private static final long DIMMING_LIGHT_TIME_CONSTANT = 10000; // 10 sec + // to calculate the average light level when adapting to brighter or + // dimmer environments. + // This parameter only controls the filtering of light samples. + private static final long BRIGHTENING_LIGHT_TIME_CONSTANT = 500; + private static final long DIMMING_LIGHT_TIME_CONSTANT = 2000; + + // Stability requirements in milliseconds for accepting a new brightness + // level. This is used for debouncing the light sensor. Different constants + // are used to debounce the light sensor when adapting to brighter or dimmer + // environments. + // This parameter controls how quickly brightness changes occur in response to + // an observed change in light level. + private static final long BRIGHTENING_LIGHT_DEBOUNCE = 2500; + private static final long DIMMING_LIGHT_DEBOUNCE = 10000; private final Object mLock = new Object(); @@ -133,8 +144,7 @@ final class DisplayPowerController { // Auto-brightness. private boolean mUseSoftwareAutoBrightnessConfig; - private int[] mAutoBrightnessLevelsConfig; - private int[] mAutoBrightnessLcdBacklightValuesConfig; + private Spline mScreenAutoBrightnessSpline; // Amount of time to delay auto-brightness after screen on while waiting for // the light sensor to warm-up in milliseconds. @@ -233,6 +243,9 @@ final class DisplayPowerController { // The time of the most light recent sample. private long mLastLightSampleTime; + // The time when we accumulated the first recent light sample into mRecentLightSamples. + private long mFirstRecentLightSampleTime; + // The upcoming debounce light sensor time. // This is only valid when mLightMeasurementValue && mRecentLightSamples >= 1. private long mPendingLightSensorDebounceTime; @@ -275,17 +288,18 @@ final class DisplayPowerController { mUseSoftwareAutoBrightnessConfig = resources.getBoolean( com.android.internal.R.bool.config_automatic_brightness_available); if (mUseSoftwareAutoBrightnessConfig) { - mAutoBrightnessLevelsConfig = resources.getIntArray( + int[] lux = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLevels); - mAutoBrightnessLcdBacklightValuesConfig = resources.getIntArray( + int[] screenBrightness = resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); - if (mAutoBrightnessLcdBacklightValuesConfig.length - != mAutoBrightnessLevelsConfig.length + 1) { + + mScreenAutoBrightnessSpline = createAutoBrightnessSpline(lux, screenBrightness); + if (mScreenAutoBrightnessSpline == null) { Slog.e(TAG, "Error in config.xml. config_autoBrightnessLcdBacklightValues " - + "(size " + mAutoBrightnessLcdBacklightValuesConfig.length + ") " - + "should have exactly one more entry than " - + "config_autoBrightnessLevels (size " - + mAutoBrightnessLevelsConfig.length + "). " + + "(size " + screenBrightness.length + ") " + + "must be monotic and have exactly one more entry than " + + "config_autoBrightnessLevels (size " + lux.length + ") " + + "which must be strictly increasing. " + "Auto-brightness will be disabled."); mUseSoftwareAutoBrightnessConfig = false; } @@ -308,6 +322,31 @@ final class DisplayPowerController { } } + private static Spline createAutoBrightnessSpline(int[] lux, int[] brightness) { + try { + final int n = brightness.length; + float[] x = new float[n]; + float[] y = new float[n]; + y[0] = brightness[0]; + for (int i = 1; i < n; i++) { + x[i] = lux[i - 1]; + y[i] = brightness[i]; + } + + Spline spline = Spline.createMonotoneCubicSpline(x, y); + if (false) { + Slog.d(TAG, "Auto-brightness spline: " + spline); + for (float v = 1f; v < lux[lux.length - 1] * 1.25f; v *= 1.25f) { + Slog.d(TAG, String.format(" %7.1f: %7.1f", v, spline.interpolate(v))); + } + } + return spline; + } catch (IllegalArgumentException ex) { + Slog.e(TAG, "Could not create auto-brightness spline.", ex); + return null; + } + } + /** * Returns true if the proximity sensor screen-off function is available. */ @@ -664,7 +703,6 @@ final class DisplayPowerController { // If the newest light sample doesn't seem to be going in the // same general direction as recent samples, then start over. setRecentLight(time, lux, lux > mLightMeasurement); - mPendingLightSensorDebounceTime = time + mRecentLightTimeConstant; } else if (mRecentLightSamples >= 1) { // Add the newest light sample to the moving average. accumulateRecentLight(time, lux); @@ -677,6 +715,8 @@ final class DisplayPowerController { + ", mRecentLightAverage=" + mRecentLightAverage + ", mRecentLightBrightening=" + mRecentLightBrightening + ", mRecentLightTimeConstant=" + mRecentLightTimeConstant + + ", mFirstRecentLightSampleTime=" + + TimeUtils.formatUptime(mFirstRecentLightSampleTime) + ", mPendingLightSensorDebounceTime=" + TimeUtils.formatUptime(mPendingLightSensorDebounceTime)); } @@ -694,6 +734,9 @@ final class DisplayPowerController { mRecentLightAverage = lux; mLastLightSample = lux; mLastLightSampleTime = time; + mFirstRecentLightSampleTime = time; + mPendingLightSensorDebounceTime = time + (brightening ? + BRIGHTENING_LIGHT_DEBOUNCE : DIMMING_LIGHT_DEBOUNCE); } private void accumulateRecentLight(long time, float lux) { @@ -715,8 +758,7 @@ final class DisplayPowerController { if (DEBUG) { Slog.d(TAG, "debounceLightSensor: Accepted new measurement " + mLightMeasurement + " after " - + (now - mPendingLightSensorDebounceTime - + mRecentLightTimeConstant) + " ms based on " + + (now - mFirstRecentLightSampleTime) + " ms based on " + mRecentLightSamples + " recent samples."); } @@ -751,13 +793,13 @@ final class DisplayPowerController { return; } - final int newScreenAutoBrightness = mapLuxToBrightness(mLightMeasurement, - mAutoBrightnessLevelsConfig, - mAutoBrightnessLcdBacklightValuesConfig); + final int newScreenAutoBrightness = interpolateBrightness( + mScreenAutoBrightnessSpline, mLightMeasurement); if (mScreenAutoBrightness != newScreenAutoBrightness) { if (DEBUG) { Slog.d(TAG, "updateAutoBrightness: mScreenAutoBrightness=" - + mScreenAutoBrightness); + + mScreenAutoBrightness + "newScreenAutoBrightness=" + + newScreenAutoBrightness); } mScreenAutoBrightness = newScreenAutoBrightness; @@ -767,20 +809,8 @@ final class DisplayPowerController { } } - /** - * Maps a light sensor measurement in lux to a brightness value given - * a table of lux breakpoint values and a table of brightnesses that - * is one element larger. - */ - private static int mapLuxToBrightness(float lux, - int[] fromLux, int[] toBrightness) { - // TODO implement interpolation and possibly range expansion - int level = 0; - final int count = fromLux.length; - while (level < count && lux >= fromLux[level]) { - level += 1; - } - return toBrightness[level]; + private static int interpolateBrightness(Spline spline, float lux) { + return Math.min(255, Math.max(0, (int)Math.round(spline.interpolate(lux)))); } private void sendOnStateChanged() { @@ -822,10 +852,7 @@ final class DisplayPowerController { pw.println(" mScreenBrightnessDimConfig=" + mScreenBrightnessDimConfig); pw.println(" mUseSoftwareAutoBrightnessConfig=" + mUseSoftwareAutoBrightnessConfig); - pw.println(" mAutoBrightnessLevelsConfig=" - + Arrays.toString(mAutoBrightnessLevelsConfig)); - pw.println(" mAutoBrightnessLcdBacklightValuesConfig=" - + Arrays.toString(mAutoBrightnessLcdBacklightValuesConfig)); + pw.println(" mScreenAutoBrightnessSpline=" + mScreenAutoBrightnessSpline); pw.println(" mLightSensorWarmUpTimeConfig=" + mLightSensorWarmUpTimeConfig); if (Looper.myLooper() == mHandler.getLooper()) { @@ -885,6 +912,8 @@ final class DisplayPowerController { pw.println(" mRecentLightAverage=" + mRecentLightAverage); pw.println(" mRecentLightBrightening=" + mRecentLightBrightening); pw.println(" mRecentLightTimeConstant=" + mRecentLightTimeConstant); + pw.println(" mFirstRecentLightSampleTime=" + + TimeUtils.formatUptime(mFirstRecentLightSampleTime)); pw.println(" mPendingLightSensorDebounceTime=" + TimeUtils.formatUptime(mPendingLightSensorDebounceTime)); pw.println(" mScreenAutoBrightness=" + mScreenAutoBrightness); diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index f6f9aa0e7f27..3373fd474449 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -71,7 +71,7 @@ import android.os.Binder; import android.os.INetworkManagementService; import android.os.IPowerManager; import android.os.MessageQueue.IdleHandler; -import android.os.UserId; +import android.os.UserHandle; import android.test.AndroidTestCase; import android.test.mock.MockPackageManager; import android.test.suitebuilder.annotation.LargeTest; @@ -138,10 +138,10 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { private static final int APP_ID_A = android.os.Process.FIRST_APPLICATION_UID + 800; private static final int APP_ID_B = android.os.Process.FIRST_APPLICATION_UID + 801; - private static final int UID_A = UserId.getUid(USER_ID, APP_ID_A); - private static final int UID_B = UserId.getUid(USER_ID, APP_ID_B); - private static final int UID_A_GUEST = UserId.getUid(USER_ID_GUEST, APP_ID_A); - private static final int UID_B_GUEST = UserId.getUid(USER_ID_GUEST, APP_ID_B); + private static final int UID_A = UserHandle.getUid(USER_ID, APP_ID_A); + private static final int UID_B = UserHandle.getUid(USER_ID, APP_ID_B); + private static final int UID_A_GUEST = UserHandle.getUid(USER_ID_GUEST, APP_ID_A); + private static final int UID_B_GUEST = UserHandle.getUid(USER_ID_GUEST, APP_ID_B); private static final int PID_1 = 400; private static final int PID_2 = 401; diff --git a/tests/RenderScriptTests/ImageProcessing2/Android.mk b/tests/RenderScriptTests/ImageProcessing2/Android.mk new file mode 100644 index 000000000000..c81fd93e4b21 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/Android.mk @@ -0,0 +1,35 @@ +# +# Copyright (C) 2009 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. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-java-files-under, src) \ + $(call all-renderscript-files-under, src) + +LOCAL_STATIC_JAVA_LIBRARIES := android.support.v8.renderscript + +LOCAL_PACKAGE_NAME := ImageProcessing2 + +LOCAL_RENDERSCRIPT_FLAGS := -rs-package-name=android.support.v8.renderscript +LOCAL_REQUIRED_MODULES := librsjni + +include $(BUILD_PACKAGE) + +#include $(call all-makefiles-under, $(LOCAL_PATH)) + diff --git a/tests/RenderScriptTests/ImageProcessing2/AndroidManifest.xml b/tests/RenderScriptTests/ImageProcessing2/AndroidManifest.xml new file mode 100644 index 000000000000..1ef04c261851 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/AndroidManifest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.rs.image2"> + <uses-sdk android:minSdkVersion="11" /> + <application android:label="IP GB" + android:hardwareAccelerated="true"> + <activity android:name="ImageProcessingActivity2"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/tests/RenderScriptTests/ImageProcessing2/res/drawable-nodpi/city.png b/tests/RenderScriptTests/ImageProcessing2/res/drawable-nodpi/city.png Binary files differnew file mode 100644 index 000000000000..856eeff59b9d --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/res/drawable-nodpi/city.png diff --git a/tests/RenderScriptTests/ImageProcessing2/res/layout/main.xml b/tests/RenderScriptTests/ImageProcessing2/res/layout/main.xml new file mode 100644 index 000000000000..bd56d62d29d2 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/res/layout/main.xml @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:id="@+id/toplevel"> + <SurfaceView + android:id="@+id/surface" + android:layout_width="1dip" + android:layout_height="1dip" /> + <ScrollView + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + <ImageView + android:id="@+id/display" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="wrap_content"> + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/benchmark" + android:onClick="benchmark"/> + <TextView + android:id="@+id/benchmarkText" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="8pt" + android:text="@string/saturation"/> + </LinearLayout> + <Spinner + android:id="@+id/filterselection" + android:layout_width="fill_parent" + android:layout_height="wrap_content"/> + <TextView + android:id="@+id/slider1Text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="8pt" + android:layout_marginLeft="10sp" + android:layout_marginTop="15sp" + android:text="@string/saturation"/> + <SeekBar + android:id="@+id/slider1" + android:layout_marginLeft="10sp" + android:layout_marginRight="10sp" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + <TextView + android:id="@+id/slider2Text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="8pt" + android:layout_marginLeft="10sp" + android:layout_marginTop="15sp" + android:text="@string/gamma"/> + <SeekBar + android:id="@+id/slider2" + android:layout_marginLeft="10sp" + android:layout_marginRight="10sp" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + <TextView + android:id="@+id/slider3Text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="10sp" + android:layout_marginTop="15sp" + android:textSize="8pt" + android:text="@string/out_white"/> + <SeekBar + android:id="@+id/slider3" + android:layout_marginLeft="10sp" + android:layout_marginRight="10sp" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + <TextView + android:id="@+id/slider4Text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="8pt" + android:layout_marginLeft="10sp" + android:layout_marginTop="15sp" + android:text="@string/in_white"/> + <SeekBar + android:id="@+id/slider4" + android:layout_marginLeft="10sp" + android:layout_marginRight="10sp" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + <TextView + android:id="@+id/slider5Text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="8pt" + android:layout_marginLeft="10sp" + android:layout_marginTop="15sp" + android:text="@string/in_white"/> + <SeekBar + android:id="@+id/slider5" + android:layout_marginLeft="10sp" + android:layout_marginRight="10sp" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + </LinearLayout> + </ScrollView> +</LinearLayout> + diff --git a/tests/RenderScriptTests/ImageProcessing2/res/layout/spinner_layout.xml b/tests/RenderScriptTests/ImageProcessing2/res/layout/spinner_layout.xml new file mode 100644 index 000000000000..8196bbf02499 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/res/layout/spinner_layout.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- Copyright (C) 2012 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:padding="10dp" + android:textSize="16sp" +/> diff --git a/tests/RenderScriptTests/ImageProcessing2/res/values/strings.xml b/tests/RenderScriptTests/ImageProcessing2/res/values/strings.xml new file mode 100644 index 000000000000..cc5cc4de9782 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/res/values/strings.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +* Copyright (C) 2008 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- General --> + <skip /> + <!--slider label --> + <string name="blur_description">Blur Radius</string> + <string name="in_white">In White</string> + <string name="out_white">Out White</string> + <string name="in_black">In Black</string> + <string name="out_black">Out Black</string> + <string name="gamma">Gamma</string> + <string name="saturation">Saturation</string> + <string name="benchmark">Benchmark</string> + +</resources> diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Blur25.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Blur25.java new file mode 100644 index 000000000000..be877164fcb2 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Blur25.java @@ -0,0 +1,101 @@ +/* + * 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.image2; + +import java.lang.Math; + +import android.support.v8.renderscript.*; +import android.util.Log; +import android.widget.SeekBar; +import android.widget.TextView; + +public class Blur25 extends TestBase { + private int MAX_RADIUS = 25; + private ScriptC_threshold mScript; + private ScriptC_vertical_blur mScriptVBlur; + private ScriptC_horizontal_blur mScriptHBlur; + private int mRadius = MAX_RADIUS; + private float mSaturation = 1.0f; + private Allocation mScratchPixelsAllocation1; + private Allocation mScratchPixelsAllocation2; + + + public boolean onBar1Setup(SeekBar b, TextView t) { + t.setText("Radius"); + b.setProgress(100); + return true; + } + public boolean onBar2Setup(SeekBar b, TextView t) { + b.setProgress(50); + t.setText("Saturation"); + return true; + } + + + public void onBar1Changed(int progress) { + float fRadius = progress / 100.0f; + fRadius *= (float)(MAX_RADIUS); + mRadius = (int)fRadius; + mScript.set_radius(mRadius); + } + public void onBar2Changed(int progress) { + mSaturation = (float)progress / 50.0f; + mScriptVBlur.invoke_setSaturation(mSaturation); + } + + + public void createTest(android.content.res.Resources res) { + int width = mInPixelsAllocation.getType().getX(); + int height = mInPixelsAllocation.getType().getY(); + + Type.Builder tb = new Type.Builder(mRS, Element.F32_4(mRS)); + tb.setX(width); + tb.setY(height); + mScratchPixelsAllocation1 = Allocation.createTyped(mRS, tb.create()); + mScratchPixelsAllocation2 = Allocation.createTyped(mRS, tb.create()); + + mScriptVBlur = new ScriptC_vertical_blur(mRS, res, R.raw.vertical_blur); + mScriptHBlur = new ScriptC_horizontal_blur(mRS, res, R.raw.horizontal_blur); + + mScript = new ScriptC_threshold(mRS, res, R.raw.threshold); + mScript.set_width(width); + mScript.set_height(height); + mScript.set_radius(mRadius); + + mScriptVBlur.invoke_setSaturation(mSaturation); + + mScript.bind_InPixel(mInPixelsAllocation); + mScript.bind_OutPixel(mOutPixelsAllocation); + mScript.bind_ScratchPixel1(mScratchPixelsAllocation1); + mScript.bind_ScratchPixel2(mScratchPixelsAllocation2); + + mScript.set_vBlurScript(mScriptVBlur); + mScript.set_hBlurScript(mScriptHBlur); + } + + public void runTest() { + mScript.invoke_filter(); + } + + public void setupBenchmark() { + mScript.set_radius(MAX_RADIUS); + } + + public void exitBenchmark() { + mScript.set_radius(mRadius); + } +} diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Fisheye.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Fisheye.java new file mode 100644 index 000000000000..995cf9da9b40 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Fisheye.java @@ -0,0 +1,103 @@ +/* + * 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.image2; + +import android.support.v8.renderscript.*; +import android.widget.SeekBar; +import android.widget.TextView; + +public class Fisheye extends TestBase { + private ScriptC_fisheye_full mScript_full = null; + private ScriptC_fisheye_relaxed mScript_relaxed = null; + private final boolean relaxed; + private float center_x = 0.5f; + private float center_y = 0.5f; + private float scale = 0.5f; + + public Fisheye(boolean relaxed) { + this.relaxed = relaxed; + } + + public boolean onBar1Setup(SeekBar b, TextView t) { + t.setText("Scale"); + b.setMax(100); + b.setProgress(25); + return true; + } + public boolean onBar2Setup(SeekBar b, TextView t) { + t.setText("Shift center X"); + b.setMax(100); + b.setProgress(50); + return true; + } + public boolean onBar3Setup(SeekBar b, TextView t) { + t.setText("Shift center Y"); + b.setMax(100); + b.setProgress(50); + return true; + } + + public void onBar1Changed(int progress) { + scale = progress / 50.0f; + do_init(); + } + public void onBar2Changed(int progress) { + center_x = progress / 100.0f; + do_init(); + } + public void onBar3Changed(int progress) { + center_y = progress / 100.0f; + do_init(); + } + + private void do_init() { + if (relaxed) + mScript_relaxed.invoke_init_filter( + mInPixelsAllocation.getType().getX(), + mInPixelsAllocation.getType().getY(), center_x, center_y, + scale); + else + mScript_full.invoke_init_filter( + mInPixelsAllocation.getType().getX(), + mInPixelsAllocation.getType().getY(), center_x, center_y, + scale); + } + + public void createTest(android.content.res.Resources res) { + if (relaxed) { + mScript_relaxed = new ScriptC_fisheye_relaxed(mRS, res, + R.raw.fisheye_relaxed); + mScript_relaxed.set_in_alloc(mInPixelsAllocation); + mScript_relaxed.set_sampler(Sampler.CLAMP_LINEAR(mRS)); + } else { + mScript_full = new ScriptC_fisheye_full(mRS, res, + R.raw.fisheye_full); + mScript_full.set_in_alloc(mInPixelsAllocation); + mScript_full.set_sampler(Sampler.CLAMP_LINEAR(mRS)); + } + do_init(); + } + + public void runTest() { + if (relaxed) + mScript_relaxed.forEach_root(mOutPixelsAllocation); + else + mScript_full.forEach_root(mOutPixelsAllocation); + } + +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Grain.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Grain.java new file mode 100644 index 000000000000..e00edd7968b9 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Grain.java @@ -0,0 +1,68 @@ +/* + * 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.image2; + +import java.lang.Math; + +import android.support.v8.renderscript.*; +import android.util.Log; +import android.widget.SeekBar; +import android.widget.TextView; + +public class Grain extends TestBase { + private ScriptC_grain mScript; + private Allocation mNoise; + private Allocation mNoise2; + + + public boolean onBar1Setup(SeekBar b, TextView t) { + t.setText("Strength"); + b.setProgress(50); + return true; + } + + public void onBar1Changed(int progress) { + float s = progress / 100.0f; + mScript.set_gNoiseStrength(s); + } + + public void createTest(android.content.res.Resources res) { + int width = mInPixelsAllocation.getType().getX(); + int height = mInPixelsAllocation.getType().getY(); + + Type.Builder tb = new Type.Builder(mRS, Element.U8(mRS)); + tb.setX(width); + tb.setY(height); + mNoise = Allocation.createTyped(mRS, tb.create()); + mNoise2 = Allocation.createTyped(mRS, tb.create()); + + mScript = new ScriptC_grain(mRS, res, R.raw.grain); + mScript.set_gWidth(width); + mScript.set_gHeight(height); + mScript.set_gNoiseStrength(0.5f); + mScript.set_gBlendSource(mNoise); + mScript.set_gNoise(mNoise2); + } + + public void runTest() { + mScript.forEach_genRand(mNoise); + mScript.forEach_blend9(mNoise2); + mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); + } + +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Greyscale.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Greyscale.java new file mode 100644 index 000000000000..2d85ae78667a --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Greyscale.java @@ -0,0 +1,35 @@ +/* + * 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.image2; + +import java.lang.Math; + +import android.support.v8.renderscript.*; +import android.util.Log; + +public class Greyscale extends TestBase { + private ScriptC_greyscale mScript; + + public void createTest(android.content.res.Resources res) { + mScript = new ScriptC_greyscale(mRS, res, R.raw.greyscale); + } + + public void runTest() { + mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/GroupTest.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/GroupTest.java new file mode 100644 index 000000000000..b9fbb5921288 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/GroupTest.java @@ -0,0 +1,87 @@ +/* + * 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.image2; + +import java.lang.Math; + +import android.support.v8.renderscript.*; +import android.util.Log; + +public class GroupTest extends TestBase { + private ScriptC_convolve3x3 mConvolve; + private ScriptC_colormatrix mMatrix; + + private Allocation mScratchPixelsAllocation1; + private ScriptGroup mGroup; + + private int mWidth; + private int mHeight; + private boolean mUseNative; + + + public GroupTest(boolean useNative) { + mUseNative = useNative; + } + + public void createTest(android.content.res.Resources res) { + mWidth = mInPixelsAllocation.getType().getX(); + mHeight = mInPixelsAllocation.getType().getY(); + + mConvolve = new ScriptC_convolve3x3(mRS, res, R.raw.convolve3x3); + mMatrix = new ScriptC_colormatrix(mRS, res, R.raw.colormatrix); + + float f[] = new float[9]; + f[0] = 0.f; f[1] = -1.f; f[2] = 0.f; + f[3] = -1.f; f[4] = 5.f; f[5] = -1.f; + f[6] = 0.f; f[7] = -1.f; f[8] = 0.f; + mConvolve.set_gCoeffs(f); + + Matrix4f m = new Matrix4f(); + m.set(1, 0, 0.2f); + m.set(1, 1, 0.9f); + m.set(1, 2, 0.2f); + mMatrix.invoke_setMatrix(m); + + Type.Builder tb = new Type.Builder(mRS, Element.U8_4(mRS)); + tb.setX(mWidth); + tb.setY(mHeight); + Type connect = tb.create(); + + if (mUseNative) { + ScriptGroup.Builder b = new ScriptGroup.Builder(mRS); + b.addConnection(connect, mConvolve, mMatrix, null); + mGroup = b.create(); + + } else { + mScratchPixelsAllocation1 = Allocation.createTyped(mRS, connect); + } + } + + public void runTest() { + mConvolve.set_gIn(mInPixelsAllocation); + mConvolve.set_gWidth(mWidth); + mConvolve.set_gHeight(mHeight); + if (mUseNative) { + mGroup.setOutput(mMatrix, mOutPixelsAllocation); + mGroup.execute(); + } else { + mConvolve.forEach_root(mScratchPixelsAllocation1); + mMatrix.forEach_root(mScratchPixelsAllocation1, mOutPixelsAllocation); + } + } + +} diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/ImageProcessingActivity2.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/ImageProcessingActivity2.java new file mode 100644 index 000000000000..9b36da144c58 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/ImageProcessingActivity2.java @@ -0,0 +1,291 @@ +/* + * 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.image2; + +import android.app.Activity; +import android.os.Bundle; +import android.graphics.BitmapFactory; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.support.v8.renderscript.*; +import android.view.SurfaceView; +import android.view.SurfaceHolder; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.Spinner; +import android.widget.TextView; +import android.view.View; +import android.util.Log; +import java.lang.Math; + +public class ImageProcessingActivity2 extends Activity + implements SeekBar.OnSeekBarChangeListener { + private final String TAG = "Img"; + Bitmap mBitmapIn; + Bitmap mBitmapOut; + String mTestNames[]; + + private SeekBar mBar1; + private SeekBar mBar2; + private SeekBar mBar3; + private SeekBar mBar4; + private SeekBar mBar5; + private TextView mText1; + private TextView mText2; + private TextView mText3; + private TextView mText4; + private TextView mText5; + + private float mSaturation = 1.0f; + + private TextView mBenchmarkResult; + private Spinner mTestSpinner; + + private SurfaceView mSurfaceView; + private ImageView mDisplayView; + + private boolean mDoingBenchmark; + + private TestBase mTest; + + + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + + if (seekBar == mBar1) { + mTest.onBar1Changed(progress); + } else if (seekBar == mBar2) { + mTest.onBar2Changed(progress); + } else if (seekBar == mBar3) { + mTest.onBar3Changed(progress); + } else if (seekBar == mBar4) { + mTest.onBar4Changed(progress); + } else if (seekBar == mBar5) { + mTest.onBar5Changed(progress); + } + + mTest.runTest(); + mTest.updateBitmap(mBitmapOut); + mDisplayView.invalidate(); + } + } + + public void onStartTrackingTouch(SeekBar seekBar) { + } + + public void onStopTrackingTouch(SeekBar seekBar) { + } + + void setupBars() { + mBar1.setVisibility(View.VISIBLE); + mText1.setVisibility(View.VISIBLE); + mTest.onBar1Setup(mBar1, mText1); + + mBar2.setVisibility(View.VISIBLE); + mText2.setVisibility(View.VISIBLE); + mTest.onBar2Setup(mBar2, mText2); + + mBar3.setVisibility(View.VISIBLE); + mText3.setVisibility(View.VISIBLE); + mTest.onBar3Setup(mBar3, mText3); + + mBar4.setVisibility(View.VISIBLE); + mText4.setVisibility(View.VISIBLE); + mTest.onBar4Setup(mBar4, mText4); + + mBar5.setVisibility(View.VISIBLE); + mText5.setVisibility(View.VISIBLE); + mTest.onBar5Setup(mBar5, mText5); + } + + + void changeTest(int testID) { + switch(testID) { + case 0: + mTest = new LevelsV4(false, false); + break; + case 1: + mTest = new LevelsV4(false, true); + break; + case 2: + mTest = new LevelsV4(true, false); + break; + case 3: + mTest = new LevelsV4(true, true); + break; + case 4: + mTest = new Blur25(); + break; + case 5: + mTest = new Greyscale(); + break; + case 6: + mTest = new Grain(); + break; + case 7: + mTest = new Fisheye(false); + break; + case 8: + mTest = new Fisheye(true); + break; + case 9: + mTest = new Vignette(false); + break; + case 10: + mTest = new Vignette(true); + break; + case 11: + mTest = new GroupTest(false); + break; + case 12: + mTest = new GroupTest(true); + break; + } + + mTest.createBaseTest(this, mBitmapIn); + setupBars(); + + mTest.runTest(); + mTest.updateBitmap(mBitmapOut); + mDisplayView.invalidate(); + mBenchmarkResult.setText("Result: not run"); + } + + void setupTests() { + mTestNames = new String[13]; + mTestNames[0] = "Levels Vec3 Relaxed"; + mTestNames[1] = "Levels Vec4 Relaxed"; + mTestNames[2] = "Levels Vec3 Full"; + mTestNames[3] = "Levels Vec4 Full"; + mTestNames[4] = "Blur radius 25"; + mTestNames[5] = "Greyscale"; + mTestNames[6] = "Grain"; + mTestNames[7] = "Fisheye Full"; + mTestNames[8] = "Fisheye Relaxed"; + mTestNames[9] = "Vignette Full"; + mTestNames[10] = "Vignette Relaxed"; + mTestNames[11] = "Group Test (emulated)"; + mTestNames[12] = "Group Test (native)"; + mTestSpinner.setAdapter(new ArrayAdapter<String>( + this, R.layout.spinner_layout, mTestNames)); + } + + private AdapterView.OnItemSelectedListener mTestSpinnerListener = + new AdapterView.OnItemSelectedListener() { + public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { + changeTest(pos); + } + + public void onNothingSelected(AdapterView parent) { + + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + mBitmapIn = loadBitmap(R.drawable.city); + mBitmapOut = loadBitmap(R.drawable.city); + + mSurfaceView = (SurfaceView) findViewById(R.id.surface); + + mDisplayView = (ImageView) findViewById(R.id.display); + mDisplayView.setImageBitmap(mBitmapOut); + + mBar1 = (SeekBar) findViewById(R.id.slider1); + mBar2 = (SeekBar) findViewById(R.id.slider2); + mBar3 = (SeekBar) findViewById(R.id.slider3); + mBar4 = (SeekBar) findViewById(R.id.slider4); + mBar5 = (SeekBar) findViewById(R.id.slider5); + + mBar1.setOnSeekBarChangeListener(this); + mBar2.setOnSeekBarChangeListener(this); + mBar3.setOnSeekBarChangeListener(this); + mBar4.setOnSeekBarChangeListener(this); + mBar5.setOnSeekBarChangeListener(this); + + mText1 = (TextView) findViewById(R.id.slider1Text); + mText2 = (TextView) findViewById(R.id.slider2Text); + mText3 = (TextView) findViewById(R.id.slider3Text); + mText4 = (TextView) findViewById(R.id.slider4Text); + mText5 = (TextView) findViewById(R.id.slider5Text); + + mTestSpinner = (Spinner) findViewById(R.id.filterselection); + mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener); + + mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText); + mBenchmarkResult.setText("Result: not run"); + + setupTests(); + changeTest(0); + } + + + private Bitmap loadBitmap(int resource) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inPreferredConfig = Bitmap.Config.ARGB_8888; + return copyBitmap(BitmapFactory.decodeResource(getResources(), resource, options)); + } + + private static Bitmap copyBitmap(Bitmap source) { + Bitmap b = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig()); + Canvas c = new Canvas(b); + c.drawBitmap(source, 0, 0, null); + source.recycle(); + return b; + } + + // button hook + public void benchmark(View v) { + long t = getBenchmark(); + //long javaTime = javaFilter(); + //mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms"); + mBenchmarkResult.setText("Result: " + t + " ms"); + } + + // For benchmark test + public long getBenchmark() { + mDoingBenchmark = true; + + mTest.setupBenchmark(); + long result = 0; + + Log.v(TAG, "Warming"); + long t = java.lang.System.currentTimeMillis() + 2000; + do { + mTest.runTest(); + mTest.finish(); + } while (t > java.lang.System.currentTimeMillis()); + + + Log.v(TAG, "Benchmarking"); + t = java.lang.System.currentTimeMillis(); + mTest.runTest(); + mTest.finish(); + t = java.lang.System.currentTimeMillis() - t; + + Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t); + mTest.exitBenchmark(); + mDoingBenchmark = false; + + return t; + } +} diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/LevelsV4.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/LevelsV4.java new file mode 100644 index 000000000000..fbe3727676b0 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/LevelsV4.java @@ -0,0 +1,161 @@ +/* + * 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.image2; + +import java.lang.Math; + +import android.support.v8.renderscript.*; +import android.util.Log; +import android.widget.SeekBar; +import android.widget.TextView; + + +public class LevelsV4 extends TestBase { + private ScriptC_levels_relaxed mScriptR; + private ScriptC_levels_full mScriptF; + private float mInBlack = 0.0f; + private float mOutBlack = 0.0f; + private float mInWhite = 255.0f; + private float mOutWhite = 255.0f; + private float mSaturation = 1.0f; + + Matrix3f satMatrix = new Matrix3f(); + float mInWMinInB; + float mOutWMinOutB; + float mOverInWMinInB; + + boolean mUseFull; + boolean mUseV4; + + LevelsV4(boolean useFull, boolean useV4) { + mUseFull = useFull; + mUseV4 = useV4; + } + + + private void setLevels() { + mInWMinInB = mInWhite - mInBlack; + mOutWMinOutB = mOutWhite - mOutBlack; + mOverInWMinInB = 1.f / mInWMinInB; + + mScriptR.set_inBlack(mInBlack); + mScriptR.set_outBlack(mOutBlack); + mScriptR.set_inWMinInB(mInWMinInB); + mScriptR.set_outWMinOutB(mOutWMinOutB); + mScriptR.set_overInWMinInB(mOverInWMinInB); + mScriptF.set_inBlack(mInBlack); + mScriptF.set_outBlack(mOutBlack); + mScriptF.set_inWMinInB(mInWMinInB); + mScriptF.set_outWMinOutB(mOutWMinOutB); + mScriptF.set_overInWMinInB(mOverInWMinInB); + } + + private void setSaturation() { + float rWeight = 0.299f; + float gWeight = 0.587f; + float bWeight = 0.114f; + float oneMinusS = 1.0f - mSaturation; + + satMatrix.set(0, 0, oneMinusS * rWeight + mSaturation); + satMatrix.set(0, 1, oneMinusS * rWeight); + satMatrix.set(0, 2, oneMinusS * rWeight); + satMatrix.set(1, 0, oneMinusS * gWeight); + satMatrix.set(1, 1, oneMinusS * gWeight + mSaturation); + satMatrix.set(1, 2, oneMinusS * gWeight); + satMatrix.set(2, 0, oneMinusS * bWeight); + satMatrix.set(2, 1, oneMinusS * bWeight); + satMatrix.set(2, 2, oneMinusS * bWeight + mSaturation); + mScriptR.set_colorMat(satMatrix); + mScriptF.set_colorMat(satMatrix); + } + + public boolean onBar1Setup(SeekBar b, TextView t) { + b.setProgress(50); + t.setText("Saturation"); + return true; + } + public boolean onBar2Setup(SeekBar b, TextView t) { + b.setMax(128); + b.setProgress(0); + t.setText("In Black"); + return true; + } + public boolean onBar3Setup(SeekBar b, TextView t) { + b.setMax(128); + b.setProgress(0); + t.setText("Out Black"); + return true; + } + public boolean onBar4Setup(SeekBar b, TextView t) { + b.setMax(128); + b.setProgress(128); + t.setText("Out White"); + return true; + } + public boolean onBar5Setup(SeekBar b, TextView t) { + b.setMax(128); + b.setProgress(128); + t.setText("Out White"); + return true; + } + + public void onBar1Changed(int progress) { + mSaturation = (float)progress / 50.0f; + setSaturation(); + } + public void onBar2Changed(int progress) { + mInBlack = (float)progress; + setLevels(); + } + public void onBar3Changed(int progress) { + mOutBlack = (float)progress; + setLevels(); + } + public void onBar4Changed(int progress) { + mInWhite = (float)progress + 127.0f; + setLevels(); + } + public void onBar5Changed(int progress) { + mOutWhite = (float)progress + 127.0f; + setLevels(); + } + + public void createTest(android.content.res.Resources res) { + mScriptR = new ScriptC_levels_relaxed(mRS, res, R.raw.levels_relaxed); + mScriptF = new ScriptC_levels_full(mRS, res, R.raw.levels_full); + setSaturation(); + setLevels(); + } + + public void runTest() { + if (mUseFull) { + if (mUseV4) { + mScriptF.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation); + } else { + mScriptF.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); + } + } else { + if (mUseV4) { + mScriptR.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation); + } else { + mScriptR.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); + } + } + } + +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/TestBase.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/TestBase.java new file mode 100644 index 000000000000..35170af46f3d --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/TestBase.java @@ -0,0 +1,117 @@ +/* + * 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.image2; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.graphics.BitmapFactory; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.support.v8.renderscript.*; +import android.view.SurfaceView; +import android.view.SurfaceHolder; +import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.TextView; +import android.view.View; +import android.util.Log; +import java.lang.Math; + +public class TestBase { + protected final String TAG = "Img"; + + protected RenderScript mRS; + protected Allocation mInPixelsAllocation; + protected Allocation mOutPixelsAllocation; + + // Override to use UI elements + public void onBar1Changed(int progress) { + } + public void onBar2Changed(int progress) { + } + public void onBar3Changed(int progress) { + } + public void onBar4Changed(int progress) { + } + public void onBar5Changed(int progress) { + } + + // Override to use UI elements + // Unused bars will be hidden. + public boolean onBar1Setup(SeekBar b, TextView t) { + b.setVisibility(View.INVISIBLE); + t.setVisibility(View.INVISIBLE); + return false; + } + public boolean onBar2Setup(SeekBar b, TextView t) { + b.setVisibility(View.INVISIBLE); + t.setVisibility(View.INVISIBLE); + return false; + } + public boolean onBar3Setup(SeekBar b, TextView t) { + b.setVisibility(View.INVISIBLE); + t.setVisibility(View.INVISIBLE); + return false; + } + public boolean onBar4Setup(SeekBar b, TextView t) { + b.setVisibility(View.INVISIBLE); + t.setVisibility(View.INVISIBLE); + return false; + } + public boolean onBar5Setup(SeekBar b, TextView t) { + b.setVisibility(View.INVISIBLE); + t.setVisibility(View.INVISIBLE); + return false; + } + + public final void createBaseTest(ImageProcessingActivity2 act, Bitmap b) { + mRS = RenderScript.create(act); + mInPixelsAllocation = Allocation.createFromBitmap(mRS, b, + Allocation.MipmapControl.MIPMAP_NONE, + Allocation.USAGE_SCRIPT); + mOutPixelsAllocation = Allocation.createFromBitmap(mRS, b, + Allocation.MipmapControl.MIPMAP_NONE, + Allocation.USAGE_SCRIPT); + createTest(act.getResources()); + } + + // Must override + public void createTest(android.content.res.Resources res) { + android.util.Log.e("img", "implement createTest"); + } + + // Must override + public void runTest() { + } + + public void finish() { + mRS.finish(); + } + + public void updateBitmap(Bitmap b) { + mOutPixelsAllocation.copyTo(b); + } + + // Override to configure specific benchmark config. + public void setupBenchmark() { + } + + // Override to reset after benchmark. + public void exitBenchmark() { + } +} diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Vignette.java b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Vignette.java new file mode 100644 index 000000000000..fc69ebae14ea --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/Vignette.java @@ -0,0 +1,121 @@ +/* + * 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.image2; + +import android.support.v8.renderscript.*; +import android.widget.SeekBar; +import android.widget.TextView; + +public class Vignette extends TestBase { + private ScriptC_vignette_full mScript_full = null; + private ScriptC_vignette_relaxed mScript_relaxed = null; + private final boolean relaxed; + private float center_x = 0.5f; + private float center_y = 0.5f; + private float scale = 0.5f; + private float shade = 0.5f; + private float slope = 20.0f; + + public Vignette(boolean relaxed) { + this.relaxed = relaxed; + } + + public boolean onBar1Setup(SeekBar b, TextView t) { + t.setText("Scale"); + b.setMax(100); + b.setProgress(25); + return true; + } + public boolean onBar2Setup(SeekBar b, TextView t) { + t.setText("Shade"); + b.setMax(100); + b.setProgress(50); + return true; + } + public boolean onBar3Setup(SeekBar b, TextView t) { + t.setText("Slope"); + b.setMax(100); + b.setProgress(20); + return true; + } + public boolean onBar4Setup(SeekBar b, TextView t) { + t.setText("Shift center X"); + b.setMax(100); + b.setProgress(50); + return true; + } + public boolean onBar5Setup(SeekBar b, TextView t) { + t.setText("Shift center Y"); + b.setMax(100); + b.setProgress(50); + return true; + } + + public void onBar1Changed(int progress) { + scale = progress / 50.0f; + do_init(); + } + public void onBar2Changed(int progress) { + shade = progress / 100.0f; + do_init(); + } + public void onBar3Changed(int progress) { + slope = (float)progress; + do_init(); + } + public void onBar4Changed(int progress) { + center_x = progress / 100.0f; + do_init(); + } + public void onBar5Changed(int progress) { + center_y = progress / 100.0f; + do_init(); + } + + private void do_init() { + if (relaxed) + mScript_relaxed.invoke_init_vignette( + mInPixelsAllocation.getType().getX(), + mInPixelsAllocation.getType().getY(), center_x, center_y, + scale, shade, slope); + else + mScript_full.invoke_init_vignette( + mInPixelsAllocation.getType().getX(), + mInPixelsAllocation.getType().getY(), center_x, center_y, + scale, shade, slope); + } + + public void createTest(android.content.res.Resources res) { + if (relaxed) { + mScript_relaxed = new ScriptC_vignette_relaxed(mRS, res, + R.raw.vignette_relaxed); + } else { + mScript_full = new ScriptC_vignette_full(mRS, res, + R.raw.vignette_full); + } + do_init(); + } + + public void runTest() { + if (relaxed) + mScript_relaxed.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); + else + mScript_full.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); + } + +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/colormatrix.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/colormatrix.rs new file mode 100644 index 000000000000..e93bef3f1d8b --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/colormatrix.rs @@ -0,0 +1,38 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) +#pragma rs_fp_relaxed + + +static rs_matrix4x4 Mat; + +void init() { + rsMatrixLoadIdentity(&Mat); +} + +void setMatrix(rs_matrix4x4 m) { + Mat = m; +} + +void root(const uchar4 *in, uchar4 *out) { + float4 f = convert_float4(*in); + f = rsMatrixMultiply(&Mat, f); + f = clamp(f, 0.f, 255.f); + *out = convert_uchar4(f); +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/convolve3x3.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/convolve3x3.rs new file mode 100644 index 000000000000..b55190cb4758 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/convolve3x3.rs @@ -0,0 +1,67 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) +#pragma rs_fp_relaxed + +int32_t gWidth; +int32_t gHeight; +rs_allocation gIn; + +float gCoeffs[9]; + +void root(uchar4 *out, uint32_t x, uint32_t y) { + uint32_t x1 = min((int32_t)x+1, gWidth); + uint32_t x2 = max((int32_t)x-1, 0); + uint32_t y1 = min((int32_t)y+1, gHeight); + uint32_t y2 = max((int32_t)y-1, 0); + + float4 p00 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x1, y1))[0]); + float4 p01 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x, y1))[0]); + float4 p02 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x2, y1))[0]); + float4 p10 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x1, y))[0]); + float4 p11 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x, y))[0]); + float4 p12 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x2, y))[0]); + float4 p20 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x1, y2))[0]); + float4 p21 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x, y2))[0]); + float4 p22 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x2, y2))[0]); + p00 *= gCoeffs[0]; + p01 *= gCoeffs[1]; + p02 *= gCoeffs[2]; + p10 *= gCoeffs[3]; + p11 *= gCoeffs[4]; + p12 *= gCoeffs[5]; + p20 *= gCoeffs[6]; + p21 *= gCoeffs[7]; + p22 *= gCoeffs[8]; + + p00 += p01; + p02 += p10; + p11 += p12; + p20 += p21; + + p22 += p00; + p02 += p11; + + p20 += p22; + p20 += p02; + + p20 = clamp(p20, 0.f, 255.f); + *out = convert_uchar4(p20); +} + + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye.rsh b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye.rsh new file mode 100644 index 000000000000..4dcfc1daaca0 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye.rsh @@ -0,0 +1,63 @@ +/* + * 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. + */ + +rs_allocation in_alloc; +rs_sampler sampler; + +static float2 center, dimensions; +static float2 scale; +static float alpha; +static float radius2; +static float factor; + +void init_filter(uint32_t dim_x, uint32_t dim_y, float focus_x, float focus_y, float k) { + center.x = focus_x; + center.y = focus_y; + dimensions.x = (float)dim_x; + dimensions.y = (float)dim_y; + + alpha = k * 2.0 + 0.75; + float bound2 = 0.25; + if (dim_x > dim_y) { + scale.x = 1.0; + scale.y = dimensions.y / dimensions.x; + bound2 *= (scale.y*scale.y + 1); + } else { + scale.x = dimensions.x / dimensions.y; + scale.y = 1.0; + bound2 *= (scale.x*scale.x + 1); + } + const float bound = sqrt(bound2); + const float radius = 1.15 * bound; + radius2 = radius*radius; + const float max_radian = 0.5f * M_PI - atan(alpha / bound * sqrt(radius2 - bound2)); + factor = bound / max_radian; +} + +void root(uchar4 *out, uint32_t x, uint32_t y) { + // Convert x and y to floating point coordinates with center as origin + float2 coord; + coord.x = (float)x / dimensions.x; + coord.y = (float)y / dimensions.y; + coord -= center; + const float dist = length(scale * coord); + const float radian = M_PI_2 - atan((alpha * sqrt(radius2 - dist * dist)) / dist); + const float scalar = radian * factor / dist; + const float2 new_coord = coord * scalar + center; + const float4 fout = rsSample(in_alloc, sampler, new_coord); + *out = rsPackColorTo8888(fout); +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye_full.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye_full.rs new file mode 100644 index 000000000000..e42df1316601 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye_full.rs @@ -0,0 +1,21 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) + +#include "fisheye.rsh" + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye_relaxed.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye_relaxed.rs new file mode 100644 index 000000000000..990310b1bceb --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/fisheye_relaxed.rs @@ -0,0 +1,22 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) +#pragma rs_fp_relaxed + +#include "fisheye.rsh" + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/grain.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/grain.rs new file mode 100644 index 000000000000..75f4021c09bd --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/grain.rs @@ -0,0 +1,92 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) +#pragma rs_fp_relaxed + +void genRand(uchar *out) { + *out = (uchar)rsRand(0xff); +} + +/* + * Convolution matrix of distance 2 with fixed point of 'kShiftBits' bits + * shifted. Thus the sum of this matrix should be 'kShiftValue'. Entries of + * small values are not calculated to gain efficiency. + * The order ot pixels represented in this matrix is: + * 1 2 3 + * 4 0 5 + * 6 7 8 + * and the matrix should be: {230, 56, 114, 56, 114, 114, 56, 114, 56}. + * However, since most of the valus are identical, we only use the first three + * entries and the entries corresponding to the pixels is: + * 1 2 1 + * 2 0 2 + * 1 2 1 + */ + +int32_t gWidth; +int32_t gHeight; + +rs_allocation gBlendSource; +void blend9(uchar *out, uint32_t x, uint32_t y) { + uint32_t x1 = min(x+1, (uint32_t)gWidth); + uint32_t x2 = max(x-1, (uint32_t)0); + uint32_t y1 = min(y+1, (uint32_t)gHeight); + uint32_t y2 = max(y-1, (uint32_t)0); + + uint p00 = 56 * ((uchar *)rsGetElementAt(gBlendSource, x1, y1))[0]; + uint p01 = 114 * ((uchar *)rsGetElementAt(gBlendSource, x, y1))[0]; + uint p02 = 56 * ((uchar *)rsGetElementAt(gBlendSource, x2, y1))[0]; + uint p10 = 114 * ((uchar *)rsGetElementAt(gBlendSource, x1, y))[0]; + uint p11 = 230 * ((uchar *)rsGetElementAt(gBlendSource, x, y))[0]; + uint p12 = 114 * ((uchar *)rsGetElementAt(gBlendSource, x2, y))[0]; + uint p20 = 56 * ((uchar *)rsGetElementAt(gBlendSource, x1, y2))[0]; + uint p21 = 114 * ((uchar *)rsGetElementAt(gBlendSource, x, y2))[0]; + uint p22 = 56 * ((uchar *)rsGetElementAt(gBlendSource, x2, y2))[0]; + + p00 += p01; + p02 += p10; + p11 += p12; + p20 += p21; + + p22 += p00; + p02 += p11; + + p20 += p22; + p20 += p02; + + *out = (uchar)(p20 >> 10); +} + +float gNoiseStrength; + +rs_allocation gNoise; +void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) { + float4 ip = convert_float4(*in); + float pnoise = (float) ((uchar *)rsGetElementAt(gNoise, x, y))[0]; + + float energy_level = ip.r + ip.g + ip.b; + float energy_mask = (28.f - sqrt(energy_level)) * 0.03571f; + pnoise = (pnoise - 128.f) * energy_mask; + + ip += pnoise * gNoiseStrength; + ip = clamp(ip, 0.f, 255.f); + + uchar4 p = convert_uchar4(ip); + p.a = 0xff; + *out = p; +} diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/greyscale.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/greyscale.rs new file mode 100644 index 000000000000..b5abf3f0e7c5 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/greyscale.rs @@ -0,0 +1,30 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) +#pragma rs_fp_relaxed + +const static float3 gMonoMult = {0.299f, 0.587f, 0.114f}; + +void root(const uchar4 *v_in, uchar4 *v_out) { + float4 f4 = rsUnpackColor8888(*v_in); + + float3 mono = dot(f4.rgb, gMonoMult); + *v_out = rsPackColorTo8888(mono); +} + + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/horizontal_blur.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/horizontal_blur.rs new file mode 100644 index 000000000000..ee8349658228 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/horizontal_blur.rs @@ -0,0 +1,28 @@ +#pragma version(1) +#pragma rs_fp_relaxed + +#include "ip.rsh" + +void root(float4 *out, const void *usrData, uint32_t x, uint32_t y) { + const FilterStruct *fs = (const FilterStruct *)usrData; + float3 blurredPixel = 0; + const float *gPtr = fs->gaussian; + if ((x > fs->radius) && (x < (fs->width - fs->radius))) { + for (int r = -fs->radius; r <= fs->radius; r ++) { + const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x + r, y); + blurredPixel += i->xyz * gPtr[0]; + gPtr++; + } + } else { + for (int r = -fs->radius; r <= fs->radius; r ++) { + // Stepping left and right away from the pixel + int validX = rsClamp((int)x + r, (int)0, (int)(fs->width - 1)); + const float4 *i = (const float4 *)rsGetElementAt(fs->ain, validX, y); + blurredPixel += i->xyz * gPtr[0]; + gPtr++; + } + } + + out->xyz = blurredPixel; +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/ip.rsh b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/ip.rsh new file mode 100644 index 000000000000..0cdf9e181150 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/ip.rsh @@ -0,0 +1,15 @@ +#pragma rs java_package_name(com.android.rs.image2) + +#define MAX_RADIUS 25 + +typedef struct FilterStruct_s { + rs_allocation ain; + + float *gaussian; //[MAX_RADIUS * 2 + 1]; + int height; + int width; + int radius; + +} FilterStruct; + + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels.rsh b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels.rsh new file mode 100644 index 000000000000..7c5d930f111c --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels.rsh @@ -0,0 +1,44 @@ +/* + * 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. + */ + +float inBlack; +float outBlack; +float inWMinInB; +float outWMinOutB; +float overInWMinInB; +rs_matrix3x3 colorMat; + +void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) { + float3 pixel = convert_float4(in[0]).rgb; + pixel = rsMatrixMultiply(&colorMat, pixel); + pixel = clamp(pixel, 0.f, 255.f); + pixel = (pixel - inBlack) * overInWMinInB; + pixel = pixel * outWMinOutB + outBlack; + pixel = clamp(pixel, 0.f, 255.f); + out->xyz = convert_uchar3(pixel); + out->w = 0xff; +} + +void root4(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) { + float4 pixel = convert_float4(in[0]); + pixel.rgb = rsMatrixMultiply(&colorMat, pixel.rgb); + pixel = clamp(pixel, 0.f, 255.f); + pixel = (pixel - inBlack) * overInWMinInB; + pixel = pixel * outWMinOutB + outBlack; + pixel = clamp(pixel, 0.f, 255.f); + out->xyzw = convert_uchar4(pixel); +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels_full.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels_full.rs new file mode 100644 index 000000000000..a4aa388920b2 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels_full.rs @@ -0,0 +1,21 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) + +#include "levels.rsh" + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels_relaxed.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels_relaxed.rs new file mode 100644 index 000000000000..ffdcfe3e7e18 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/levels_relaxed.rs @@ -0,0 +1,22 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) +#pragma rs_fp_relaxed + +#include "levels.rsh" + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/threshold.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/threshold.rs new file mode 100644 index 000000000000..77cd5be582a0 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/threshold.rs @@ -0,0 +1,93 @@ +#pragma version(1) + +#include "ip.rsh" + +int height; +int width; +int radius; + +uchar4 * InPixel; +uchar4 * OutPixel; +float4 * ScratchPixel1; +float4 * ScratchPixel2; + +rs_script vBlurScript; +rs_script hBlurScript; + +const int CMD_FINISHED = 1; + +// Store our coefficients here +static float gaussian[MAX_RADIUS * 2 + 1]; + + +static void computeGaussianWeights() { + // Compute gaussian weights for the blur + // e is the euler's number + float e = 2.718281828459045f; + float pi = 3.1415926535897932f; + // g(x) = ( 1 / sqrt( 2 * pi ) * sigma) * e ^ ( -x^2 / 2 * sigma^2 ) + // x is of the form [-radius .. 0 .. radius] + // and sigma varies with radius. + // Based on some experimental radius values and sigma's + // we approximately fit sigma = f(radius) as + // sigma = radius * 0.4 + 0.6 + // The larger the radius gets, the more our gaussian blur + // will resemble a box blur since with large sigma + // the gaussian curve begins to lose its shape + float sigma = 0.4f * (float)radius + 0.6f; + + // Now compute the coefficints + // We will store some redundant values to save some math during + // the blur calculations + // precompute some values + float coeff1 = 1.0f / (sqrt( 2.0f * pi ) * sigma); + float coeff2 = - 1.0f / (2.0f * sigma * sigma); + + float normalizeFactor = 0.0f; + float floatR = 0.0f; + int r; + for (r = -radius; r <= radius; r ++) { + floatR = (float)r; + gaussian[r + radius] = coeff1 * pow(e, floatR * floatR * coeff2); + normalizeFactor += gaussian[r + radius]; + } + + //Now we need to normalize the weights because all our coefficients need to add up to one + normalizeFactor = 1.0f / normalizeFactor; + for (r = -radius; r <= radius; r ++) { + floatR = (float)r; + gaussian[r + radius] *= normalizeFactor; + } +} + + +static void copyInput() { + rs_allocation ain; + ain = rsGetAllocation(InPixel); + uint32_t dimx = rsAllocationGetDimX(ain); + uint32_t dimy = rsAllocationGetDimY(ain); + for (uint32_t y = 0; y < dimy; y++) { + for (uint32_t x = 0; x < dimx; x++) { + ScratchPixel1[x + y * dimx] = convert_float4(InPixel[x + y * dimx]); + } + } +} + +void filter() { + copyInput(); + computeGaussianWeights(); + + FilterStruct fs; + fs.gaussian = gaussian; + fs.width = width; + fs.height = height; + fs.radius = radius; + + fs.ain = rsGetAllocation(ScratchPixel1); + rsForEach(hBlurScript, fs.ain, rsGetAllocation(ScratchPixel2), &fs, sizeof(fs)); + + fs.ain = rsGetAllocation(ScratchPixel2); + rsForEach(vBlurScript, fs.ain, rsGetAllocation(OutPixel), &fs, sizeof(fs)); + //rsSendToClientBlocking(CMD_FINISHED); +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vertical_blur.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vertical_blur.rs new file mode 100644 index 000000000000..60fd71bf6fd4 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vertical_blur.rs @@ -0,0 +1,59 @@ +#pragma version(1) +#pragma rs_fp_relaxed + +#include "ip.rsh" + +static float saturation; +static rs_matrix3x3 colorMat; + +void setSaturation(float sat) { + saturation = sat; + + // Saturation + // Linear weights + //float rWeight = 0.3086f; + //float gWeight = 0.6094f; + //float bWeight = 0.0820f; + + // Gamma 2.2 weights (we haven't converted our image to linear space yet for perf reasons) + float rWeight = 0.299f; + float gWeight = 0.587f; + float bWeight = 0.114f; + + float oneMinusS = 1.0f - saturation; + rsMatrixSet(&colorMat, 0, 0, oneMinusS * rWeight + saturation); + rsMatrixSet(&colorMat, 0, 1, oneMinusS * rWeight); + rsMatrixSet(&colorMat, 0, 2, oneMinusS * rWeight); + rsMatrixSet(&colorMat, 1, 0, oneMinusS * gWeight); + rsMatrixSet(&colorMat, 1, 1, oneMinusS * gWeight + saturation); + rsMatrixSet(&colorMat, 1, 2, oneMinusS * gWeight); + rsMatrixSet(&colorMat, 2, 0, oneMinusS * bWeight); + rsMatrixSet(&colorMat, 2, 1, oneMinusS * bWeight); + rsMatrixSet(&colorMat, 2, 2, oneMinusS * bWeight + saturation); +} + +void root(uchar4 *out, const void *usrData, uint32_t x, uint32_t y) { + const FilterStruct *fs = (const FilterStruct *)usrData; + float3 blurredPixel = 0; + const float *gPtr = fs->gaussian; + if ((y > fs->radius) && (y < (fs->height - fs->radius))) { + for (int r = -fs->radius; r <= fs->radius; r ++) { + const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x, y + r); + blurredPixel += i->xyz * gPtr[0]; + gPtr++; + } + } else { + for (int r = -fs->radius; r <= fs->radius; r ++) { + int validH = rsClamp((int)y + r, (int)0, (int)(fs->height - 1)); + const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x, validH); + blurredPixel += i->xyz * gPtr[0]; + gPtr++; + } + } + + float3 temp = rsMatrixMultiply(&colorMat, blurredPixel); + temp = clamp(temp, 0.f, 255.f); + out->xyz = convert_uchar3(temp); + out->w = 0xff; +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette.rsh b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette.rsh new file mode 100644 index 000000000000..a1e4ae545f93 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette.rsh @@ -0,0 +1,59 @@ +/* + * 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. + */ + +static float2 neg_center, axis_scale, inv_dimensions; +static float sloped_neg_range, sloped_inv_max_dist, shade, opp_shade; + +void init_vignette(uint32_t dim_x, uint32_t dim_y, float center_x, float center_y, + float desired_scale, float desired_shade, float desired_slope) { + + neg_center.x = -center_x; + neg_center.y = -center_y; + inv_dimensions.x = 1.f / (float)dim_x; + inv_dimensions.y = 1.f / (float)dim_y; + + axis_scale = (float2)1.f; + if (dim_x > dim_y) + axis_scale.y = (float)dim_y / (float)dim_x; + else + axis_scale.x = (float)dim_x / (float)dim_y; + + const float max_dist = 0.5 * length(axis_scale); + sloped_inv_max_dist = desired_slope * 1.f/max_dist; + + // Range needs to be between 1.3 to 0.6. When scale is zero then range is + // 1.3 which means no vignette at all because the luminousity difference is + // less than 1/256. Expect input scale to be between 0.0 and 1.0. + const float neg_range = 0.7*sqrt(desired_scale) - 1.3; + sloped_neg_range = exp(neg_range * desired_slope); + + shade = desired_shade; + opp_shade = 1.f - desired_shade; +} + +void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) { + // Convert x and y to floating point coordinates with center as origin + const float4 fin = convert_float4(*in); + const float2 inCoord = {(float)x, (float)y}; + const float2 coord = mad(inCoord, inv_dimensions, neg_center); + const float sloped_dist_ratio = length(axis_scale * coord) * sloped_inv_max_dist; + const float lumen = opp_shade + shade / ( 1.0 + sloped_neg_range * exp(sloped_dist_ratio) ); + float4 fout; + fout.rgb = fin.rgb * lumen; + fout.w = fin.w; + *out = convert_uchar4(fout); +} + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette_full.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette_full.rs new file mode 100644 index 000000000000..5fc2ddab2b01 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette_full.rs @@ -0,0 +1,21 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) + +#include "vignette.rsh" + diff --git a/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette_relaxed.rs b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette_relaxed.rs new file mode 100644 index 000000000000..430b685199cd --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing2/src/com/android/rs/image/vignette_relaxed.rs @@ -0,0 +1,22 @@ +/* + * 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. + */ + +#pragma version(1) +#pragma rs java_package_name(com.android.rs.image2) +#pragma rs_fp_relaxed + +#include "vignette.rsh" + |