From 7c959f028869ee940a50ceb42683eaffe34f738f Mon Sep 17 00:00:00 2001 From: Alex Light Date: Wed, 8 Aug 2018 07:05:19 -0700 Subject: [PATCH 0001/1164] Work around b/70221552 If one sets a sufficiently long OUT_DIR to build into the //frameworks/base:framework-javastream-protos generate target will fail due to trying to run a too-long command. This works around that problem by making the command being run much smaller. Test: Build Bug: 70221552 Change-Id: I0134ccfc83469826d3ea8679e1c52b9b52c6d2e0 --- Android.bp | 22 ++++++++++++---------- tools/genprotos.sh | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) create mode 100755 tools/genprotos.sh diff --git a/Android.bp b/Android.bp index 22fe23dc85ee..1f95b08a8df1 100644 --- a/Android.bp +++ b/Android.bp @@ -730,22 +730,24 @@ gensrcs { name: "framework-javastream-protos", depfile: true, + tool_files: [ "tools/genprotos.sh", ], tools: [ "aprotoc", "protoc-gen-javastream", "soong_zip", ], - cmd: "mkdir -p $(genDir)/$(in) " + - "&& $(location aprotoc) " + - " --plugin=$(location protoc-gen-javastream) " + - " --dependency_out=$(depfile) " + - " --javastream_out=$(genDir)/$(in) " + - " -Iexternal/protobuf/src " + - " -I . " + - " $(in) " + - "&& $(location soong_zip) -jar -o $(out) -C $(genDir)/$(in) -D $(genDir)/$(in)", - + // TODO This should not be needed. If you set a custom OUT_DIR or OUT_DIR_COMMON_BASE you can + // end up with a command that is extremely long, potentially going passed MAX_ARG_STRLEN due to + // the way sbox rewrites the command. See b/70221552. + cmd: "$(location tools/genprotos.sh) " + + " $(location aprotoc) " + + " $(location protoc-gen-javastream) " + + " $(location soong_zip) " + + " $(genDir) " + + " $(depfile) " + + " $(in) " + + " $(out)", srcs: [ "core/proto/**/*.proto", "libs/incident/**/*.proto", diff --git a/tools/genprotos.sh b/tools/genprotos.sh new file mode 100755 index 000000000000..f901c9f588b6 --- /dev/null +++ b/tools/genprotos.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# TODO This should not be needed. If you set a custom OUT_DIR or OUT_DIR_COMMON_BASE you can +# end up with a command that is extremely long, potentially going passed MAX_ARG_STRLEN due to +# the way sbox rewrites the command. See b/70221552. + +set -e + +location_aprotoc=$1 +location_protoc=$2 +location_soong_zip=$3 +genDir=$4 +depfile=$5 +in=$6 +out=$7 + +mkdir -p ${genDir}/${in} && \ + ${location_aprotoc} --plugin=${location_protoc} \ + --dependency_out=${depfile} \ + --javastream_out=${genDir}/${in} \ + -Iexternal/protobuf/src \ + -I . \ + ${in} && \ + ${location_soong_zip} -jar -o ${out} -C ${genDir}/${in} -D ${genDir}/${in} From ee02a0fe1dce879ea6456a496022a2157abd841a Mon Sep 17 00:00:00 2001 From: qqzhou Date: Tue, 17 Dec 2013 14:10:08 +0800 Subject: [PATCH 0002/1164] Download: Add support to manually pause/resume download Add the pause and resume APIs here so that applications can pause and resume downloads manually through DownloadManager. This patch consists of 2 changes: 1. Add pause and resume download APIs 2. Add another paused reason for this download status Change-Id: I606b48ca20f43bcc6c119683818c2ab6ff03bfe5 Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/app/DownloadManager.java | 40 ++++++++++++++++++++++ core/java/android/provider/Downloads.java | 5 +++ 2 files changed, 45 insertions(+) diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index b444f17c0b69..5799ec85ed39 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -279,6 +279,13 @@ public class DownloadManager { */ public final static int PAUSED_UNKNOWN = 4; + /** + * Value of {@link #COLUMN_REASON} when the download is paused manually. + * + * @hide + */ + public final static int PAUSED_MANUAL = 5; + /** * Broadcast intent action sent by the download manager when a download completes. */ @@ -930,6 +937,7 @@ Cursor runQuery(ContentResolver resolver, String[] projection, Uri baseUri) { parts.add(statusClause("=", Downloads.Impl.STATUS_WAITING_TO_RETRY)); parts.add(statusClause("=", Downloads.Impl.STATUS_WAITING_FOR_NETWORK)); parts.add(statusClause("=", Downloads.Impl.STATUS_QUEUED_FOR_WIFI)); + parts.add(statusClause("=", Downloads.Impl.STATUS_PAUSED_MANUAL)); } if ((mStatusFlags & STATUS_SUCCESSFUL) != 0) { parts.add(statusClause("=", Downloads.Impl.STATUS_SUCCESS)); @@ -1180,6 +1188,34 @@ public void forceDownload(long... ids) { mResolver.update(mBaseUri, values, getWhereClauseForIds(ids), getWhereArgsForIds(ids)); } + /** + * Pause the given running download manually. + * + * @param id the ID of the download to be paused + * @return the number of downloads actually updated + * @hide + */ + public int pauseDownload(long id) { + ContentValues values = new ContentValues(); + values.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_PAUSED_MANUAL); + + return mResolver.update(ContentUris.withAppendedId(mBaseUri, id), values, null, null); + } + + /** + * Resume the given paused download manually. + * + * @param id the ID of the download to be resumed + * @return the number of downloads actually updated + * @hide + */ + public int resumeDownload(long id) { + ContentValues values = new ContentValues(); + values.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_RUNNING); + + return mResolver.update(ContentUris.withAppendedId(mBaseUri, id), values, null, null); + } + /** * Returns maximum size, in bytes, of downloads that may go over a mobile connection; or null if * there's no limit @@ -1564,6 +1600,9 @@ private long getPausedReason(int status) { case Downloads.Impl.STATUS_QUEUED_FOR_WIFI: return PAUSED_QUEUED_FOR_WIFI; + case Downloads.Impl.STATUS_PAUSED_MANUAL: + return PAUSED_MANUAL; + default: return PAUSED_UNKNOWN; } @@ -1619,6 +1658,7 @@ private int translateStatus(int status) { case Downloads.Impl.STATUS_WAITING_TO_RETRY: case Downloads.Impl.STATUS_WAITING_FOR_NETWORK: case Downloads.Impl.STATUS_QUEUED_FOR_WIFI: + case Downloads.Impl.STATUS_PAUSED_MANUAL: return STATUS_PAUSED; case Downloads.Impl.STATUS_SUCCESS: diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java index a2c5a92e52a2..062983a0cbfc 100644 --- a/core/java/android/provider/Downloads.java +++ b/core/java/android/provider/Downloads.java @@ -600,6 +600,11 @@ public static boolean isStatusCompleted(int status) { */ public static final int STATUS_QUEUED_FOR_WIFI = 196; + /** + * This download is paused manually. + */ + public static final int STATUS_PAUSED_MANUAL = 197; + /** * This download couldn't be completed due to insufficient storage * space. Typically, this is because the SD card is full. From 6a6239f07fb1c93b75b0479a9b51592c5883139f Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Tue, 24 Nov 2015 15:28:43 -0800 Subject: [PATCH 0003/1164] storage: Do not notify for volumes on non-removable disks Change-Id: Ia353ab43fbeba42d7d9c21d926f638f550a3dbbe Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/os/storage/DiskInfo.java | 6 ++++++ .../src/com/android/systemui/usb/StorageNotification.java | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/core/java/android/os/storage/DiskInfo.java b/core/java/android/os/storage/DiskInfo.java index d493ccebf531..e41ecf8f901a 100644 --- a/core/java/android/os/storage/DiskInfo.java +++ b/core/java/android/os/storage/DiskInfo.java @@ -48,6 +48,8 @@ public class DiskInfo implements Parcelable { public static final int FLAG_DEFAULT_PRIMARY = 1 << 1; public static final int FLAG_SD = 1 << 2; public static final int FLAG_USB = 1 << 3; + public static final int FLAG_EMMC = 1 << 4; + public static final int FLAG_NON_REMOVABLE = 1 << 5; public final String id; public final int flags; @@ -140,6 +142,10 @@ public boolean isUsb() { return (flags & FLAG_USB) != 0; } + public boolean isNonRemovable() { + return (flags & FLAG_NON_REMOVABLE) != 0; + } + @Override public String toString() { final CharArrayWriter writer = new CharArrayWriter(); diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java index 2f8dfdc2991a..7e4aa6518cb1 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java +++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java @@ -287,6 +287,11 @@ private void onPrivateVolumeStateChangedInternal(VolumeInfo vol) { } private void onPublicVolumeStateChangedInternal(VolumeInfo vol) { + // Do not notify for volumes on non-removable disks + if (vol.disk.isNonRemovable()) { + return; + } + Log.d(TAG, "Notifying about public volume: " + vol.toString()); final Notification notif; From 74c9bcf5b0e4275415a919e54f6679918b65373f Mon Sep 17 00:00:00 2001 From: Ethan Chen Date: Fri, 6 Oct 2017 00:05:08 -0700 Subject: [PATCH 0004/1164] Check for null callerPackage in getStorageEncryptionStatus * This function assumes that callerPackage is always valid, even though the parameter is annotated nullable. Check and assume the function was called by the system if the callerPackage was null. Change-Id: Ie936d401f666ac8022635fb49d9ab2adfb5916c4 Signed-off-by: Josh Fox (XlxFoXxlX) --- .../DevicePolicyManagerService.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index b74a582db2de..deaa5b4589ed 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -6524,20 +6524,24 @@ public int getStorageEncryptionStatus(@Nullable String callerPackage, int userHa } enforceFullCrossUsersPermission(userHandle); - // It's not critical here, but let's make sure the package name is correct, in case - // we start using it for different purposes. - ensureCallerPackage(callerPackage); - - final ApplicationInfo ai; - try { - ai = mIPackageManager.getApplicationInfo(callerPackage, 0, userHandle); - } catch (RemoteException e) { - throw new SecurityException(e); - } - boolean legacyApp = false; - if (ai.targetSdkVersion <= Build.VERSION_CODES.M) { - legacyApp = true; + // callerPackage can only be null if we were called from within the system, + // which means that we are not a legacy app. + if (callerPackage != null) { + // It's not critical here, but let's make sure the package name is correct, in case + // we start using it for different purposes. + ensureCallerPackage(callerPackage); + + final ApplicationInfo ai; + try { + ai = mIPackageManager.getApplicationInfo(callerPackage, 0, userHandle); + } catch (RemoteException e) { + throw new SecurityException(e); + } + + if (ai.targetSdkVersion <= Build.VERSION_CODES.M) { + legacyApp = true; + } } final int rawStatus = getEncryptionStatus(); From 498f21ebc6811e9c23f6a2e2743ba5f90c397fd2 Mon Sep 17 00:00:00 2001 From: Rashed Abdel-Tawab Date: Wed, 15 Aug 2018 07:09:27 -0700 Subject: [PATCH 0005/1164] SystemUI: Adjust "Manage notifications" all caps state Widget.Material.Button.Borderless already reads its all-caps state from config_buttonTextAllCaps, don't override it in this button for consistency Change-Id: I8f0b1a2a8f349b21a6f28e1b06cca9153d3c7a38 Signed-off-by: Josh Fox (XlxFoXxlX) --- .../SystemUI/res/layout/status_bar_notification_footer.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/SystemUI/res/layout/status_bar_notification_footer.xml b/packages/SystemUI/res/layout/status_bar_notification_footer.xml index 6c5cebc39d25..856d76f5e451 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_footer.xml +++ b/packages/SystemUI/res/layout/status_bar_notification_footer.xml @@ -34,8 +34,7 @@ android:layout_gravity="start" android:focusable="true" android:text="@string/manage_notifications_text" - android:textColor="?attr/wallpaperTextColor" - android:textAllCaps="false"/> + android:textColor="?attr/wallpaperTextColor"/> Date: Mon, 5 Aug 2013 10:32:19 +0200 Subject: [PATCH 0006/1164] Allow adjusting progress on touch events. Change-Id: Ide0a7ae057a62f3631a32eeaa63f3e04dec5bf54 Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/widget/AbsSeekBar.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index 61a58733479f..26ffb81b5d16 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -866,7 +866,15 @@ private void trackTouchEvent(MotionEvent event) { progress += scale * range + getMin(); setHotspot(x, y); - setProgressInternal(Math.round(progress), true, false); + setProgressInternal(updateTouchProgress(getProgress(), + Math.round(progress)), true, false); + } + + /** + * @hide + */ + protected int updateTouchProgress(int lastProgress, int newProgress) { + return newProgress; } /** From b6c68cc6ef663815eb7115ef660ad1b2dbc3b91b Mon Sep 17 00:00:00 2001 From: dhacker29 Date: Tue, 24 Nov 2015 01:53:47 -0500 Subject: [PATCH 0007/1164] Core: Use ro.build.date to signal mIsUpgrade M: We use a static fingerprint that is only changed when a new OEM build is released, so every flash shows Android is starting instead of upgrading. This will fix that. N: even though we dont have the dexopt sceen on N, this is still needed to delete the correct caches, and grant/deny specific runtime permissions like a true oem update would do Updated for Nougat By: BeansTown106 Change-Id: I0e3ed5c8f0351e48944432ae6a0c5194ddeff1fa Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/os/Build.java | 6 ++++++ .../com/android/server/pm/PackageManagerService.java | 8 ++++---- services/core/java/com/android/server/pm/Settings.java | 10 +++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 2de07b5bb408..dfdeb346befd 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -56,6 +56,12 @@ public class Build { /** The name of the underlying board, like "goldfish". */ public static final String BOARD = getString("ro.product.board"); + /** + * The build date + * @hide + */ + public static final String DATE = getString("ro.build.date"); + /** * The name of the instruction set (CPU type + ABI convention) of native code. * diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9ed2b9c18546..b4146a4c0184 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2565,10 +2565,10 @@ public void onDefaultRuntimePermissionsGranted(int userId) { File frameworkDir = new File(Environment.getRootDirectory(), "framework"); final VersionInfo ver = mSettings.getInternalVersion(); - mIsUpgrade = !Build.FINGERPRINT.equals(ver.fingerprint); + mIsUpgrade = !Build.DATE.equals(ver.fingerprint); if (mIsUpgrade) { logCriticalInfo(Log.INFO, - "Upgrading from " + ver.fingerprint + " to " + Build.FINGERPRINT); + "Upgrading from " + ver.fingerprint + " to " + Build.DATE); } // when upgrading from pre-M, promote system app permissions from install to runtime @@ -3165,7 +3165,7 @@ public void onDefaultRuntimePermissionsGranted(int userId) { | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); } } - ver.fingerprint = Build.FINGERPRINT; + ver.fingerprint = Build.DATE; } checkDefaultBrowser(); @@ -22152,7 +22152,7 @@ private void loadPrivatePackagesInner(VolumeInfo vol) { Slog.w(TAG, "Failed to scan " + ps.codePath + ": " + e.getMessage()); } - if (!Build.FINGERPRINT.equals(ver.fingerprint)) { + if (!Build.DATE.equals(ver.fingerprint)) { clearAppDataLIF(ps.pkg, UserHandle.USER_ALL, StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 5177995a8353..a1031f1ce8ab 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -350,7 +350,7 @@ public static class VersionInfo { public void forceCurrent() { sdkVersion = Build.VERSION.SDK_INT; databaseVersion = CURRENT_DATABASE_VERSION; - fingerprint = Build.FINGERPRINT; + fingerprint = Build.DATE; } } @@ -3160,7 +3160,7 @@ boolean readLPw(@NonNull List users) { // on update drop the files before loading them. if (PackageManagerService.CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE) { final VersionInfo internal = getInternalVersion(); - if (!Build.FINGERPRINT.equals(internal.fingerprint)) { + if (!Build.DATE.equals(internal.fingerprint)) { for (UserInfo user : users) { mRuntimePermissionsPersistence.deleteUserRuntimePermissionsFile(user.id); } @@ -5147,7 +5147,7 @@ public boolean areDefaultRuntimPermissionsGrantedLPr(int userId) { } public void onDefaultRuntimePermissionsGrantedLPr(int userId) { - mFingerprints.put(userId, Build.FINGERPRINT); + mFingerprints.put(userId, Build.DATE); writePermissionsForUserAsyncLPr(userId); } @@ -5311,7 +5311,7 @@ private void writePermissionsSync(int userId) { serializer.endDocument(); destination.finishWrite(out); - if (Build.FINGERPRINT.equals(fingerprint)) { + if (Build.DATE.equals(fingerprint)) { mDefaultPermissionsGranted.put(userId, true); } // Any error while writing is fatal. @@ -5423,7 +5423,7 @@ private void parseRuntimePermissionsLPr(XmlPullParser parser, int userId) case TAG_RUNTIME_PERMISSIONS: { String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT); mFingerprints.put(userId, fingerprint); - final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint); + final boolean defaultsGranted = Build.DATE.equals(fingerprint); mDefaultPermissionsGranted.put(userId, defaultsGranted); } break; From 71c26d36b523af7890ebd7de9d813737bee20e1b Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Fri, 10 Nov 2017 15:00:17 +0000 Subject: [PATCH 0008/1164] Disable notification channel warnings by default * Since we usually ship "userdebug" builds, it is better to globally disable the toast because we are not in control of third-party apps that haven't been properly aligned with new Oreo requirements. * Leave it enabled by default only for "eng" builds. Change-Id: If0c74bcd03de2b664794e5855c2aaceb5c633b6c Signed-off-by: Josh Fox (XlxFoXxlX) --- .../android/server/notification/NotificationManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 5ba1e0f3e047..ef1b96882a59 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -4111,7 +4111,7 @@ void enqueueNotificationInternal(final String pkg, final String opPkg, final int } private void doChannelWarningToast(CharSequence toastText) { - final int defaultWarningEnabled = Build.IS_DEBUGGABLE ? 1 : 0; + final int defaultWarningEnabled = Build.TYPE.equals("eng") ? 1 : 0; final boolean warningEnabled = Settings.Global.getInt(getContext().getContentResolver(), Settings.Global.SHOW_NOTIFICATION_CHANNEL_WARNINGS, defaultWarningEnabled) != 0; if (warningEnabled) { From 4499cc29c397beefe72c90abdcdb00754d42083c Mon Sep 17 00:00:00 2001 From: ezio84 Date: Tue, 19 Dec 2017 14:37:35 +0100 Subject: [PATCH 0009/1164] Screenshot: append app name to filename Author: ezio84 Date: Tue Dec 19 14:37:35 2017 +0100 Screenshot: append app name to filename Kang Samsung's idea. Change-Id: Ibc6a52b5e2597e6014a2da6a4211febe17ec02c7 Author: Wang Han Date: Fri May 11 12:47:40 2018 +0200 SystemUI: Don't append app name to file on lockscreen When device is locked, current implementation will append the current app name to file when taking screenshot. This causes information leaks. To prevent this, we check for isKeyGuardLocked() and fall back not to append the app name when taking screenshot on lockscreen. Change-Id: I04498faf51986e1a3723a32befd97d29e1f3fe58 Change-Id: Ic2a42536bf763a0c6f7fb9ac4bbbe84f73723f91 Signed-off-by: Josh Fox (XlxFoXxlX) --- .../systemui/screenshot/GlobalScreenshot.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 8a0d7e38f875..a06251489a7d 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -28,6 +28,7 @@ import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.ActivityManager; import android.app.ActivityOptions; +import android.app.KeyguardManager; import android.app.Notification; import android.app.Notification.BigPictureStyle; import android.app.NotificationManager; @@ -39,6 +40,8 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -84,6 +87,7 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; /** * POD used in the AsyncTask which saves an image in the background. @@ -116,6 +120,7 @@ class SaveImageInBackgroundTask extends AsyncTask { private static final String SCREENSHOTS_DIR_NAME = "Screenshots"; private static final String SCREENSHOT_FILE_NAME_TEMPLATE = "Screenshot_%s.png"; + private static final String SCREENSHOT_FILE_NAME_TEMPLATE_APPNAME = "Screenshot_%s_%s.png"; private static final String SCREENSHOT_SHARE_SUBJECT_TEMPLATE = "Screenshot (%s)"; private final SaveImageInBackgroundData mParams; @@ -129,6 +134,23 @@ class SaveImageInBackgroundTask extends AsyncTask { private final int mImageWidth; private final int mImageHeight; + private static CharSequence getRunningActivityName(Context context) { + final ActivityManager am = + (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + final PackageManager pm = context.getPackageManager(); + + List tasks = am.getRunningTasks(1); + if (tasks != null && !tasks.isEmpty()) { + ActivityManager.RunningTaskInfo top = tasks.get(0); + try { + ActivityInfo info = pm.getActivityInfo(top.topActivity, 0); + return pm.getApplicationLabel(info.applicationInfo); + } catch (PackageManager.NameNotFoundException e) { + } + } + return null; + } + SaveImageInBackgroundTask(Context context, SaveImageInBackgroundData data, NotificationManager nManager) { Resources r = context.getResources(); @@ -137,7 +159,16 @@ class SaveImageInBackgroundTask extends AsyncTask { mParams = data; mImageTime = System.currentTimeMillis(); String imageDate = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date(mImageTime)); - mImageFileName = String.format(SCREENSHOT_FILE_NAME_TEMPLATE, imageDate); + CharSequence appName = getRunningActivityName(context); + boolean onKeyguard = context.getSystemService(KeyguardManager.class).isKeyguardLocked(); + if (!onKeyguard && appName != null) { + // Replace all spaces and special chars with an underscore + String appNameString = appName.toString().replaceAll("[\\\\/:*?\"<>|\\s]+", "_"); + mImageFileName = String.format(SCREENSHOT_FILE_NAME_TEMPLATE_APPNAME, + appNameString, imageDate); + } else { + mImageFileName = String.format(SCREENSHOT_FILE_NAME_TEMPLATE, imageDate); + } mScreenshotDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), SCREENSHOTS_DIR_NAME); From 958461058c6e95184b8038bee54f81c116e4fcab Mon Sep 17 00:00:00 2001 From: flintman Date: Sat, 21 Nov 2015 20:51:06 -0500 Subject: [PATCH 0010/1164] sensors: Create bool to select what timestamp to use Older devices may have an issue with rotation freezes up and requires a reboot to fix. In deep sleep the sensor's timestamp is far off, depending how long it's in sleep, causing rotation not to work. onSensorChanged if true it will use SystemClock.elapsedRealtimeNanos() instead of event.timestamp. Possibly an update to the custom sensor libs. Change-Id: Ie456e12cb65fbb921cb780112df301655b93b14f Signed-off-by: Josh Fox (XlxFoXxlX) --- core/res/res/values/aosip_config.xml | 20 +++++++++++++++++++ core/res/res/values/aosip_symbols.xml | 19 ++++++++++++++++++ .../policy/WindowOrientationListener.java | 7 ++++++- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 core/res/res/values/aosip_config.xml create mode 100644 core/res/res/values/aosip_symbols.xml diff --git a/core/res/res/values/aosip_config.xml b/core/res/res/values/aosip_config.xml new file mode 100644 index 000000000000..d36b07fd3ecb --- /dev/null +++ b/core/res/res/values/aosip_config.xml @@ -0,0 +1,20 @@ + + + + false + diff --git a/core/res/res/values/aosip_symbols.xml b/core/res/res/values/aosip_symbols.xml new file mode 100644 index 000000000000..8b124a4225e0 --- /dev/null +++ b/core/res/res/values/aosip_symbols.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java index 1508c9ecb394..9b4251def937 100644 --- a/services/core/java/com/android/server/policy/WindowOrientationListener.java +++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java @@ -59,6 +59,7 @@ public abstract class WindowOrientationListener { private boolean mEnabled; private int mRate; private String mSensorType; + private boolean mUseSystemClockforRotationSensor; private Sensor mSensor; private OrientationJudge mOrientationJudge; private int mCurrentRotation = -1; @@ -114,6 +115,9 @@ private WindowOrientationListener(Context context, Handler handler, int rate) { mSensor = nonWakeUpDeviceOrientationSensor; } + mUseSystemClockforRotationSensor = context.getResources().getBoolean( + com.android.internal.R.bool.config_useSystemClockforRotationSensor); + if (mSensor != null) { mOrientationJudge = new OrientationSensorJudge(); } @@ -641,7 +645,8 @@ public void onSensorChanged(SensorEvent event) { // Reset the orientation listener state if the samples are too far apart in time // or when we see values of (0, 0, 0) which indicates that we polled the // accelerometer too soon after turning it on and we don't have any data yet. - final long now = event.timestamp; + final long now = mUseSystemClockforRotationSensor + ? SystemClock.elapsedRealtimeNanos() : event.timestamp; final long then = mLastFilteredTimestampNanos; final float timeDeltaMS = (now - then) * 0.000001f; final boolean skipSample; From 8e3ae5eee7094e657ef1632d708155b4a838edb0 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 14 Jul 2015 16:55:04 +0300 Subject: [PATCH 0011/1164] Fix mounting of non-FAT formatted SD cards (1/2) Change-Id: I77fe9e09b523bcba68dd2409def68acb715ca33c Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/os/storage/StorageVolume.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java index fd5a22a9c551..f68d842161d1 100644 --- a/core/java/android/os/storage/StorageVolume.java +++ b/core/java/android/os/storage/StorageVolume.java @@ -249,16 +249,21 @@ public UserHandle getOwner() { } /** - * Parse and return volume UUID as FAT volume ID, or return -1 if unable to + * Parse and return volume UUID as volume ID, or return -1 if unable to * parse or UUID is unknown. * @hide */ - public int getFatVolumeId() { - if (mFsUuid == null || mFsUuid.length() != 9) { + public int getVolumeId() { + String id = mFsUuid; + if (id == null) { return -1; } + id = id.replace("-", ""); + if (id.length() > 8) { + id = id.substring(0, 8); + } try { - return (int) Long.parseLong(mFsUuid.replace("-", ""), 16); + return (int) Long.parseLong(id, 16); } catch (NumberFormatException e) { return -1; } From 90157bba806846851fb9b5849bbc8c41be9fc22c Mon Sep 17 00:00:00 2001 From: Jerry Zhang Date: Wed, 6 Jun 2018 11:04:46 -0700 Subject: [PATCH 0012/1164] Check for null path in getInternalPathForUser In some situations, path could be null resulting in a crash. Test: no crash Bug: 109730998 Change-Id: I2ce0410162d1327905d690331f461f9187e20906 Merged-In: I2ce0410162d1327905d690331f461f9187e20906 (cherry picked from commit 6f6154bf0493cf66628c8f2418827fe54679b1eb) (cherry picked from commit 30f63cf1f958cf5e8ee77875ac38c579a4a783d1) --- core/java/android/os/storage/VolumeInfo.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index 8d4c3c3d3e68..8c7750242ef3 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -312,7 +312,9 @@ public File getPathForUser(int userId) { * {@link android.Manifest.permission#WRITE_MEDIA_STORAGE}. */ public File getInternalPathForUser(int userId) { - if (type == TYPE_PUBLIC) { + if (path == null) { + return null; + } else if (type == TYPE_PUBLIC) { // TODO: plumb through cleaner path from vold return new File(path.replace("/storage/", "/mnt/media_rw/")); } else { From f11002a5e15d8b49cbd17fac491a392f7f97bd9e Mon Sep 17 00:00:00 2001 From: Kenneth Magic Date: Wed, 11 Jul 2018 13:18:03 -0700 Subject: [PATCH 0013/1164] Update PageTypeInfoParser to be less restrictive. The page block order is an independent variable from the free page order table in the kernel, so the parser should not error out if they do not match. Bug: 110559361 Test: incident_helper_test Change-Id: I08ad9c8f9b29cc15b80a89929f3a1fb6886852e6 Merged-In: I08ad9c8f9b29cc15b80a89929f3a1fb6886852e6 (cherry picked from commit 3abb43991685d0ba40e70dd5f81abe044f65b891) (cherry picked from commit 93ca85a1724806c30b0fbc04837a7e869ba1c165) --- cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp | 9 ++------- cmds/incident_helper/testdata/pagetypeinfo.txt | 4 ++-- cmds/incident_helper/tests/PageTypeInfoParser_test.cpp | 4 ++-- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp b/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp index 0615c74b8d64..2a89c920c119 100644 --- a/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp +++ b/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp @@ -75,18 +75,13 @@ PageTypeInfoParser::Parse(const int in, const int out) const } else return BAD_VALUE; // expect part 2 starts with "type" if (stripPrefix(&record[2], "type")) { - // expect the rest of part 2 has number of (pageBlockOrder + 2) parts // An example looks like: // header line: type 0 1 2 3 4 5 6 7 8 9 10 // record line: Unmovable 426 279 226 1 1 1 0 0 2 2 0 - // The pageBlockOrder = 10 and it's zero-indexed. so total parts - // are 10 + 1(zero-indexed) + 1(the type part) = 12. record_t pageCounts = parseRecord(record[2]); - int pageCountsSize = pageBlockOrder + 2; - if ((int)pageCounts.size() != pageCountsSize) return BAD_VALUE; proto.write(PageTypeInfoProto::MigrateType::TYPE, pageCounts[0]); - for (auto i=1; iname.string(), proto.size()); return NO_ERROR; -} \ No newline at end of file +} diff --git a/cmds/incident_helper/testdata/pagetypeinfo.txt b/cmds/incident_helper/testdata/pagetypeinfo.txt index d45ddc408c0f..c65b5a1fa1e1 100644 --- a/cmds/incident_helper/testdata/pagetypeinfo.txt +++ b/cmds/incident_helper/testdata/pagetypeinfo.txt @@ -1,5 +1,5 @@ -Page block order: 10 -Pages per block: 1024 +Page block order: 9 +Pages per block: 512 Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10 Node 0, zone DMA, type Unmovable 426 279 226 1 1 1 0 0 2 2 0 diff --git a/cmds/incident_helper/tests/PageTypeInfoParser_test.cpp b/cmds/incident_helper/tests/PageTypeInfoParser_test.cpp index 9bad7be4a07e..5688681e45fd 100644 --- a/cmds/incident_helper/tests/PageTypeInfoParser_test.cpp +++ b/cmds/incident_helper/tests/PageTypeInfoParser_test.cpp @@ -54,8 +54,8 @@ TEST_F(PageTypeInfoParserTest, Success) { PageTypeInfoParser parser; PageTypeInfoProto expected; - expected.set_page_block_order(10); - expected.set_pages_per_block(1024); + expected.set_page_block_order(9); + expected.set_pages_per_block(512); PageTypeInfoProto::MigrateType* mt1 = expected.add_migrate_types(); mt1->set_node(0); From 12f742dbb8c5e7e29c04b4b2615d0ad8c1a4e156 Mon Sep 17 00:00:00 2001 From: Ethan Chen Date: Wed, 6 Dec 2017 09:58:03 -0800 Subject: [PATCH 0014/1164] PackageManager: Add configuration to specify vendor platform signatures Devices with split system/vendor images may want to use the OEM's vendor image. In that case, the OEM's platform signature is not actually the same as the platform signature used to sign the Lineage system image. Allow devices to specify an OEM platform signature which will also be recognized as the system's platform signature. Change-Id: Ida9bb25a32234af9d9507a214eae6a4672320d2b Signed-off-by: Josh Fox (XlxFoXxlX) --- core/res/res/values/aosip_arrays.xml | 21 ++++++++++ core/res/res/values/aosip_symbols.xml | 2 + .../server/pm/PackageManagerService.java | 38 +++++++++++++++++-- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 core/res/res/values/aosip_arrays.xml diff --git a/core/res/res/values/aosip_arrays.xml b/core/res/res/values/aosip_arrays.xml new file mode 100644 index 000000000000..793fb20bb365 --- /dev/null +++ b/core/res/res/values/aosip_arrays.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/core/res/res/values/aosip_symbols.xml b/core/res/res/values/aosip_symbols.xml index 8b124a4225e0..b984fe5a1806 100644 --- a/core/res/res/values/aosip_symbols.xml +++ b/core/res/res/values/aosip_symbols.xml @@ -16,4 +16,6 @@ + + diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b4146a4c0184..76fd7b086517 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1412,6 +1412,8 @@ static class PostInstallData { private final PackageUsage mPackageUsage = new PackageUsage(); private final CompilerStats mCompilerStats = new CompilerStats(); + private final Signature[] mVendorPlatformSignatures; + class PackageHandler extends Handler { private boolean mBound = false; final ArrayList mPendingInstalls = @@ -2399,6 +2401,14 @@ private static void requestCopyPreoptedFiles() { } } + private static Signature[] createSignatures(String[] hexBytes) { + Signature[] sigs = new Signature[hexBytes.length]; + for (int i = 0; i < sigs.length; i++) { + sigs[i] = new Signature(hexBytes[i]); + } + return sigs; + } + public PackageManagerService(Context context, Installer installer, boolean factoryTest, boolean onlyCore) { LockGuard.installLock(mPackages, LockGuard.INDEX_PACKAGES); @@ -2412,6 +2422,9 @@ public PackageManagerService(Context context, Installer installer, mContext = context; + mVendorPlatformSignatures = createSignatures(context.getResources().getStringArray( + R.array.config_vendorPlatformSignatures)); + mFactoryTest = factoryTest; mOnlyCore = onlyCore; mMetrics = new DisplayMetrics(); @@ -8512,6 +8525,19 @@ private void collectCertificatesLI(PackageSetting ps, PackageParser.Package pkg, try { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "collectCertificates"); PackageParser.collectCertificates(pkg, skipVerify); + if (compareSignatures(pkg.mSigningDetails.signatures, + mVendorPlatformSignatures) == PackageManager.SIGNATURE_MATCH) { + // Overwrite package signature with our platform signature + // if the signature is the vendor's platform signature + if (mPlatformPackage != null) { + pkg.mSigningDetails = mPlatformPackage.mSigningDetails; + pkg.applicationInfo.seInfo = SELinuxMMAC.getSeInfo( + pkg, + pkg.isPrivileged(), + pkg.applicationInfo.targetSandboxVersion, + pkg.applicationInfo.targetSdkVersion); + } + } } catch (PackageParserException e) { throw PackageManagerException.from(e); } finally { @@ -8767,7 +8793,7 @@ private PackageParser.Package addForInitLI(PackageParser.Package pkg, disabledPkgSetting /* pkgSetting */, null /* disabledPkgSetting */, null /* originalPkgSetting */, null, parseFlags, scanFlags, (pkg == mPlatformPackage), user); - applyPolicy(pkg, parseFlags, scanFlags, mPlatformPackage); + applyPolicy(pkg, parseFlags, scanFlags, mPlatformPackage, mVendorPlatformSignatures); scanPackageOnlyLI(request, mFactoryTest, -1L); } } @@ -10120,7 +10146,7 @@ private PackageParser.Package scanPackageNewLI(@NonNull PackageParser.Package pk scanFlags = adjustScanFlags(scanFlags, pkgSetting, disabledPkgSetting, user, pkg); synchronized (mPackages) { - applyPolicy(pkg, parseFlags, scanFlags, mPlatformPackage); + applyPolicy(pkg, parseFlags, scanFlags, mPlatformPackage, mVendorPlatformSignatures); assertPackageIsValid(pkg, parseFlags, scanFlags); SharedUserSetting sharedUserSetting = null; @@ -10806,7 +10832,8 @@ private static void assertCodePolicy(PackageParser.Package pkg) * ideally be static, but, it requires locks to read system state. */ private static void applyPolicy(PackageParser.Package pkg, final @ParseFlags int parseFlags, - final @ScanFlags int scanFlags, PackageParser.Package platformPkg) { + final @ScanFlags int scanFlags, PackageParser.Package platformPkg, + Signature[] vendorPlatformSignatures) { if ((scanFlags & SCAN_AS_SYSTEM) != 0) { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; if (pkg.applicationInfo.isDirectBootAware()) { @@ -10894,8 +10921,11 @@ private static void applyPolicy(PackageParser.Package pkg, final @ParseFlags int // Check if the package is signed with the same key as the platform package. if (PLATFORM_PACKAGE_NAME.equals(pkg.packageName) || - (platformPkg != null && compareSignatures( + (platformPkg != null && (compareSignatures( platformPkg.mSigningDetails.signatures, + pkg.mSigningDetails.signatures) == PackageManager.SIGNATURE_MATCH) || + compareSignatures( + vendorPlatformSignatures, pkg.mSigningDetails.signatures) == PackageManager.SIGNATURE_MATCH)) { pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY; From f06c605f8c2d858eea9ed46d45489a3f537514a4 Mon Sep 17 00:00:00 2001 From: ezio84 Date: Thu, 5 Oct 2017 22:38:18 +0200 Subject: [PATCH 0015/1164] Fully enable system round icons enabling the bool was not enough :P thanks https://forum.xda-developers.com/showpost.php?p=72937762&postcount=41 Change-Id: I7917328ad5374b0a910713b260f99eddc80706e1 Signed-off-by: Harsh Shandilya --- core/res/res/values/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 0b5dd7e70e8b..a36e4ae79b93 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3229,7 +3229,7 @@ com.android.cellbroadcastreceiver - "M50,0L92,0C96.42,0 100,4.58 100 8L100,92C100, 96.42 96.42 100 92 100L8 100C4.58, 100 0 96.42 0 92L0 8 C 0 4.42 4.42 0 8 0L50 0Z" + "M50 0C77.6 0 100 22.4 100 50C100 77.6 77.6 100 50 100C22.4 100 0 77.6 0 50C0 22.4 22.4 0 50 0Z" - wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,work,cast,night + wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,nfc,location,hotspot,inversion,saver,work,cast,night From 8c86d4df86b7fa8ca1fa33fbb7db7881c25aef87 Mon Sep 17 00:00:00 2001 From: yangbingqian Date: Wed, 22 Mar 2017 18:41:15 +0800 Subject: [PATCH 0020/1164] FATAL EXCEPTION IN SYSTEM PROCESS: android.ui when 3rd party app put an extra with a bad serial object to start a service or sendbroadcast to system_server. It will cause system_server crash because of classNotFoundException. A test demo apk will cause system_server crash. It really affact the system stability Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); intent.putExtra(Intent.EXTRA_REFERRER, new serial() /*a Serializable class object*/); sendBroadcast(intent); Test: use the test apk attached in the issue below, system_server will crash every time. And it'll be OK with this CL. https://code.google.com/p/android/issues/detail?id=261031 Change-Id: Id505571dcbf88c0ba9c1677ec0f1f08688c1bb95 Signed-off-by: yangbingqian Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/os/BaseBundle.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java index 0fef78d1f4ba..3385d40fc742 100644 --- a/core/java/android/os/BaseBundle.java +++ b/core/java/android/os/BaseBundle.java @@ -294,7 +294,14 @@ private void initializeFromParcelLocked(@NonNull Parcel parcelledData, boolean r } else { throw e; } - } finally { + } catch (RuntimeException e) { + if (sShouldDefuse && (e.getCause() instanceof ClassNotFoundException)) { + Log.w(TAG, "Failed to parse Bundle, but defusing quietly", e); + map.erase(); + } else { + throw e; + } + }finally { mMap = map; if (recycleParcel) { recycleParcel(parcelledData); From 9963bdb2a8e92340ecf20b05ba1840e56d6d9125 Mon Sep 17 00:00:00 2001 From: c_jyuan Date: Mon, 11 Jul 2016 14:37:24 +0800 Subject: [PATCH 0021/1164] Add missing STORAGE_INTERNAL permission for BackupRestoreConfirmation BackupRestoreConfirmation acitivity does not show 'allow' button, because 'getPasswordType' func check "Manifest.permission.STORAGE_INTERNAL", so add missing STORAGE_INTERNAL permission. Change-Id: If6264085a5b79c37011ac0d137a3f02197b20013 Signed-off-by: Josh Fox (XlxFoXxlX) --- packages/BackupRestoreConfirmation/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/BackupRestoreConfirmation/AndroidManifest.xml b/packages/BackupRestoreConfirmation/AndroidManifest.xml index e67b3be43ea1..aede4590b627 100644 --- a/packages/BackupRestoreConfirmation/AndroidManifest.xml +++ b/packages/BackupRestoreConfirmation/AndroidManifest.xml @@ -21,6 +21,7 @@ + Date: Mon, 14 Dec 2015 11:13:24 +0800 Subject: [PATCH 0022/1164] Add "android.permission.READ_PHONE_STATE" to manifest Change-Id: I78d90166635bbdf6b74e2a02efc1029387b4ad8d Signed-off-by: Simao Gomes Viana Signed-off-by: Josh Fox (XlxFoXxlX) --- packages/SystemUI/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 5599b5a2837a..c1e545891b5e 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -58,6 +58,7 @@ + From 934379891f26a3f0b98883b54ffb888e93025cf9 Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Thu, 7 Jun 2018 16:00:22 -0700 Subject: [PATCH 0023/1164] Use Uppercase instead of Lowercase for PLMN Decode A change to IccUtils converted from using lowercase to uppercase and broke the PLMN trimming logic. This resolves bugs where the platform may report 5-digit PLMNs with an invalid trailing 'F' character. This fixes an issue introduced by aosp/575243, which impacts the Manual Network Selection menu and the public API. Bug: 79561854 Test: compilation Merged-In: I5ea7867cd9c11fe4454188fd1f30bf58b2911712 Change-Id: I5ea7867cd9c11fe4454188fd1f30bf58b2911712 (cherry picked from commit b70fbc85f7496dd1b43ed70f0c480184ba5e9585) (cherry picked from commit 7a061af3178a93d5273ed3c210938343699e9e0d) --- .../com/android/internal/telephony/uicc/IccUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/telephony/java/com/android/internal/telephony/uicc/IccUtils.java b/telephony/java/com/android/internal/telephony/uicc/IccUtils.java index c0954385a0a3..4790b75d9630 100644 --- a/telephony/java/com/android/internal/telephony/uicc/IccUtils.java +++ b/telephony/java/com/android/internal/telephony/uicc/IccUtils.java @@ -105,7 +105,7 @@ public static void bcdToBytes(String bcd, byte[] bytes) { /** * PLMN (MCC/MNC) is encoded as per 24.008 10.5.1.3 * Returns a concatenated string of MCC+MNC, stripping - * all invalid character 'f' + * all invalid character 'F' */ public static String bcdPlmnToString(byte[] data, int offset) { if (offset + 3 > data.length) { @@ -117,9 +117,9 @@ public static String bcdPlmnToString(byte[] data, int offset) { trans[2] = (byte) ((data[2 + offset] & 0xF0) | ((data[1 + offset] >> 4) & 0xF)); String ret = bytesToHexString(trans); - // For a valid plmn we trim all character 'f' - if (ret.contains("f")) { - ret = ret.replaceAll("f", ""); + // For a valid plmn we trim all character 'F' + if (ret.contains("F")) { + ret = ret.replaceAll("F", ""); } return ret; } From 11ff067aa80b6f8c65e16cccaf98c217c918ffdf Mon Sep 17 00:00:00 2001 From: Iris Chang Date: Mon, 2 Jul 2018 09:53:53 +0800 Subject: [PATCH 0024/1164] Skip from copying preopted files if device is undecrypted After applies issue 78613232 patch (create symlink in init.rc), we found device boots to home screen fail. When device is FDE (Full Disk Encryption) and user sets the Password/Pattern/PIN to lock phone and then reboot the device, data partition will be mounted as tmpfs (256MB) until device is unlocked after user inputs Password/Pattern/PIN. During device boot-up process, PMS (Package Manager Service) will execute requestCopyPreoptedFiles when device first boots, and it may cause device fails to boot to home screen because PMS copies larger system_b (about 500MB) to smaller tmpfs (tmpfs is only 256MB) before device is decrypted. We suggest that PMS doesn't execute requestCopyPreoptedFiles when device is undecrypted during first boot. Bug: 78613232 Test: Device boot up to launcher normally. Test: APPs work normally after A/B upgrade. Change-Id: I893e0e217a59577299e97adfbf5dc7762dffda7c Merged-In: I893e0e217a59577299e97adfbf5dc7762dffda7c (cherry picked from commit cd5dd3c7b594e0beea971499dd96a4af1fad7037) --- .../core/java/com/android/server/pm/PackageManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9ed2b9c18546..77bd25395ffc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2533,7 +2533,7 @@ public void onDefaultRuntimePermissionsGranted(int userId) { } } - if (mFirstBoot) { + if (!mOnlyCore && mFirstBoot) { requestCopyPreoptedFiles(); } From d232133e5fb951cd8834a54d161908e395cfad97 Mon Sep 17 00:00:00 2001 From: Stan Iliev Date: Thu, 12 Jul 2018 16:53:59 -0400 Subject: [PATCH 0025/1164] Fix TextureView.getBitmap with scale layer transform Fix TextureView.getBitmap to capture content only from the layer. Bug: 111401911 Test: A new test TextureViewTest.testTransformScale is passing Change-Id: I2b9cee17fc48de7b12ed03d5b4f173ce5445dbfe Merged-In: I2b9cee17fc48de7b12ed03d5b4f173ce5445dbfe (cherry-picked from ff129aefe2b68c5dc6fe51a9b1d34f98750d4973) (cherry picked from commit 9675537555913a6aa7c25a71a6b854a083e22ede) (cherry picked from commit 421449a4a66d39ece6436b2413746c91139a6d57) --- libs/hwui/pipeline/skia/LayerDrawable.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libs/hwui/pipeline/skia/LayerDrawable.cpp b/libs/hwui/pipeline/skia/LayerDrawable.cpp index 4f16ddb9881b..6e7511da07ff 100644 --- a/libs/hwui/pipeline/skia/LayerDrawable.cpp +++ b/libs/hwui/pipeline/skia/LayerDrawable.cpp @@ -82,7 +82,14 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer textureMatrix = textureMatrixInv; } - SkMatrix matrix = SkMatrix::Concat(layerTransform, textureMatrix); + SkMatrix matrix; + if (dstRect) { + // Destination rectangle is set only when we are trying to read back the content + // of the layer. In this case we don't want to apply layer transform. + matrix = textureMatrix; + } else { + matrix = SkMatrix::Concat(layerTransform, textureMatrix); + } SkPaint paint; paint.setAlpha(layer->getAlpha()); From d4f5a0adabf21f2f10ebbdab22d8af01f547d3e9 Mon Sep 17 00:00:00 2001 From: Michael Wachenschwanz Date: Thu, 31 May 2018 15:16:00 -0700 Subject: [PATCH 0026/1164] Set AppStandbyController charging state on init Test: manual (restart device and "adb shell dumpsys usagestats | grep mCharging=") Test: CtsHostsideNetworkTests Fixes:80545083 Change-Id: I0592622b83525159eeca611b3cc1021347bc53ca Merged-In: I0592622b83525159eeca611b3cc1021347bc53ca (cherry-picked from 13b1e1774cfc6a568f57b9500f16dd2b26da3cd3) (cherry picked from commit 4d5b4b03c8065fc6421456a6135f6d247d2d1dd5) (cherry picked from commit 2795cca1cfa9f3004eb63525c135289d19e63f4e) --- .../usage/java/com/android/server/usage/UsageStatsService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 2547f16c5357..70214f373015 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -207,8 +207,8 @@ public void onStart() { @Override public void onBootPhase(int phase) { + mAppStandby.onBootPhase(phase); if (phase == PHASE_SYSTEM_SERVICES_READY) { - mAppStandby.onBootPhase(phase); // initialize mDpmInternal getDpmInternal(); From 82000f7e542186395ce3cfe527e19f81a36077db Mon Sep 17 00:00:00 2001 From: Stan Iliev Date: Fri, 22 Jun 2018 17:33:43 -0400 Subject: [PATCH 0027/1164] Don't apply filter in readback, when there is no scaling Fix check for scaling in SkiaOpenGLReadback: old code was not taking into account that matrix rotation swaps width/height. Test: Passed PixelCopyTest#testWindowProducerCopyToRGBA16F Bug: 110097060 Bug: 111776948 Change-Id: I0d26416fa72a026bc376417773d5a73548b1f1a5 Merged-In: I0d26416fa72a026bc376417773d5a73548b1f1a5 (cherry picked from commit d50edd004b60bec3f1d36066725129276b4a53ec) (cherry picked from commit ee7b63aa646c937e326ac5f39f07f724020533bb) (cherry picked from commit cccd03859ca4f7870d05ee679530c6d3c0c967e0) --- libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp index 107890e57a19..0760f1610891 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp @@ -26,6 +26,7 @@ #include "DeviceInfo.h" #include "Matrix.h" #include "Properties.h" +#include "utils/MathUtils.h" using namespace android::uirenderer::renderthread; @@ -116,9 +117,9 @@ CopyResult SkiaOpenGLReadback::copyImageInto(EGLImageKHR eglImage, const Matrix4 paint.setBlendMode(SkBlendMode::kSrc); // Apply a filter, which is matching OpenGL pipeline readback behaviour. Filter usage // is codified by tests using golden images like DecodeAccuracyTest. - if (skiaSrcRect.width() != bitmap->width() || - skiaSrcRect.height() != bitmap->height()) { - // TODO: apply filter always, but check if tests will be fine + bool disableFilter = MathUtils::areEqual(skiaSrcRect.width(), skiaDestRect.width()) + && MathUtils::areEqual(skiaSrcRect.height(), skiaDestRect.height()); + if (!disableFilter) { paint.setFilterQuality(kLow_SkFilterQuality); } scaledSurface->getCanvas()->concat(textureMatrix); From ca64a00aac05380a02b5f944fcbbdd916fcd6ccb Mon Sep 17 00:00:00 2001 From: xlxfoxxlx Date: Thu, 25 Aug 2016 18:36:20 -0400 Subject: [PATCH 0028/1164] Add AOSiP MetricsEvents Change-Id: I1ea608d3cfeb4a9efb1d123c34ca04e6f69c97b5 Signed-off-by: Josh Fox(XlxFoXxlX) --- proto/src/metrics_constants.proto | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 4328d94275e9..2d341f4ed80e 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -6119,5 +6119,11 @@ message MetricsEvent { // ---- End P Constants, all P constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS + + //OwlsNest + OWLSNEST = 420; + + //OwlsNest + OWL_TILE = 421; } } From 9dc08fb80e08216ec620bb31a21a3e34bc8a5e77 Mon Sep 17 00:00:00 2001 From: XlxFoXxlX Date: Sun, 10 Sep 2017 09:43:06 -0400 Subject: [PATCH 0029/1164] Add OwlsNest CategoryKey -needed to use our own Key for nest settings dashboard entry Change-Id: I262f65d75b46f3f8958fb929b335ae20e4d378ab Signed-off-by: Josh Fox(XlxFoXxlX) --- .../src/com/android/settingslib/drawer/CategoryKey.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java index dd8bfda43ff9..fb79155ced08 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java @@ -52,6 +52,8 @@ public final class CategoryKey { public static final String CATEGORY_NIGHT_DISPLAY = "com.android.settings.category.ia.night_display"; + public static final String CATEGORY_NEST = "com.android.settings.category.ia.nest"; + public static final Map KEY_COMPAT_MAP; static { From 43dc6ad3cb941602922b06aa20c0fb1385761852 Mon Sep 17 00:00:00 2001 From: Joe Maples Date: Mon, 6 Aug 2018 18:36:55 -0400 Subject: [PATCH 0030/1164] SystemUI: re-enable Tuner Change-Id: I326e3c7677ad3a8fac16bdb9d9799010b64606bb Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- .../src/com/android/systemui/tuner/TunerServiceImpl.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java index 1bdb7ad3c3fc..52174336e237 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java @@ -113,9 +113,7 @@ private void upgradeTuner(int oldVersion, int newVersion) { TextUtils.join(",", iconBlacklist), mCurrentUser); } } - if (oldVersion < 2) { - setTunerEnabled(mContext, false); - } + // 2 Removed because we want tuner. // 3 Removed because of a revert. if (oldVersion < 4) { // Delay this so that we can wait for everything to be registered first. From d74db0fdeb4164a64baf6696d72db2ab28bf8f47 Mon Sep 17 00:00:00 2001 From: Joe Maples Date: Mon, 6 Aug 2018 18:42:21 -0400 Subject: [PATCH 0031/1164] Tuner: Don't clear out prefs, it's not disabled Change-Id: Ibfa200e92d62c93cb1fc646c7db45f3f8e4ba16d Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- .../systemui/tuner/TunerServiceImpl.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java index 52174336e237..de61906f2c1c 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java @@ -16,14 +16,21 @@ package com.android.systemui.tuner; import android.app.ActivityManager; +import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.Looper; +import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.provider.Settings.Secure; @@ -31,12 +38,16 @@ import android.util.ArrayMap; import android.util.ArraySet; -import com.android.internal.util.ArrayUtils; import com.android.systemui.DemoMode; import com.android.systemui.Dependency; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.R; +import com.android.systemui.SysUiServiceProvider; +import com.android.systemui.SystemUI; +import com.android.systemui.SystemUIApplication; import com.android.systemui.settings.CurrentUserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController; +import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.util.leak.LeakDetector; import java.util.HashMap; @@ -48,14 +59,7 @@ public class TunerServiceImpl extends TunerService { private static final String TUNER_VERSION = "sysui_tuner_version"; - private static final int CURRENT_TUNER_VERSION = 4; - - // Things that use the tunable infrastructure but are now real user settings and - // shouldn't be reset with tuner settings. - private static final String[] RESET_BLACKLIST = new String[] { - QSTileHost.TILES_SETTING, - Settings.Secure.DOZE_ALWAYS_ON - }; + private static final int CURRENT_TUNER_VERSION = 5; private final Observer mObserver = new Observer(); // Map of Uris we listen on to their settings keys. @@ -115,10 +119,7 @@ private void upgradeTuner(int oldVersion, int newVersion) { } // 2 Removed because we want tuner. // 3 Removed because of a revert. - if (oldVersion < 4) { - // Delay this so that we can wait for everything to be registered first. - new Handler(Dependency.get(Dependency.BG_LOOPER)).postDelayed(() -> clearAll(), 5000); - } + // 4 Removed since we aren't filtering prefs. setValue(TUNER_VERSION, newVersion); } @@ -226,9 +227,6 @@ public void clearAll() { mContext.sendBroadcast(intent); for (String key : mTunableLookup.keySet()) { - if (ArrayUtils.contains(RESET_BLACKLIST, key)) { - continue; - } Settings.Secure.putString(mContentResolver, key, null); } } From fdd484b7da1999932c276437c3de5f90abb03bb9 Mon Sep 17 00:00:00 2001 From: Joe Maples Date: Mon, 6 Aug 2018 18:47:44 -0400 Subject: [PATCH 0032/1164] Revert "Revert "Add developer setting to set the default GPU renderer."" This reverts commit 5dfe05f3adfa8c08beb87445a7d88b1ab10b60ec. Change-Id: I92d0ea8032e8a94c924dcc1860e6c8242f62ef3b Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/view/ThreadedRenderer.java | 12 ++++++++++++ packages/SettingsLib/res/values/arrays.xml | 12 ++++++++++++ packages/SettingsLib/res/values/strings.xml | 3 +++ 3 files changed, 27 insertions(+) diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 5b61015e9d42..8d3354012550 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -166,6 +166,18 @@ public final class ThreadedRenderer { */ public static final String OVERDRAW_PROPERTY_SHOW = "show"; + /** + * Defines the rendering pipeline to be used by the ThreadedRenderer. + * + * Possible values: + * "opengl", will use the existing OpenGL renderer + * "skiagl", will use Skia's OpenGL renderer + * "skiavk", will use Skia's Vulkan renderer + * + * @hide + */ + public static final String DEBUG_RENDERER_PROPERTY = "debug.hwui.renderer"; + /** * Turn on to debug non-rectangular clip operations. * diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml index 09fa284b0a39..e8e3be058a3a 100644 --- a/packages/SettingsLib/res/values/arrays.xml +++ b/packages/SettingsLib/res/values/arrays.xml @@ -480,6 +480,18 @@ show_deuteranomaly + + + OpenGL (Default) + OpenGL (Skia) + + + + + opengl + skiagl + + Standard limit diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index a46c3e64c163..d46873dfd218 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -713,6 +713,9 @@ Debug GPU overdraw + + Set GPU Renderer + Disable HW overlays From 7228e5dd31bcef51828ac01df15782d3e5620b91 Mon Sep 17 00:00:00 2001 From: Joe Maples Date: Fri, 25 Aug 2017 11:56:07 -0400 Subject: [PATCH 0033/1164] SettingsLib: Allow Skia Vulkan to be used as HW renderer For some reason, Google left this out. Seems stable enough from my testing, so add it. Change-Id: I3d209fea147b8563aa7bf2fb5e40dad09d8b8cf0 Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- packages/SettingsLib/res/values/arrays.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml index e8e3be058a3a..5e6d92c54b54 100644 --- a/packages/SettingsLib/res/values/arrays.xml +++ b/packages/SettingsLib/res/values/arrays.xml @@ -484,12 +484,14 @@ OpenGL (Default) OpenGL (Skia) + Vulkan (Skia) opengl skiagl + skiavk From 0ebe597fb6c6cb5d920ba4430253f58fb40af8d0 Mon Sep 17 00:00:00 2001 From: Sandeep Kunta Date: Thu, 12 Mar 2015 18:56:30 +0530 Subject: [PATCH 0034/1164] Optimize IncallUI delay for voice calls In current implementation detectCountry method is called from telephony as many times as 34 for one MO voice call, causing increasing delay to appear incallui for user. This fix ensures that there is only one call to detectCountry method per one voice call thus optimizing delay. CRs-Fixed: 803069 Change-Id: Ia6e832476c7f7be2750f1c2d9a4c83f728c2131e Signed-off-by: mydongistiny Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- .../android/telephony/PhoneNumberUtils.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index fadfc91bcdef..1f111193ce69 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -27,6 +27,7 @@ import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; +import android.location.Country; import android.location.CountryDetector; import android.net.Uri; import android.os.SystemProperties; @@ -109,6 +110,7 @@ public class PhoneNumberUtils { private static final String BCD_EF_ADN_EXTENDED = "*#,N;"; private static final String BCD_CALLED_PARTY_EXTENDED = "*#abc"; + private static Country sCountryDetector = null; /* * global-phone-number = ["+"] 1*( DIGIT / written-sep ) * written-sep = ("-"/".") @@ -2187,12 +2189,9 @@ private static boolean isLocalEmergencyNumberInternal(String number, private static boolean isLocalEmergencyNumberInternal(int subId, String number, Context context, boolean useExactMatch) { - String countryIso; - CountryDetector detector = (CountryDetector) context.getSystemService( - Context.COUNTRY_DETECTOR); - if (detector != null && detector.detectCountry() != null) { - countryIso = detector.detectCountry().getCountryIso(); - } else { + String countryIso = getCountryIso(context); + Rlog.w(LOG_TAG, "isLocalEmergencyNumberInternal" + countryIso); + if (countryIso == null) { Locale locale = context.getResources().getConfiguration().locale; countryIso = locale.getCountry(); Rlog.w(LOG_TAG, "No CountryDetector; falling back to countryIso based on locale: " @@ -2201,6 +2200,28 @@ private static boolean isLocalEmergencyNumberInternal(int subId, String number, return isEmergencyNumberInternal(subId, number, countryIso, useExactMatch); } + private static String getCountryIso(Context context) { + Rlog.w(LOG_TAG, "getCountryIso " + sCountryDetector); + if (sCountryDetector == null) { + CountryDetector detector = (CountryDetector) context.getSystemService( + Context.COUNTRY_DETECTOR); + if (detector != null) { + sCountryDetector = detector.detectCountry(); + } + } + + if (sCountryDetector == null) { + return null; + } else { + return sCountryDetector.getCountryIso(); + } + } + + /** @hide */ + public static void resetCountryDetectorInfo() { + sCountryDetector = null; + } + /** * isVoiceMailNumber: checks a given number against the voicemail * number provided by the RIL and SIM card. The caller must have From 924df2a9c189723dea12d3c843141d76b73bcbe0 Mon Sep 17 00:00:00 2001 From: AdrianDC Date: Wed, 18 Nov 2015 19:15:29 +0100 Subject: [PATCH 0035/1164] MountService: Prevent NPE with DropBoxManager * "java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.DropBoxManager.addText(java.lang.String, java.lang.String)' on a null object reference" Change-Id: I418ba99caa4f55b184fabee4ad610ca3e5e7c66f Signed-off-by: AdrianDC Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- .../java/com/android/server/StorageManagerService.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 183be9b98750..c2a7205fd522 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -1706,8 +1706,10 @@ public void onFinished(int status, PersistableBundle extras) { final long destroy = extras.getLong("destroy"); final DropBoxManager dropBox = mContext.getSystemService(DropBoxManager.class); - dropBox.addText(TAG_STORAGE_BENCHMARK, scrubPath(path) - + " " + ident + " " + create + " " + run + " " + destroy); + if (dropBox != null) { + dropBox.addText(TAG_STORAGE_BENCHMARK, scrubPath(path) + + " " + ident + " " + create + " " + run + " " + destroy); + } synchronized (mLock) { final VolumeRecord rec = findRecordForPath(path); @@ -1864,7 +1866,9 @@ public void onStatus(int status, PersistableBundle extras) { final long time = extras.getLong("time"); final DropBoxManager dropBox = mContext.getSystemService(DropBoxManager.class); - dropBox.addText(TAG_STORAGE_TRIM, scrubPath(path) + " " + bytes + " " + time); + if (dropBox != null) { + dropBox.addText(TAG_STORAGE_TRIM, scrubPath(path) + " " + bytes + " " + time); + } synchronized (mLock) { final VolumeRecord rec = findRecordForPath(path); From 5894e5345316b2a70b4effcdee6de336689e5616 Mon Sep 17 00:00:00 2001 From: Chet Kener Date: Wed, 19 Nov 2014 16:05:35 -0500 Subject: [PATCH 0036/1164] Disable More Debugging Change-Id: I47036467a789be682997a1821306eb34c8c927a4 Signed-off-by: Chet Kener Signed-off-by: Josh Fox(XlxFoXxlX) --- .../com/android/internal/location/GpsNetInitiatedHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java index 9bd59940e37b..ed2cb29abf1d 100644 --- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java +++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java @@ -50,7 +50,7 @@ public class GpsNetInitiatedHandler { private static final String TAG = "GpsNetInitiatedHandler"; - private static final boolean DEBUG = true; + private static final boolean DEBUG = false; private static final boolean VERBOSE = false; // NI verify activity for bringing up UI (not used yet) From 7335fed48a2924b8254fcb0700a0f873ddead7b1 Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Mon, 12 Sep 2016 11:38:58 +0200 Subject: [PATCH 0037/1164] Allow adjusting screen density to smaller sizes. Accomodates for 6" 1080x1920 devices that run at 480dpi by default, but those physical resolution is ~360dpi. Change-Id: I82973b097612f1e7d26af9fdbb3ac2ae28c6b93b Signed-off-by: Josh Fox(XlxFoXxlX) --- .../SettingsLib/res/values/aosip_strings.xml | 25 +++++++++++++++++++ .../display/DisplayDensityUtils.java | 6 +++-- 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 packages/SettingsLib/res/values/aosip_strings.xml diff --git a/packages/SettingsLib/res/values/aosip_strings.xml b/packages/SettingsLib/res/values/aosip_strings.xml new file mode 100644 index 000000000000..eb9dc9ce5f62 --- /dev/null +++ b/packages/SettingsLib/res/values/aosip_strings.xml @@ -0,0 +1,25 @@ + + + + + + Smaller + + + Smallest + + diff --git a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java index af8fd4c46a64..b6e3d31c99d8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java @@ -43,7 +43,7 @@ public class DisplayDensityUtils { private static final float MIN_SCALE_INTERVAL = 0.09f; /** Minimum density scale. This is available on all devices. */ - private static final float MIN_SCALE = 0.85f; + private static final float MIN_SCALE = 0.70f; /** Maximum density scale. The actual scale used depends on the device. */ private static final float MAX_SCALE = 1.50f; @@ -59,7 +59,9 @@ public class DisplayDensityUtils { * largest. */ private static final int[] SUMMARIES_SMALLER = new int[] { - R.string.screen_zoom_summary_small + R.string.screen_zoom_summary_small, + R.string.screen_zoom_summary_smaller, + R.string.screen_zoom_summary_smallest }; /** From 3df2e9a4c6f95ab810f2cd45cff185becbb329b5 Mon Sep 17 00:00:00 2001 From: Manojkumar Murugeshan Date: Thu, 7 Jun 2018 17:00:47 +0530 Subject: [PATCH 0038/1164] SystemUI: QS: Name Cellular Tile based on carrier CRs-Fixed: 957287 Change-Id: Iac9c3426299db04029b8f9e2ea32a1fdc2faf78e Signed-off-by: Josh Fox(XlxFoXxlX) --- .../src/com/android/systemui/qs/tiles/CellularTile.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index fb4fcd43a3c5..ae968b1d0016 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -167,17 +167,23 @@ protected void handleUpdateState(SignalState state, Object arg) { cb = mSignalCallback.mInfo; } + DataUsageController.DataUsageInfo carrierLabelInfo = mDataController.getDataUsageInfo(); final Resources r = mContext.getResources(); state.activityIn = cb.enabled && cb.activityIn; state.activityOut = cb.enabled && cb.activityOut; - state.label = r.getString(R.string.mobile_data); boolean mobileDataEnabled = mDataController.isMobileDataSupported() && mDataController.isMobileDataEnabled(); state.value = mobileDataEnabled; state.expandedAccessibilityClassName = Switch.class.getName(); if (cb.noSim) { + state.label = r.getString(R.string.mobile_data); state.icon = ResourceIcon.get(R.drawable.ic_qs_no_sim); } else { + if (carrierLabelInfo != null) { + state.label = carrierLabelInfo.carrier; + } else { + state.label = r.getString(R.string.mobile_data); + } state.icon = ResourceIcon.get(R.drawable.ic_swap_vert); } From b2da2b2e0794f0eb68a590b373e7cb591e61d4c5 Mon Sep 17 00:00:00 2001 From: Andrzej Ressel Date: Wed, 9 Aug 2017 00:11:16 +0200 Subject: [PATCH 0039/1164] Allow user to add/remove QS with one click Demo: https://www.youtube.com/watch?v=SlnRKLa4K7o Change-Id: I9250fe5fd6a3edf567f1f4d30fd86838f5ef4610 Signed-off-by: Josh Fox(XlxFoXxlX) --- .../com/android/systemui/qs/customize/TileAdapter.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 5adeec3cbab4..517c4b7599af 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -280,8 +280,16 @@ public void onLayoutChange(View v, int left, int top, int right, int bottom, holder.mTileView.handleStateChanged(info.state); holder.mTileView.setShowAppLabel(position > mEditIndex && !info.isSystem); + final boolean selectable = mAccessibilityAction == ACTION_NONE || position < mEditIndex; + if (!(mAccessibilityManager.isTouchExplorationEnabled() && selectable)) { + holder.mTileView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + move(holder.getAdapterPosition(), mEditIndex, holder.mTileView); + } + }); + } if (mAccessibilityManager.isTouchExplorationEnabled()) { - final boolean selectable = mAccessibilityAction == ACTION_NONE || position < mEditIndex; holder.mTileView.setClickable(selectable); holder.mTileView.setFocusable(selectable); holder.mTileView.setImportantForAccessibility(selectable From 6c0178232cd57e5aed663aa42077130a8bb833a8 Mon Sep 17 00:00:00 2001 From: Stephen Bird Date: Fri, 5 Jun 2015 16:08:25 -0700 Subject: [PATCH 0040/1164] MediaScanner: Detect folders If folders are ignored, MTP will show folders as files Change-Id: I960b92ed2f17c7da635d369e3c37560e167485a1 (cherry picked from commit 63b5c3dc0d75d17e4d35b3397faa5409a53b8e99) Signed-off-by: Josh Fox(XlxFoXxlX) --- media/java/android/media/MediaScanner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 8a757b86a5fa..1c6ab01e0b4b 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -1409,7 +1409,7 @@ public Uri scanSingleFile(String path, String mimeType) { // always scan the file, so we can return the content://media Uri for existing files return mClient.doScanFile(path, mimeType, lastModifiedSeconds, file.length(), - false, true, MediaScanner.isNoMediaPath(path)); + file.isDirectory(), true, MediaScanner.isNoMediaPath(path)); } catch (RemoteException e) { Log.e(TAG, "RemoteException in MediaScanner.scanFile()", e); return null; From 7c68e7a72e9f2cb49fd2098f429f844b9722db9d Mon Sep 17 00:00:00 2001 From: "guotao.deng" Date: Mon, 29 Feb 2016 12:03:03 +0800 Subject: [PATCH 0041/1164] Should use scan flag, or it will not scan device. Change-Id: I74f83e2751743236e34ae5422dc7539584e71589 Signed-off-by: Chet Kener Signed-off-by: Josh Fox(XlxFoXxlX) --- .../android/systemui/statusbar/policy/CastControllerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java index 58f4782e637b..78811a7f27c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java @@ -115,7 +115,7 @@ private void handleDiscoveryChangeLocked() { } if (mDiscovering) { mMediaRouter.addCallback(ROUTE_TYPE_REMOTE_DISPLAY, mMediaCallback, - MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); + MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); mCallbackRegistered = true; } else if (mCallbacks.size() != 0) { mMediaRouter.addCallback(ROUTE_TYPE_REMOTE_DISPLAY, mMediaCallback, From 791f9361bdfc8dad5cec11565826cef8fe21be2a Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 7 Sep 2016 03:45:27 -0400 Subject: [PATCH 0042/1164] Re-add in our device utils In M we had too many of these. Let's establish this one early and just add checks to it as needed. - Add check for flashlight API Change-Id: I4a6b8ce1c365ed88b3fb14d06f4551c3d37519ec Signed-off-by: Josh Fox(XlxFoXxlX) --- .../internal/util/aosip/aosipUtils.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 core/java/com/android/internal/util/aosip/aosipUtils.java diff --git a/core/java/com/android/internal/util/aosip/aosipUtils.java b/core/java/com/android/internal/util/aosip/aosipUtils.java new file mode 100644 index 000000000000..20e81f5ca967 --- /dev/null +++ b/core/java/com/android/internal/util/aosip/aosipUtils.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2014 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.internal.util.aosip; + +import android.content.Context; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; + +public class aosipUtils { + + public static boolean deviceSupportsFlashLight(Context context) { + CameraManager cameraManager = (CameraManager) context.getSystemService( + Context.CAMERA_SERVICE); + try { + String[] ids = cameraManager.getCameraIdList(); + for (String id : ids) { + CameraCharacteristics c = cameraManager.getCameraCharacteristics(id); + Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); + Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING); + if (flashAvailable != null + && flashAvailable + && lensFacing != null + && lensFacing == CameraCharacteristics.LENS_FACING_BACK) { + return true; + } + } + } catch (CameraAccessException e) { + // Ignore + } + return false; + } +} From cde7bd46036e20fb1416721955e63b767daceede Mon Sep 17 00:00:00 2001 From: Roman Birg Date: Sun, 23 Oct 2016 06:43:28 +0200 Subject: [PATCH 0043/1164] Add isPackageInstalled boolean Change-Id: Ibadea83b68c012c08e47c3622ba96a37c8ddf1b9 Signed-off-by: Josh Fox(XlxFoXxlX) --- .../internal/util/aosip/aosipUtils.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/core/java/com/android/internal/util/aosip/aosipUtils.java b/core/java/com/android/internal/util/aosip/aosipUtils.java index 20e81f5ca967..e9ae1ef42f81 100644 --- a/core/java/com/android/internal/util/aosip/aosipUtils.java +++ b/core/java/com/android/internal/util/aosip/aosipUtils.java @@ -17,12 +17,34 @@ package com.android.internal.util.aosip; import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; public class aosipUtils { + public static boolean isPackageInstalled(Context context, String pkg, boolean ignoreState) { + if (pkg != null) { + try { + PackageInfo pi = context.getPackageManager().getPackageInfo(pkg, 0); + if (!pi.applicationInfo.enabled && !ignoreState) { + return false; + } + } catch (NameNotFoundException e) { + return false; + } + } + + return true; + } + + public static boolean isPackageInstalled(Context context, String pkg) { + return isPackageInstalled(context, pkg, true); + } + public static boolean deviceSupportsFlashLight(Context context) { CameraManager cameraManager = (CameraManager) context.getSystemService( Context.CAMERA_SERVICE); From f80b44d1b2aaf0e51a4fa1d0c32f9e885a87e638 Mon Sep 17 00:00:00 2001 From: Chet Kener Date: Tue, 6 Oct 2015 10:23:53 -0400 Subject: [PATCH 0044/1164] Allow faster app switching Change-Id: Ic3682fa3cd8313f824428606a95b245d05a047e0 Signed-off-by: Chet Kener Signed-off-by: Josh Fox(XlxFoXxlX) --- .../core/java/com/android/server/am/ActivityManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 692d6063fc02..aa0fcb8cac9e 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -572,7 +572,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Amount of time after a call to stopAppSwitches() during which we will // prevent further untrusted switches from happening. - static final long APP_SWITCH_DELAY_TIME = 5*1000; + static final long APP_SWITCH_DELAY_TIME = 1*1000; // How long we wait for a launched process to attach to the activity manager // before we decide it's never going to come up for real. From 4daa237a69b23b414637fa87995e39b87cfbac6e Mon Sep 17 00:00:00 2001 From: Jake Weinstein Date: Thu, 13 Oct 2016 23:56:02 -0400 Subject: [PATCH 0045/1164] base: set scrolling to 0.006f Change-Id: I18a52ac84ba9c8274adc757e41ca2ca995d514f6 Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/widget/AbsListView.java | 1 + core/java/android/widget/ScrollView.java | 1 + 2 files changed, 2 insertions(+) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 298c61e403ab..32e99c4d3c9a 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -4616,6 +4616,7 @@ public void run() { FlingRunnable() { mScroller = new OverScroller(getContext()); + mScroller.setFriction(0.006f); } void start(int initialVelocity) { diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 97d32f1266af..dc70c3500b21 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -243,6 +243,7 @@ public int getMaxScrollAmount() { private void initScrollView() { mScroller = new OverScroller(getContext()); + mScroller.setFriction(0.006f); setFocusable(true); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setWillNotDraw(false); From d7da2d9ad97e53b6634b27c8b7553b102f687808 Mon Sep 17 00:00:00 2001 From: Alex Cruz Date: Wed, 21 Jun 2017 22:05:39 +0200 Subject: [PATCH 0046/1164] Fix NPE with void android.view.VelocityTracker.clear() 06-21 14:39:46.546 30816 30816 E AndroidRuntime: FATAL EXCEPTION: main 06-21 14:39:46.546 30816 30816 E AndroidRuntime: Process: com.android.settings, PID: 30816 06-21 14:39:46.546 30816 30816 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.VelocityTracker.clear()' on a null object reference 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.widget.ScrollView.onTouchEvent(ScrollView.java:692) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.View.dispatchTouchEvent(View.java:10023) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2626) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2307) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:416) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1808) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.app.Activity.dispatchTouchEvent(Activity.java:3065) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:53) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:378) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.View.dispatchPointerEvent(View.java:10243) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4444) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4312) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3912) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3878) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4005) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3886) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4062) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3912) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3878) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3886) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6253) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6227) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6188) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6356) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6327) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6379) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:686) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:615) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:751) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6208) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891) 06-21 14:39:46.546 30816 30816 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781) Change-Id: I415fc2e85bcdbe694f1d3a1bd76d1462fc8db78b Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/widget/ScrollView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index dc70c3500b21..22c2d372ba90 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -693,7 +693,9 @@ public boolean onTouchEvent(MotionEvent ev) { if (overScrollBy(0, deltaY, 0, mScrollY, 0, range, 0, mOverscrollDistance, true) && !hasNestedScrollingParent()) { // Break our velocity if we hit a scroll barrier. - mVelocityTracker.clear(); + if (mVelocityTracker != null) { + mVelocityTracker.clear(); + } } final int scrolledDeltaY = mScrollY - oldY; From 3abdc9322f415b3866ed08a098030a1e887c9185 Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Wed, 24 Apr 2013 11:09:55 +0200 Subject: [PATCH 0047/1164] Allow creating custom dialogs in DialogPreference. This allows creating non-AlertDialogs while still using the click and state handling of DialogPreference. Change-Id: I54fd7d6d6b9f6a49fef1ae95e0178838b3edfa56 Signed-off-by: Josh Fox(XlxFoXxlX) --- .../android/preference/DialogPreference.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/core/java/android/preference/DialogPreference.java b/core/java/android/preference/DialogPreference.java index 3d57b4db2598..035b280e041f 100644 --- a/core/java/android/preference/DialogPreference.java +++ b/core/java/android/preference/DialogPreference.java @@ -285,6 +285,22 @@ protected void onClick() { * @param state Optional instance state to restore on the dialog */ protected void showDialog(Bundle state) { + // Create the dialog + final Dialog dialog = mDialog = createDialog(); + if (state != null) { + dialog.onRestoreInstanceState(state); + } + if (needInputMethod()) { + requestInputMethod(dialog); + } + dialog.setOnDismissListener(this); + dialog.show(); + } + + /** + * @hide + */ + protected Dialog createDialog() { Context context = getContext(); mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE; @@ -307,16 +323,7 @@ protected void showDialog(Bundle state) { getPreferenceManager().registerOnActivityDestroyListener(this); - // Create the dialog - final Dialog dialog = mDialog = mBuilder.create(); - if (state != null) { - dialog.onRestoreInstanceState(state); - } - if (needInputMethod()) { - requestInputMethod(dialog); - } - dialog.setOnDismissListener(this); - dialog.show(); + return mBuilder.create(); } /** From b6f21fb635fd912b6b6f90e8f38f11916bd4ee14 Mon Sep 17 00:00:00 2001 From: Alex Cruz Date: Sun, 12 Feb 2017 21:38:35 +0100 Subject: [PATCH 0048/1164] Increase Zenmode max hour limit from 12 to 24 - Doesn't make sense to limit zenmode to just 12 hours when there's 24 hours on the clock. I get that someone at Google was looking at it like 'we only work 12 hours a day' and that's probably where that came from but real people sometimes need their phone quiet for more than 12 hours in a day. Change-Id: Ib07a46fef6cc1a8ba6ac7cb28395700bf4037534 Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/service/notification/ZenModeConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 5546e803342b..b5f8aee73bf3 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -353,7 +353,7 @@ private static boolean sameCondition(ZenRule rule) { } private static int[] generateMinuteBuckets() { - final int maxHrs = 12; + final int maxHrs = 24; final int[] buckets = new int[maxHrs + 3]; buckets[0] = 15; buckets[1] = 30; From 5abaecf79bac5a2a22088310bcef7d7501131a7d Mon Sep 17 00:00:00 2001 From: Chet Kener Date: Tue, 6 Oct 2015 09:45:11 -0400 Subject: [PATCH 0049/1164] Speed up Orientation Listener Change-Id: I3d2fc1f89fa64e1d9151efc0e10a0b7fafd6ff0a Signed-off-by: Chet Kener Signed-off-by: Josh Fox(XlxFoXxlX) --- .../android/server/policy/WindowOrientationListener.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java index 9b4251def937..57bb08102c00 100644 --- a/services/core/java/com/android/server/policy/WindowOrientationListener.java +++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java @@ -400,22 +400,22 @@ final class AccelSensorJudge extends OrientationJudge { // the low-pass filter already suppresses most of the noise so we're really just // looking for quick confirmation that the last few samples are in agreement as to // the desired orientation. - private static final long PROPOSAL_SETTLE_TIME_NANOS = 40 * NANOS_PER_MS; + private static final long PROPOSAL_SETTLE_TIME_NANOS = 25 * NANOS_PER_MS; // The minimum amount of time that must have elapsed since the device last exited // the flat state (time since it was picked up) before the proposed rotation // can change. - private static final long PROPOSAL_MIN_TIME_SINCE_FLAT_ENDED_NANOS = 500 * NANOS_PER_MS; + private static final long PROPOSAL_MIN_TIME_SINCE_FLAT_ENDED_NANOS = 250 * NANOS_PER_MS; // The minimum amount of time that must have elapsed since the device stopped // swinging (time since device appeared to be in the process of being put down // or put away into a pocket) before the proposed rotation can change. - private static final long PROPOSAL_MIN_TIME_SINCE_SWING_ENDED_NANOS = 300 * NANOS_PER_MS; + private static final long PROPOSAL_MIN_TIME_SINCE_SWING_ENDED_NANOS = 150 * NANOS_PER_MS; // The minimum amount of time that must have elapsed since the device stopped // undergoing external acceleration before the proposed rotation can change. private static final long PROPOSAL_MIN_TIME_SINCE_ACCELERATION_ENDED_NANOS = - 500 * NANOS_PER_MS; + 250 * NANOS_PER_MS; // If the tilt angle remains greater than the specified angle for a minimum of // the specified time, then the device is deemed to be lying flat From 77d1905c57267dc61b5dc209cbebe07db7915fb1 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 9 Feb 2017 01:46:28 +0530 Subject: [PATCH 0050/1164] Kill off provider info logspam "Failed to find provider info for %s" spam killed Change-Id: I10f156073e32d35e752ae25a96fc99f80cf184ab Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/app/ActivityThread.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 87b334992d2d..fef575034f60 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -5974,7 +5974,7 @@ public final IContentProvider acquireProvider( throw ex.rethrowFromSystemServer(); } if (holder == null) { - Slog.e(TAG, "Failed to find provider info for " + auth); + if (DEBUG_MESSAGES) Slog.e(TAG, "Failed to find provider info for " + auth); return null; } From 1acfc1e083d777996902ea34b9e2b6b6e0cc6096 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 23 Jun 2017 12:05:02 +0530 Subject: [PATCH 0051/1164] Suppress FingerprintManager logspam If FingerprintManager#isFingerprintHardwareDetected fails to detect a fingerprint sensor, it emits a warning in the logcat warn stream. This failure can only happen in the following cases - Device lacks a fingerprint sensor - Device has a dying/dead fingerprint sensor - The FingerprintManager class lacks the manifest permission to connect to the fingerprint hardware via system server All these are unlikely to be useful scenarios, so disable the logspam Might make more sense to restrict this function to be called only a finite times before the system gives up and assumes there is no usable fingerprint hardware on the device Change-Id: Ibe32d956ff89379ecacc1348748e3e7272f314d8 Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/hardware/fingerprint/FingerprintManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index ebbfe1c26a9c..5055af0ddb39 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -790,7 +790,7 @@ public boolean isHardwareDetected() { throw e.rethrowFromSystemServer(); } } else { - Slog.w(TAG, "isFingerprintHardwareDetected(): Service not connected!"); + if (DEBUG) Slog.w(TAG, "isFingerprintHardwareDetected(): Service not connected!"); } return false; } From 922c739f73dd925886d856fd4d519def6593d8ec Mon Sep 17 00:00:00 2001 From: PrimeDirective Date: Mon, 30 Sep 2013 13:41:16 -0400 Subject: [PATCH 0052/1164] Scroll: modified velocitytracker Velocitytracker and overscroll are called on every touch event to calculate if there is a scrolling/fling. Move this and the recycling to static voids so they are pre-optimized at compile time rather than after evoking the method call during runtime (JIT) to increase responsiveness. -Vanir Change-Id: Ic7351da58f29281ca2b6a788386b95b68b552390 Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/widget/ScrollView.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 22c2d372ba90..661c7d378135 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -84,7 +84,7 @@ public class ScrollView extends FrameLayout { private long mLastScroll; private final Rect mTempRect = new Rect(); - private OverScroller mScroller; + private static OverScroller mScroller; private EdgeEffect mEdgeGlowTop; private EdgeEffect mEdgeGlowBottom; @@ -116,7 +116,7 @@ public class ScrollView extends FrameLayout { /** * Determines speed during touch scrolling */ - private VelocityTracker mVelocityTracker; + private static VelocityTracker mVelocityTracker; /** * When set to true, the scroll view measure its child to make it fill the currently @@ -189,7 +189,6 @@ public ScrollView(Context context, AttributeSet attrs, int defStyleAttr, int def attrs, com.android.internal.R.styleable.ScrollView, defStyleAttr, defStyleRes); setFillViewport(a.getBoolean(R.styleable.ScrollView_fillViewport, false)); - a.recycle(); if (context.getResources().getConfiguration().uiMode == Configuration.UI_MODE_TYPE_WATCH) { @@ -466,7 +465,7 @@ private void initVelocityTrackerIfNotExists() { } } - private void recycleVelocityTracker() { + private static void recycleVelocityTracker() { if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; From aa940ec6ec1a7fb42030637dc907c6c10e96acd0 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 13 Jun 2016 21:02:03 +0300 Subject: [PATCH 0053/1164] utils: Introduce FileUtils class Change-Id: Icbfa068fa0db2ae28436063072dd4b576f1b2be1 FileUtils: Add util to check if a file exists Change-Id: I565744821346c90ff670704a13fffc7bf464ff71 Signed-off-by: gtpitch Signed-off-by: Josh Fox(XlxFoXxlX) --- .../internal/util/aosip/FileUtils.java | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 core/java/com/android/internal/util/aosip/FileUtils.java diff --git a/core/java/com/android/internal/util/aosip/FileUtils.java b/core/java/com/android/internal/util/aosip/FileUtils.java new file mode 100644 index 000000000000..afcc6f703579 --- /dev/null +++ b/core/java/com/android/internal/util/aosip/FileUtils.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2016 The CyanogenMod 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.internal.util.aosip; + +import android.util.Log; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +public final class FileUtils { + private static final String TAG = "FileUtils"; + + private FileUtils() { + // This class is not supposed to be instantiated + } + + /** + * Reads the first line of text from the given file. + * Reference {@link BufferedReader#readLine()} for clarification on what a line is + * + * @return the read line contents, or null on failure + */ + public static String readOneLine(String fileName) { + String line = null; + BufferedReader reader = null; + + try { + reader = new BufferedReader(new FileReader(fileName), 512); + line = reader.readLine(); + } catch (FileNotFoundException e) { + Log.w(TAG, "No such file " + fileName + " for reading", e); + } catch (IOException e) { + Log.e(TAG, "Could not read from file " + fileName, e); + } finally { + try { + if (reader != null) { + reader.close(); + } + } catch (IOException e) { + // Ignored, not much we can do anyway + } + } + + return line; + } + + /** + * Writes the given value into the given file + * + * @return true on success, false on failure + */ + public static boolean writeLine(String fileName, String value) { + BufferedWriter writer = null; + + try { + writer = new BufferedWriter(new FileWriter(fileName)); + writer.write(value); + } catch (FileNotFoundException e) { + Log.w(TAG, "No such file " + fileName + " for writing", e); + return false; + } catch (IOException e) { + Log.e(TAG, "Could not write to file " + fileName, e); + return false; + } finally { + try { + if (writer != null) { + writer.close(); + } + } catch (IOException e) { + // Ignored, not much we can do anyway + } + } + + return true; + } + + /** + * Checks whether the given file exists + * + * @return true if exists, false if not + */ + public static boolean fileExists(String fileName) { + final File file = new File(fileName); + return file.exists(); + } + + /** + * Checks whether the given file is readable + * + * @return true if readable, false if not + */ + public static boolean isFileReadable(String fileName) { + final File file = new File(fileName); + return file.exists() && file.canRead(); + } + + /** + * Checks whether the given file is writable + * + * @return true if writable, false if not + */ + public static boolean isFileWritable(String fileName) { + final File file = new File(fileName); + return file.exists() && file.canWrite(); + } +} From ec320e18d5d493775ba48b502497f7c4f53df8e0 Mon Sep 17 00:00:00 2001 From: Devi Sandeep Endluri V V Date: Mon, 2 May 2016 14:17:17 -0700 Subject: [PATCH 0054/1164] Enable NSRM (Network Socket Request Manager). NSRM is a feature to synchronize app socket requests to reduce network signalling and there by save power. Change-Id: Ic34b9c54404ba2156701da1f63232013978bf3a4 CRs-Fixed: 997493 Fix: Added safe check to prevent app crash. PowerManagerService instance with respect to NSRM is not handled properly which results in application crash. Safe checks are added to prevent crashes. Change-Id: I4ab69e85b1f0a7a4d018b844f4e3dc7f6e1410e8 CRs-Fixed: 1051580 Adding Synchronization for PowerManager mWakeLock. Race Condition was causing Runtime Exception in PowerManager.Lock Variable named mWakeLock. It was occuring while releasing mWakeLock. So Adding Synchronization Mechanism to Fix this Issue. CRs-Fixed: 1017355 Change-Id: Ic0376b702298fa45e0d1cc426abb64933bfaa8dc Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/app/IAlarmManager.aidl | 2 + .../android/os/IDeviceIdleController.aidl | 2 + core/java/android/os/IPowerManager.aidl | 3 + .../android/server/AlarmManagerService.java | 28 ++- .../android/server/DeviceIdleController.java | 12 ++ .../android/server/QCNsrmAlarmExtension.java | 120 +++++++++++++ .../server/power/PowerManagerService.java | 29 +++- .../server/power/QCNsrmPowerExtension.java | 160 ++++++++++++++++++ 8 files changed, 345 insertions(+), 11 deletions(-) create mode 100644 services/core/java/com/android/server/QCNsrmAlarmExtension.java create mode 100644 services/core/java/com/android/server/power/QCNsrmPowerExtension.java diff --git a/core/java/android/app/IAlarmManager.aidl b/core/java/android/app/IAlarmManager.aidl index ded4c4954956..614de779c767 100644 --- a/core/java/android/app/IAlarmManager.aidl +++ b/core/java/android/app/IAlarmManager.aidl @@ -38,4 +38,6 @@ interface IAlarmManager { long getNextWakeFromIdleTime(); AlarmManager.AlarmClockInfo getNextAlarmClock(int userId); long currentNetworkTimeMillis(); + // update the uids being synchronized by network socket request manager + void updateBlockedUids(int uid, boolean isBlocked); } diff --git a/core/java/android/os/IDeviceIdleController.aidl b/core/java/android/os/IDeviceIdleController.aidl index 827170144dea..3d2d4fbcf865 100644 --- a/core/java/android/os/IDeviceIdleController.aidl +++ b/core/java/android/os/IDeviceIdleController.aidl @@ -45,4 +45,6 @@ interface IDeviceIdleController { void exitIdle(String reason); boolean registerMaintenanceActivityListener(IMaintenanceActivityListener listener); void unregisterMaintenanceActivityListener(IMaintenanceActivityListener listener); + int getIdleStateDetailed(); + int getLightIdleStateDetailed(); } diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index 13e4e38df5f6..f76974c8a560 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -68,4 +68,7 @@ interface IPowerManager // controls whether PowerManager should doze after the screen turns off or not void setDozeAfterScreenOff(boolean on); + + // update the uids being synchronized by network socket request manager + void updateBlockedUids(int uid, boolean isBlocked); } diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index f79a51b13afd..20bb7fb47890 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -182,6 +182,7 @@ class AlarmManagerService extends SystemService { private long mLastTickRemoved; int mBroadcastRefCount = 0; PowerManager.WakeLock mWakeLock; + private QCNsrmAlarmExtension qcNsrmExt = new QCNsrmAlarmExtension(this); boolean mLastWakeLockUnimportantForLogging; ArrayList mPendingNonWakeupAlarms = new ArrayList<>(); ArrayList mInFlight = new ArrayList<>(); @@ -1855,6 +1856,16 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { } } + @Override + /* updates the blocked uids, so if a wake lock is acquired to only fire + * alarm for it, it can be released. + */ + public void updateBlockedUids(int uid, boolean isBlocked) { + synchronized(mLock) { + qcNsrmExt.processBlockedUids(uid, isBlocked, mWakeLock); + } + } + @Override public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, String[] args, ShellCallback callback, @@ -3627,11 +3638,10 @@ void setWakelockWorkSource(PendingIntent pi, WorkSource ws, int type, String tag mWakeLock.setWorkSource(new WorkSource(uid)); return; } + // Something went wrong; fall back to attributing the lock to the OS + mWakeLock.setWorkSource(null); } catch (Exception e) { } - - // Something went wrong; fall back to attributing the lock to the OS - mWakeLock.setWorkSource(null); } private class AlarmHandler extends Handler { @@ -4072,9 +4082,13 @@ private void updateTrackingLocked(InFlight inflight) { if (DEBUG_WAKELOCK) { Slog.d(TAG, "mBroadcastRefCount -> " + mBroadcastRefCount); } + qcNsrmExt.removeTriggeredUid(inflight.mUid); + if (mBroadcastRefCount == 0) { mHandler.obtainMessage(AlarmHandler.REPORT_ALARMS_ACTIVE, 0).sendToTarget(); - mWakeLock.release(); + if (mWakeLock.isHeld()) { + mWakeLock.release(); + } if (mInFlight.size() > 0) { mLog.w("Finished all dispatches with " + mInFlight.size() + " remaining inflights"); @@ -4236,7 +4250,9 @@ public void deliverLocked(Alarm alarm, long nowELAPSED, boolean allowWhileIdle) setWakelockWorkSource(alarm.operation, alarm.workSource, alarm.type, alarm.statsTag, (alarm.operation == null) ? alarm.uid : -1, true); + if (!mWakeLock.isHeld()) { mWakeLock.acquire(); + } mHandler.obtainMessage(AlarmHandler.REPORT_ALARMS_ACTIVE, 1).sendToTarget(); } final InFlight inflight = new InFlight(AlarmManagerService.this, @@ -4244,6 +4260,10 @@ public void deliverLocked(Alarm alarm, long nowELAPSED, boolean allowWhileIdle) alarm.packageName, alarm.type, alarm.statsTag, nowELAPSED); mInFlight.add(inflight); mBroadcastRefCount++; + qcNsrmExt.addTriggeredUid((alarm.operation != null) ? + alarm.operation.getCreatorUid() : + alarm.uid); + if (allowWhileIdle) { // Record the last time this uid handled an ALLOW_WHILE_IDLE alarm. mLastAllowWhileIdleDispatch.put(alarm.creatorUid, nowELAPSED); diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index b8f395b74c59..e2df19913b51 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -1261,6 +1261,18 @@ public String[] getRemovedSystemPowerWhitelistApps() { return isPowerSaveWhitelistAppInternal(name); } + @Override public int getIdleStateDetailed() { + getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, + null); + return mState; + } + + @Override public int getLightIdleStateDetailed() { + getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, + null); + return mLightState; + } + @Override public void addPowerSaveTempWhitelistApp(String packageName, long duration, int userId, String reason) throws RemoteException { addPowerSaveTempWhitelistAppChecked(packageName, duration, userId, reason); diff --git a/services/core/java/com/android/server/QCNsrmAlarmExtension.java b/services/core/java/com/android/server/QCNsrmAlarmExtension.java new file mode 100644 index 000000000000..a042f720ef86 --- /dev/null +++ b/services/core/java/com/android/server/QCNsrmAlarmExtension.java @@ -0,0 +1,120 @@ +/* + *Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + *Redistribution and use in source and binary forms, with or without + *modification, are permitted provided that the following conditions are + *met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + *THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + *WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + *BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + *OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + *IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.server; + +import android.os.Binder; +import android.os.PowerManager; +import android.os.Process; +import android.util.Slog; + +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + +public final class QCNsrmAlarmExtension { + static final String TAG = "QCNsrmAlarmExtn"; + static final boolean localLOGV = false; + private AlarmManagerService almHandle; + + //track the blocked and triggered uids in AlarmManagerService + private static final ArrayList mTriggeredUids = new ArrayList(); + private static final ArrayList mBlockedUids = new ArrayList(); + private static final int BLOCKED_UID_CHECK_INTERVAL = 1000; // 1 sec. + + public QCNsrmAlarmExtension(AlarmManagerService handle) { + almHandle = handle; + } + + //AlarmManagerService extension Methods + protected void processBlockedUids(int uid, boolean isBlocked, PowerManager.WakeLock mWakeLock ){ + if (localLOGV) Slog.v(TAG, "UpdateBlockedUids: uid = " + uid + + " isBlocked = " + isBlocked); + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + if (localLOGV) Slog.v(TAG, "UpdateBlockedUids is not allowed"); + return; + } + + if(isBlocked) { + if (localLOGV) Slog.v(TAG, "updating alarmMgr mBlockedUids "+ + "with uid " + uid); + mBlockedUids.add(new Integer(uid)); + Timer checkBlockedUidTimer = new Timer(); + checkBlockedUidTimer.schedule( new CheckBlockedUidTimerTask( + uid, + mWakeLock), + BLOCKED_UID_CHECK_INTERVAL); + } else { + if (localLOGV) Slog.v(TAG, "clearing alarmMgr mBlockedUids "); + mBlockedUids.clear(); + } + } + + protected void addTriggeredUid (int uid){ + if (localLOGV) Slog.v(TAG, "adding uid to mTriggeredUids uid=" + uid); + mTriggeredUids.add(new Integer(uid)); + + } + + protected void removeTriggeredUid (int uid) { + if (localLOGV) Slog.v(TAG, "removing uid from mTriggeredUids uid= " + uid); + mTriggeredUids.remove(new Integer(uid)); + } + + protected boolean hasBlockedUid (int uid) { + + return mBlockedUids.contains(uid); + + } + + class CheckBlockedUidTimerTask extends TimerTask { + private int mUid; + PowerManager.WakeLock mWakeLock; + + CheckBlockedUidTimerTask(int uid, PowerManager.WakeLock lWakeLock) { + mUid = uid; + mWakeLock = lWakeLock; + } + + @Override + public void run(){ + if (mBlockedUids.contains(mUid) && mTriggeredUids.contains(mUid)) { + synchronized(almHandle.mLock) { + if (mWakeLock.isHeld()) { + mWakeLock.release(); + if (localLOGV) + Slog.v(TAG, "CheckBlockedUidTimerTask: AM "+ + "WakeLock Released Internally!!"); + } + } + return; + } + } + } +} diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 697801f7787a..952e4c87fac2 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -130,7 +130,7 @@ public final class PowerManagerService extends SystemService private static final int MSG_CHECK_FOR_LONG_WAKELOCKS = 4; // Dirty bit: mWakeLocks changed - private static final int DIRTY_WAKE_LOCKS = 1 << 0; + protected static final int DIRTY_WAKE_LOCKS = 1 << 0; // Dirty bit: mWakefulness changed private static final int DIRTY_WAKEFULNESS = 1 << 1; // Dirty bit: user activity was poked or may have timed out @@ -247,7 +247,7 @@ public final class PowerManagerService extends SystemService // A bitfield that indicates what parts of the power state have // changed and need to be recalculated. - private int mDirty; + protected int mDirty; // Indicates whether the device is awake or asleep or somewhere in between. // This is distinct from the screen power state, which is managed separately. @@ -266,7 +266,7 @@ public final class PowerManagerService extends SystemService private final ArrayList mSuspendBlockers = new ArrayList(); // Table of all wake locks acquired by applications. - private final ArrayList mWakeLocks = new ArrayList(); + protected final ArrayList mWakeLocks = new ArrayList(); // A bitfield that summarizes the state of all active wakelocks. private int mWakeLockSummary; @@ -519,6 +519,8 @@ public final class PowerManagerService extends SystemService // Some uids have actually changed while mUidsChanging was true. private boolean mUidsChanged; + private QCNsrmPowerExtension qcNsrmPowExt; + // True if theater mode is enabled private boolean mTheaterModeEnabled; @@ -664,6 +666,7 @@ public PowerManagerService(Context context) { mBatterySaverStateMachine = new BatterySaverStateMachine( mLock, mContext, mBatterySaverController); + qcNsrmPowExt = new QCNsrmPowerExtension(this); synchronized (mLock) { mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks"); mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display"); @@ -1004,6 +1007,7 @@ private void acquireWakeLockInternal(IBinder lock, int flags, String tag, String } mWakeLocks.add(wakeLock); setWakeLockDisabledStateLocked(wakeLock); + qcNsrmPowExt.checkPmsBlockedWakelocks(uid, pid, flags, tag, wakeLock); notifyAcquire = true; } @@ -1156,7 +1160,7 @@ private int findWakeLockIndexLocked(IBinder lock) { return -1; } - private void notifyWakeLockAcquiredLocked(WakeLock wakeLock) { + protected void notifyWakeLockAcquiredLocked(WakeLock wakeLock) { if (mSystemReady && !wakeLock.mDisabled) { wakeLock.mNotifiedAcquired = true; mNotifier.onWakeLockAcquired(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName, @@ -1212,7 +1216,7 @@ private void notifyWakeLockChangingLocked(WakeLock wakeLock, int flags, String t } } - private void notifyWakeLockReleasedLocked(WakeLock wakeLock) { + protected void notifyWakeLockReleasedLocked(WakeLock wakeLock) { if (mSystemReady && wakeLock.mNotifiedAcquired) { wakeLock.mNotifiedAcquired = false; wakeLock.mAcquireTime = 0; @@ -1581,7 +1585,7 @@ private void finishWakefulnessChangeIfNeededLocked() { * each time something important changes, and ensure that we do it the same * way each time. The point is to gather all of the transition logic here. */ - private void updatePowerStateLocked() { + protected void updatePowerStateLocked() { if (!mSystemReady || mDirty == 0) { return; } @@ -3858,7 +3862,7 @@ public void handleMessage(Message msg) { /** * Represents a wake lock that has been acquired by an application. */ - private final class WakeLock implements IBinder.DeathRecipient { + protected final class WakeLock implements IBinder.DeathRecipient { public final IBinder mLock; public int mFlags; public String mTag; @@ -4592,6 +4596,17 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { Binder.restoreCallingIdentity(ident); } } + + @Override + /* updates the blocked uids, so if a wake lock is acquired for it + * can be released. + */ + public void updateBlockedUids(int uid, boolean isBlocked) { + synchronized(mLock) { + qcNsrmPowExt.processPmsBlockedUid(uid, isBlocked, + mWakeLocks); + } + } } @VisibleForTesting diff --git a/services/core/java/com/android/server/power/QCNsrmPowerExtension.java b/services/core/java/com/android/server/power/QCNsrmPowerExtension.java new file mode 100644 index 000000000000..632d5c1182c7 --- /dev/null +++ b/services/core/java/com/android/server/power/QCNsrmPowerExtension.java @@ -0,0 +1,160 @@ +/* + *Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + *Redistribution and use in source and binary forms, with or without + *modification, are permitted provided that the following conditions are + *met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + *THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + *WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + *BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + *OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + *IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.server.power; + +import java.util.ArrayList; + +import android.os.Binder; +import android.os.PowerManager; +import android.os.Process; +import android.util.Slog; + +public final class QCNsrmPowerExtension { + static final String TAG = "QCNsrmPowerExtn"; + static final boolean localLOGV = false; + private PowerManagerService pmHandle; + + //track the blocked uids in PowerManagerService. + private final ArrayList mPmsBlockedUids = new ArrayList(); + + public QCNsrmPowerExtension (PowerManagerService handle) { + pmHandle = handle ; + } + + protected void checkPmsBlockedWakelocks ( + int uid, int pid, int flags, + String tag, PowerManagerService.WakeLock pMwakeLock + ) { + if(mPmsBlockedUids.contains(new Integer(uid)) && uid != Process.myUid()) { + // wakelock acquisition for blocked uid, disable it. + if (localLOGV) { + Slog.d(TAG, "uid is blocked disabling wakeLock flags=0x" + + Integer.toHexString(flags) + " tag=" + tag + " uid=" + + uid + " pid =" + pid); + } + updatePmsBlockedWakelock(pMwakeLock, true); + } + } + + private boolean checkWorkSourceObjectId ( + int uid, PowerManagerService.WakeLock wl + ) { + try { + for (int index = 0; index < wl.mWorkSource.size(); index++) { + if (uid == wl.mWorkSource.get(index)) { + if (localLOGV) Slog.v(TAG, "WS uid matched"); + return true; + } + } + } + catch (Exception e) { + return false; + } + return false; + } + + protected boolean processPmsBlockedUid ( + int uid, boolean isBlocked, + ArrayList mWakeLocks + ) { + boolean changed = false; + if (updatePmsBlockedUidAllowed(uid, isBlocked)) + return changed; + + for (int index = 0; index < mWakeLocks.size(); index++) { + PowerManagerService.WakeLock wl = mWakeLocks.get(index); + if(wl != null) { + // update the wakelock for the blocked uid + if ((wl.mOwnerUid == uid || checkWorkSourceObjectId(uid, wl)) + || (wl.mTag.startsWith("*sync*") && wl.mOwnerUid == + Process.SYSTEM_UID)) { + if(updatePmsBlockedWakelock(wl, isBlocked)) { + changed = true; + } + } + } + } + if(changed) { + pmHandle.mDirty |= pmHandle.DIRTY_WAKE_LOCKS; + pmHandle.updatePowerStateLocked(); + } + return changed; + } + + protected boolean updatePmsBlockedUidAllowed ( + int uid, boolean isBlocked + ) { + if (localLOGV) Slog.v(TAG, "updateBlockedUids: uid = " + uid + + "isBlocked = " + isBlocked); + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + if (localLOGV) Slog.v(TAG, "UpdateBlockedUids is not allowed"); + return true; + } + updatePmsBlockedUids(uid, isBlocked); + return false; + } + + private void updatePmsBlockedUids (int uid, boolean isBlocked) { + if(isBlocked) { + if (localLOGV) Slog.v(TAG, "adding powerMgr mPmBlockedUids "+ + "with uid "+ uid); + mPmsBlockedUids.add(new Integer(uid)); + } + else { + if (localLOGV) Slog.v(TAG, "clearing powerMgr mPmBlockedUids "); + mPmsBlockedUids.clear(); + } + } + + private boolean updatePmsBlockedWakelock ( + PowerManagerService.WakeLock wakeLock, boolean update + ) { + if (wakeLock != null && ((wakeLock.mFlags & + PowerManager.WAKE_LOCK_LEVEL_MASK + ) == PowerManager.PARTIAL_WAKE_LOCK )) { + if (wakeLock.mDisabled != update && pmHandle != null) { + wakeLock.mDisabled = update; + if (localLOGV) Slog.v(TAG, "updatePmsBlockWakelock pmHandle "+pmHandle); + if (wakeLock.mDisabled) { + // This wake lock is no longer being respected. + pmHandle.notifyWakeLockReleasedLocked(wakeLock); + } else { + pmHandle.notifyWakeLockAcquiredLocked(wakeLock); + } + return true; + } + else { + if (localLOGV) Slog.v(TAG, "updatePmsBlockWakelock pmHandle "+pmHandle ); + } + } + return false; + } +} + From c704fcf34179a6618e677d7486907f31556bda27 Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Thu, 9 Jul 2015 14:47:34 -0700 Subject: [PATCH 0055/1164] Camera: Add feature extensions This change includes below gerrits: # This is a combination of 7 commits. # The first commit's message is: Camera: Add support for QC camera features. Added APIs and keys for all QC features. This will enable application to get/set paramters. (cherrypicked from commit d0c5a0ee7e9af41320fed00ff324c6d0f22eb697) Change-Id: I68c23aaf7267645efeb4d4743b390a048292b7fd # This is the 2nd commit message: Camera: Adds support for meta data callbacks - This change adds a new type of callback that will be called when there are pending meta data notifications. Change-Id: I84f5cbafe4f023c7b0efa9ec8620756b0eaa428d # This is the 3rd commit message: Camera: Adds support for longshot configuration - The Camera API is extended with one additional call for longshot mode configuration. (cherrypicked from commit 867c4865b2a61a8e844e2784c41b7aafc392aec0 ) Change-Id: Idb91a21dc0d9fa9d22b4a6bbcc0b2eebfc2cb6db # This is the 4th commit message: Camera: Add support for manual 3A Add API for manual 3A (awb/af/aec). Change-Id: Ia5240207ce7a6628e8fdfef79f56db01add14aef # This is the 5th commit message: Camera: use single KEY for set/get manual 3A parameters. Instead of using different KEYs, we can share one same key, for set/get 3A parameters from APK. Change-Id: Ie3216ee4e1b8f62fcdd57a0be119d4b8dcdd81b3 # This is the 6th commit message: Framework: Adding support for Auto HDR Adding support for Auto HDR for camera CRs-fixed: 629556 Change-Id: Ie5e4718524d2ed799f1f9af1f76e89c01d743ac8 # This is the 7th commit message: Camera: Add support for video rotation Adding apis to support video rotation. CRs-Fixed: 672804 Change-Id: Ic67e82058824a6dc7cc803ef0efe61475350bafc Change-Id: Ideb191d666e7de8db132811f66a7796d87e75971 Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/hardware/Camera.java | 1480 ++++++++++++++++++++++++ core/jni/android_hardware_Camera.cpp | 82 +- 2 files changed, 1561 insertions(+), 1 deletion(-) diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 9350aab799a9..a0aef4808e83 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -163,6 +163,10 @@ public class Camera { private static final int CAMERA_MSG_RAW_IMAGE_NOTIFY = 0x200; private static final int CAMERA_MSG_PREVIEW_METADATA = 0x400; private static final int CAMERA_MSG_FOCUS_MOVE = 0x800; + /* ### QC ADD-ONS: START */ + private static final int CAMERA_MSG_STATS_DATA = 0x1000; + private static final int CAMERA_MSG_META_DATA = 0x2000; + /* ### QC ADD-ONS: END */ private long mNativeContext; // accessed by native methods private EventHandler mEventHandler; @@ -193,6 +197,17 @@ public class Camera { private boolean mShutterSoundEnabledFromApp = true; private static final int NO_ERROR = 0; + private static final int EACCESS = -13; + private static final int ENODEV = -19; + private static final int EBUSY = -16; + private static final int EINVAL = -22; + private static final int ENOSYS = -38; + private static final int EUSERS = -87; + private static final int EOPNOTSUPP = -95; + /* ### QC ADD-ONS: START */ + private CameraDataCallback mCameraDataCallback; + private CameraMetaDataCallback mCameraMetaDataCallback; + /* ### QC ADD-ONS: END */ /** * Broadcast Action: A new picture is taken by the camera, and the entry of @@ -317,6 +332,17 @@ public static class CameraInfo { */ public static final int CAMERA_FACING_FRONT = 1; + /* ### QC ADD-ONS: START TBD*/ + /** @hide + * camera is in ZSL mode. + */ + public static final int CAMERA_SUPPORT_MODE_ZSL = 2; + + /** @hide + * camera is in non-ZSL mode. + */ + public static final int CAMERA_SUPPORT_MODE_NONZSL = 3; + /* ### QC ADD-ONS: END */ /** * The direction that the camera faces. It should be * CAMERA_FACING_BACK or CAMERA_FACING_FRONT. @@ -502,6 +528,10 @@ private int cameraInitVersion(int cameraId, int halVersion) { mPostviewCallback = null; mUsingPreviewAllocation = false; mZoomListener = null; + /* ### QC ADD-ONS: START */ + mCameraDataCallback = null; + mCameraMetaDataCallback = null; + /* ### QC ADD-ONS: END */ Looper looper; if ((looper = Looper.myLooper()) != null) { @@ -1257,7 +1287,23 @@ public void handleMessage(Message msg) { mAutoFocusMoveCallback.onAutoFocusMoving(msg.arg1 == 0 ? false : true, mCamera); } return; + /* ### QC ADD-ONS: START */ + case CAMERA_MSG_STATS_DATA: + int statsdata[] = new int[257]; + for(int i =0; i<257; i++ ) { + statsdata[i] = byteToInt( (byte[])msg.obj, i*4); + } + if (mCameraDataCallback != null) { + mCameraDataCallback.onCameraData(statsdata, mCamera); + } + return; + case CAMERA_MSG_META_DATA: + if (mCameraMetaDataCallback != null) { + mCameraMetaDataCallback.onCameraMetaData((byte[])msg.obj, mCamera); + } + return; + /* ### QC ADD-ONS: END */ default: Log.e(TAG, "Unknown message type " + msg.what); return; @@ -2119,6 +2165,27 @@ public Parameters getParameters() { return p; } + /** @hide + * Returns the current cct value of white balance. + * + * If it's in AWB mode, cct is determined by stats/awb module. + * + * If it's in Manual WB mode, it actually returns cct value + * set by user via {@link #setParameters(Camera.Parameters)}. + */ + public int getWBCurrentCCT() { + Parameters p = new Parameters(); + String s = native_getParameters(); + p.unflatten(s); + + int cct = 0; + if (p.getWBCurrentCCT() != null) { + cct = Integer.parseInt(p.getWBCurrentCCT()); + } + + return cct; + } + /** * Returns an empty {@link Parameters} for testing purpose. * @@ -2131,6 +2198,157 @@ public static Parameters getEmptyParameters() { return camera.new Parameters(); } + /* ### QC ADD-ONS: START */ + private static int byteToInt(byte[] b, int offset) { + int value = 0; + for (int i = 0; i < 4; i++) { + int shift = (4 - 1 - i) * 8; + value += (b[(3-i) + offset] & 0x000000FF) << shift; + } + return value; + } + /** @hide + * Handles the callback for when Camera Data is available. + * data is read from the camera. + */ + public interface CameraDataCallback { + /** + * Callback for when camera data is available. + * + * @param data a int array of the camera data + * @param camera the Camera service object + */ + void onCameraData(int[] data, Camera camera); + }; + + /** @hide + * Set camera histogram mode and registers a callback function to run. + * Only valid after startPreview() has been called. + * + * @param cb the callback to run + */ + public final void setHistogramMode(CameraDataCallback cb) + { + mCameraDataCallback = cb; + native_setHistogramMode(cb!=null); + } + private native final void native_setHistogramMode(boolean mode); + + /** @hide + * Set camera histogram command to send data. + * + */ + public final void sendHistogramData() + { + native_sendHistogramData(); + } + private native final void native_sendHistogramData(); + + /** @hide + * Handles the callback for when Camera Meta Data is available. + * Meta data is read from the camera. + */ + public interface CameraMetaDataCallback { + /** + * Callback for when camera meta data is available. + * + * @param data a byte array of the camera meta data + * @param camera the Camera service object + */ + void onCameraMetaData(byte[] data, Camera camera); + }; + + /** @hide + * Set camera meta data and registers a callback function to run. + * Only valid after startPreview() has been called. + * + * @param cb the callback to run + */ + public final void setMetadataCb(CameraMetaDataCallback cb) + { + mCameraMetaDataCallback = cb; + native_setMetadataCb(cb!=null); + } + private native final void native_setMetadataCb(boolean mode); + + /** @hide + * Set camera face detection command to send meta data. + */ + public final void sendMetaData() + { + native_sendMetaData(); + } + private native final void native_sendMetaData(); + + /** @hide + * Configure longshot mode. Available only in ZSL. + * + * @param enable enable/disable this mode + */ + public final void setLongshot(boolean enable) + { + native_setLongshot(enable); + } + private native final void native_setLongshot(boolean enable); + + /** @hide + * Handles the Touch Co-ordinate. + */ + public class Coordinate { + /** + * Sets the x,y co-ordinates for a touch event + * + * @param x the x co-ordinate (pixels) + * @param y the y co-ordinate (pixels) + */ + public Coordinate(int x, int y) { + xCoordinate = x; + yCoordinate = y; + } + /** + * Compares {@code obj} to this co-ordinate. + * + * @param obj the object to compare this co-ordinate with. + * @return {@code true} if the xCoordinate and yCoordinate of {@code obj} is the + * same as those of this coordinate. {@code false} otherwise. + */ + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Coordinate)) { + return false; + } + Coordinate c = (Coordinate) obj; + return xCoordinate == c.xCoordinate && yCoordinate == c.yCoordinate; + } + + /** x co-ordinate for the touch event*/ + public int xCoordinate; + + /** y co-ordinate for the touch event */ + public int yCoordinate; + }; + + /** @hide + * Returns the current focus position. + * + * If it's in AF mode, it's the lens position after af is done. + * + * If it's in Manual Focus mode, it actually returns the value + * set by user via {@link #setParameters(Camera.Parameters)}. + */ + public int getCurrentFocusPosition() { + Parameters p = new Parameters(); + String s = native_getParameters(); + p.unflatten(s); + + int focus_pos = -1; + if (p.getCurrentFocusPosition() != null) { + focus_pos = Integer.parseInt(p.getCurrentFocusPosition()); + } + return focus_pos; + } + + /* ### QC ADD-ONS: END */ /** * Returns a copied {@link Parameters}; for shim use only. * @@ -2378,6 +2596,10 @@ public class Parameters { public static final String WHITE_BALANCE_CLOUDY_DAYLIGHT = "cloudy-daylight"; public static final String WHITE_BALANCE_TWILIGHT = "twilight"; public static final String WHITE_BALANCE_SHADE = "shade"; + /** @hide + * wb manual cct mode. + */ + public static final String WHITE_BALANCE_MANUAL_CCT = "manual-cct"; // Values for color effect settings. public static final String EFFECT_NONE = "none"; @@ -2425,6 +2647,11 @@ public class Parameters { */ public static final String FLASH_MODE_TORCH = "torch"; + /** @hide + * Scene mode is off. + */ + public static final String SCENE_MODE_ASD = "asd"; + /** * Scene mode is off. */ @@ -2501,6 +2728,14 @@ public class Parameters { * Capture the naturally warm color of scenes lit by candles. */ public static final String SCENE_MODE_CANDLELIGHT = "candlelight"; + /** @hide + * SCENE_MODE_BACKLIGHT + **/ + public static final String SCENE_MODE_BACKLIGHT = "backlight"; + /** @hide + * SCENE_MODE_FLOWERS + **/ + public static final String SCENE_MODE_FLOWERS = "flowers"; /** * Applications are looking for a barcode. Camera driver will be @@ -2543,6 +2778,13 @@ public class Parameters { */ public static final String FOCUS_MODE_FIXED = "fixed"; + /** @hide + * Normal focus mode. Applications should call + * {@link #autoFocus(AutoFocusCallback)} to start the focus in this + * mode. + */ + public static final String FOCUS_MODE_NORMAL = "normal"; + /** * Extended depth of field (EDOF). Focusing is done digitally and * continuously. Applications should not call {@link @@ -2595,6 +2837,11 @@ public class Parameters { */ public static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture"; + /** @hide + * manual focus mode + */ + public static final String FOCUS_MODE_MANUAL_POSITION = "manual"; + // Indices for focus distance array. /** * The array index of near focus distance for use with @@ -2631,11 +2878,15 @@ public class Parameters { // Formats for setPreviewFormat and setPictureFormat. private static final String PIXEL_FORMAT_YUV422SP = "yuv422sp"; private static final String PIXEL_FORMAT_YUV420SP = "yuv420sp"; + private static final String PIXEL_FORMAT_YUV420SP_ADRENO = "yuv420sp-adreno"; private static final String PIXEL_FORMAT_YUV422I = "yuv422i-yuyv"; private static final String PIXEL_FORMAT_YUV420P = "yuv420p"; private static final String PIXEL_FORMAT_RGB565 = "rgb565"; private static final String PIXEL_FORMAT_JPEG = "jpeg"; private static final String PIXEL_FORMAT_BAYER_RGGB = "bayer-rggb"; + private static final String PIXEL_FORMAT_RAW = "raw"; + private static final String PIXEL_FORMAT_YV12 = "yv12"; + private static final String PIXEL_FORMAT_NV12 = "nv12"; /** * Order matters: Keys that are {@link #set(String, String) set} later @@ -3423,8 +3674,11 @@ public void setGpsProcessingMethod(String processing_method) { * parameters. */ public void removeGpsData() { + remove(KEY_QC_GPS_LATITUDE_REF); remove(KEY_GPS_LATITUDE); + remove(KEY_QC_GPS_LONGITUDE_REF); remove(KEY_GPS_LONGITUDE); + remove(KEY_QC_GPS_ALTITUDE_REF); remove(KEY_GPS_ALTITUDE); remove(KEY_GPS_TIMESTAMP); remove(KEY_GPS_PROCESSING_METHOD); @@ -4447,5 +4701,1231 @@ private boolean same(String s1, String s2) { if (s1 != null && s1.equals(s2)) return true; return false; } + /* ### QC ADD-ONS: START */ + + /* ### QC ADDED PARAMETER KEYS*/ + private static final String KEY_QC_HFR_SIZE = "hfr-size"; + private static final String KEY_QC_PREVIEW_FRAME_RATE_MODE = "preview-frame-rate-mode"; + private static final String KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE = "frame-rate-auto"; + private static final String KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE = "frame-rate-fixed"; + private static final String KEY_QC_GPS_LATITUDE_REF = "gps-latitude-ref"; + private static final String KEY_QC_GPS_LONGITUDE_REF = "gps-longitude-ref"; + private static final String KEY_QC_GPS_ALTITUDE_REF = "gps-altitude-ref"; + private static final String KEY_QC_GPS_STATUS = "gps-status"; + private static final String KEY_QC_EXIF_DATETIME = "exif-datetime"; + private static final String KEY_QC_TOUCH_AF_AEC = "touch-af-aec"; + private static final String KEY_QC_TOUCH_INDEX_AEC = "touch-index-aec"; + private static final String KEY_QC_TOUCH_INDEX_AF = "touch-index-af"; + private static final String KEY_QC_MANUAL_FOCUS_POSITION = "manual-focus-position"; + private static final String KEY_QC_MANUAL_FOCUS_POS_TYPE = "manual-focus-pos-type"; + private static final String KEY_QC_SCENE_DETECT = "scene-detect"; + private static final String KEY_QC_ISO_MODE = "iso"; + private static final String KEY_QC_EXPOSURE_TIME = "exposure-time"; + private static final String KEY_QC_MIN_EXPOSURE_TIME = "min-exposure-time"; + private static final String KEY_QC_MAX_EXPOSURE_TIME = "max-exposure-time"; + private static final String KEY_QC_LENSSHADE = "lensshade"; + private static final String KEY_QC_HISTOGRAM = "histogram"; + private static final String KEY_QC_SKIN_TONE_ENHANCEMENT = "skinToneEnhancement"; + private static final String KEY_QC_AUTO_EXPOSURE = "auto-exposure"; + private static final String KEY_QC_SHARPNESS = "sharpness"; + private static final String KEY_QC_MAX_SHARPNESS = "max-sharpness"; + private static final String KEY_QC_CONTRAST = "contrast"; + private static final String KEY_QC_MAX_CONTRAST = "max-contrast"; + private static final String KEY_QC_SATURATION = "saturation"; + private static final String KEY_QC_MAX_SATURATION = "max-saturation"; + private static final String KEY_QC_DENOISE = "denoise"; + private static final String KEY_QC_CONTINUOUS_AF = "continuous-af"; + private static final String KEY_QC_SELECTABLE_ZONE_AF = "selectable-zone-af"; + private static final String KEY_QC_FACE_DETECTION = "face-detection"; + private static final String KEY_QC_MEMORY_COLOR_ENHANCEMENT = "mce"; + private static final String KEY_QC_REDEYE_REDUCTION = "redeye-reduction"; + private static final String KEY_QC_ZSL = "zsl"; + private static final String KEY_QC_CAMERA_MODE = "camera-mode"; + private static final String KEY_QC_VIDEO_HIGH_FRAME_RATE = "video-hfr"; + private static final String KEY_QC_VIDEO_HDR = "video-hdr"; + private static final String KEY_QC_POWER_MODE = "power-mode"; + private static final String KEY_QC_POWER_MODE_SUPPORTED = "power-mode-supported"; + private static final String KEY_QC_WB_MANUAL_CCT = "wb-manual-cct"; + private static final String KEY_QC_MIN_WB_CCT = "min-wb-cct"; + private static final String KEY_QC_MAX_WB_CCT = "max-wb-cct"; + private static final String KEY_QC_AUTO_HDR_ENABLE = "auto-hdr-enable"; + private static final String KEY_QC_VIDEO_ROTATION = "video-rotation"; + + /** @hide + * KEY_QC_AE_BRACKET_HDR + **/ + public static final String KEY_QC_AE_BRACKET_HDR = "ae-bracket-hdr"; + + /* ### QC ADDED PARAMETER VALUES*/ + + // Values for touch af/aec settings. + /** @hide + * TOUCH_AF_AEC_OFF + **/ + public static final String TOUCH_AF_AEC_OFF = "touch-off"; + /** @hide + * TOUCH_AF_AEC_ON + **/ + public static final String TOUCH_AF_AEC_ON = "touch-on"; + + // Values for auto exposure settings. + /** @hide + * Auto exposure frame-avg + **/ + public static final String AUTO_EXPOSURE_FRAME_AVG = "frame-average"; + /** @hide + * Auto exposure center weighted + **/ + public static final String AUTO_EXPOSURE_CENTER_WEIGHTED = "center-weighted"; + /** @hide + * Auto exposure spot metering + **/ + public static final String AUTO_EXPOSURE_SPOT_METERING = "spot-metering"; + + //Values for ISO settings + /** @hide + * ISO_AUTO + **/ + public static final String ISO_AUTO = "auto"; + /** @hide + * ISO_HJR + **/ + public static final String ISO_HJR = "ISO_HJR"; + /** @hide + * ISO_100 + **/ + public static final String ISO_100 = "ISO100"; + /** @hide + * ISO_200 + **/ + public static final String ISO_200 = "ISO200"; + /** @hide + * ISO_400 + **/ + public static final String ISO_400 = "ISO400"; + /** @hide + * ISO_800 + **/ + public static final String ISO_800 = "ISO800"; + /** @hide + * ISO_1600 + **/ + public static final String ISO_1600 = "ISO1600"; + + /** @hide + * ISO_3200 + **/ + public static final String ISO_3200 = "ISO3200"; + + //Values for Lens Shading + /** @hide + * LENSSHADE_ENABLE + **/ + public static final String LENSSHADE_ENABLE = "enable"; + /** @hide + * LENSSHADE_DISABLE + **/ + public static final String LENSSHADE_DISABLE= "disable"; + + //Values for Histogram + /** @hide + * Histogram enable + **/ + public static final String HISTOGRAM_ENABLE = "enable"; + /** @hide + * Histogram disable + **/ + public static final String HISTOGRAM_DISABLE= "disable"; + + //Values for Skin Tone Enhancement + /** @hide + * SKIN_TONE_ENHANCEMENT_ENABLE + **/ + public static final String SKIN_TONE_ENHANCEMENT_ENABLE = "enable"; + /** @hide + * SKIN_TONE_ENHANCEMENT_DISABLE + **/ + public static final String SKIN_TONE_ENHANCEMENT_DISABLE= "disable"; + + // Values for MCE settings. + /** @hide + * MCE_ENaBLE + **/ + public static final String MCE_ENABLE = "enable"; + /** @hide + * MCE_DISABLE + **/ + public static final String MCE_DISABLE = "disable"; + + // Values for ZSL settings. + /** @hide + * ZSL_ON + **/ + public static final String ZSL_ON = "on"; + /** @hide + * ZSL_OFF + **/ + public static final String ZSL_OFF = "off"; + + // Values for HDR Bracketing settings. + + /** @hide + * AEC bracketing off + **/ + public static final String AE_BRACKET_HDR_OFF = "Off"; + /** @hide + * AEC bracketing hdr + **/ + public static final String AE_BRACKET_HDR = "HDR"; + /** @hide + * AEC bracketing aec-bracket + **/ + public static final String AE_BRACKET = "AE-Bracket"; + + // Values for Power mode. + /** @hide + * LOW_POWER + **/ + public static final String LOW_POWER = "Low_Power"; + /** @hide + * NORMAL_POWER + **/ + public static final String NORMAL_POWER = "Normal_Power"; + + // Values for HFR settings. + /** @hide + * VIDEO_HFR_OFF + **/ + public static final String VIDEO_HFR_OFF = "off"; + /** @hide + * VIDEO_HFR_2X + **/ + public static final String VIDEO_HFR_2X = "60"; + /** @hide + * VIDEO_HFR_3X + **/ + public static final String VIDEO_HFR_3X = "90"; + /** @hide + * VIDEO_HFR_4X + **/ + public static final String VIDEO_HFR_4X = "120"; + + // Values for auto scene detection settings. + /** @hide + * SCENE_DETECT_OFF + **/ + public static final String SCENE_DETECT_OFF = "off"; + /** @hide + * SCENE_DETECT_ON + **/ + public static final String SCENE_DETECT_ON = "on"; + + //Values for Continuous AF + + /** @hide + * CAF off + **/ + public static final String CONTINUOUS_AF_OFF = "caf-off"; + /** @hide + * CAF on + **/ + public static final String CONTINUOUS_AF_ON = "caf-on"; + /** @hide + * Denoise off + **/ + public static final String DENOISE_OFF = "denoise-off"; + /** @hide + * Denoise on + **/ + public static final String DENOISE_ON = "denoise-on"; + + // Values for Redeye Reduction settings. + /** @hide + * REDEYE_REDUCTION_ENABLE + **/ + public static final String REDEYE_REDUCTION_ENABLE = "enable"; + /** @hide + * REDEYE_REDUCTION_DISABLE + **/ + public static final String REDEYE_REDUCTION_DISABLE = "disable"; + + // Values for selectable zone af settings. + /** @hide + * SELECTABLE_ZONE_AF_AUTO + **/ + public static final String SELECTABLE_ZONE_AF_AUTO = "auto"; + /** @hide + * SELECTABLE_ZONE_AF_SPOTMETERING + **/ + public static final String SELECTABLE_ZONE_AF_SPOTMETERING = "spot-metering"; + /** @hide + * SELECTABLE_ZONE_AF_CENTER_WEIGHTED + **/ + public static final String SELECTABLE_ZONE_AF_CENTER_WEIGHTED = "center-weighted"; + /** @hide + * SELECTABLE_ZONE_AF_FRAME_AVERAGE + **/ + public static final String SELECTABLE_ZONE_AF_FRAME_AVERAGE = "frame-average"; + + // Values for Face Detection settings. + /** @hide + * Face Detection off + **/ + public static final String FACE_DETECTION_OFF = "off"; + /** @hide + * Face Detction on + **/ + public static final String FACE_DETECTION_ON = "on"; + + // Values for video rotation settings. + + /** @hide + * VIDEO_ROTATION_0 + **/ + public static final String VIDEO_ROTATION_0 = "0"; + /** @hide + * VIDEO_ROTATION_90 + **/ + public static final String VIDEO_ROTATION_90 = "90"; + /** @hide + * VIDEO_ROTATION_180 + **/ + public static final String VIDEO_ROTATION_180 = "180"; + /** @hide + * VIDEO_ROTATION_270 + **/ + public static final String VIDEO_ROTATION_270 = "270"; + + /* ### QC ADDED PARAMETER APIS*/ + /** @hide + * Gets the supported preview sizes in high frame rate recording mode. + * + * @return a list of Size object. This method will always return a list + * with at least one element. + */ + public List getSupportedHfrSizes() { + String str = get(KEY_QC_HFR_SIZE + SUPPORTED_VALUES_SUFFIX); + return splitSize(str); + } + + /** @hide + * Gets the supported Touch AF/AEC setting. + * + * @return a List of TOUCH_AF_AEC_XXX string constants. null if TOUCH AF/AEC + * setting is not supported. + * + */ + public List getSupportedTouchAfAec() { + String str = get(KEY_QC_TOUCH_AF_AEC + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** + * Gets the supported Touch AF/AEC setting. + * + * @return a List of TOUCH_AF_AEC_XXX string constants. null if TOUCH AF/AEC + * setting is not supported. + * + */ + + /** @hide + * Gets the supported frame rate modes. + * + * @return a List of FRAME_RATE_XXX_MODE string constant. null if this + * setting is not supported. + */ + public List getSupportedPreviewFrameRateModes() { + String str = get(KEY_QC_PREVIEW_FRAME_RATE_MODE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported auto scene detection modes. + * + * @return a List of SCENE_DETECT_XXX string constant. null if scene detection + * setting is not supported. + * + */ + public List getSupportedSceneDetectModes() { + String str = get(KEY_QC_SCENE_DETECT + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported ISO values. + * + * @return a List of FLASH_MODE_XXX string constants. null if flash mode + * setting is not supported. + */ + public List getSupportedIsoValues() { + String str = get(KEY_QC_ISO_MODE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Lensshade modes. + * + * @return a List of LENS_MODE_XXX string constants. null if lens mode + * setting is not supported. + */ + public List getSupportedLensShadeModes() { + String str = get(KEY_QC_LENSSHADE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Histogram modes. + * + * @return a List of HISTOGRAM_XXX string constants. null if histogram mode + * setting is not supported. + */ + public List getSupportedHistogramModes() { + String str = get(KEY_QC_HISTOGRAM + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Skin Tone Enhancement modes. + * + * @return a List of SKIN_TONE_ENHANCEMENT_XXX string constants. null if skin tone enhancement + * setting is not supported. + */ + public List getSupportedSkinToneEnhancementModes() { + String str = get(KEY_QC_SKIN_TONE_ENHANCEMENT + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported auto exposure setting. + * + * @return a List of AUTO_EXPOSURE_XXX string constants. null if auto exposure + * setting is not supported. + */ + public List getSupportedAutoexposure() { + String str = get(KEY_QC_AUTO_EXPOSURE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported MCE modes. + * + * @return a List of MCE_ENABLE/DISABLE string constants. null if MCE mode + * setting is not supported. + */ + public List getSupportedMemColorEnhanceModes() { + String str = get(KEY_QC_MEMORY_COLOR_ENHANCEMENT + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported ZSL modes. + * + * @return a List of ZSL_OFF/OFF string constants. null if ZSL mode + * setting is not supported. + */ + public List getSupportedZSLModes() { + String str = get(KEY_QC_ZSL + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Video HDR modes. + * + * @return a List of Video HDR_OFF/OFF string constants. null if + * Video HDR mode setting is not supported. + */ + public List getSupportedVideoHDRModes() { + String str = get(KEY_QC_VIDEO_HDR + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported HFR modes. + * + * @return a List of VIDEO_HFR_XXX string constants. null if hfr mode + * setting is not supported. + */ + public List getSupportedVideoHighFrameRateModes() { + String str = get(KEY_QC_VIDEO_HIGH_FRAME_RATE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Continuous AF modes. + * + * @return a List of CONTINUOUS_AF_XXX string constant. null if continuous AF + * setting is not supported. + * + */ + public List getSupportedContinuousAfModes() { + String str = get(KEY_QC_CONTINUOUS_AF + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported DENOISE modes. + * + * @return a List of DENOISE_XXX string constant. null if DENOISE + * setting is not supported. + * + */ + public List getSupportedDenoiseModes() { + String str = get(KEY_QC_DENOISE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported selectable zone af setting. + * + * @return a List of SELECTABLE_ZONE_AF_XXX string constants. null if selectable zone af + * setting is not supported. + */ + public List getSupportedSelectableZoneAf() { + String str = get(KEY_QC_SELECTABLE_ZONE_AF + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported face detection modes. + * + * @return a List of FACE_DETECTION_XXX string constant. null if face detection + * setting is not supported. + * + */ + public List getSupportedFaceDetectionModes() { + String str = get(KEY_QC_FACE_DETECTION + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported redeye reduction modes. + * + * @return a List of REDEYE_REDUCTION_XXX string constant. null if redeye reduction + * setting is not supported. + * + */ + public List getSupportedRedeyeReductionModes() { + String str = get(KEY_QC_REDEYE_REDUCTION + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Sets GPS altitude reference. This will be stored in JPEG EXIF header. + * @param altRef reference GPS altitude in meters. + */ + public void setGpsAltitudeRef(double altRef) { + set(KEY_QC_GPS_ALTITUDE_REF, Double.toString(altRef)); + } + + /** @hide + * Sets GPS Status. This will be stored in JPEG EXIF header. + * + * @param status GPS status (UTC in seconds since January 1, + * 1970). + */ + public void setGpsStatus(double status) { + set(KEY_QC_GPS_STATUS, Double.toString(status)); + } + + /** @hide + * Sets the touch co-ordinate for Touch AEC. + * + * @param x the x co-ordinate of the touch event + * @param y the y co-ordinate of the touch event + * + */ + public void setTouchIndexAec(int x, int y) { + String v = Integer.toString(x) + "x" + Integer.toString(y); + set(KEY_QC_TOUCH_INDEX_AEC, v); + } + + /** @hide + * Returns the touch co-ordinates of the touch event. + * + * @return a Index object with the x and y co-ordinated + * for the touch event + * + */ + public Coordinate getTouchIndexAec() { + String pair = get(KEY_QC_TOUCH_INDEX_AEC); + return strToCoordinate(pair); + } + + /** @hide + * Sets the touch co-ordinate for Touch AF. + * + * @param x the x co-ordinate of the touch event + * @param y the y co-ordinate of the touch event + * + */ + public void setTouchIndexAf(int x, int y) { + String v = Integer.toString(x) + "x" + Integer.toString(y); + set(KEY_QC_TOUCH_INDEX_AF, v); + } + + /** @hide + * Returns the touch co-ordinates of the touch event. + * + * @return a Index object with the x and y co-ordinated + * for the touch event + * + */ + public Coordinate getTouchIndexAf() { + String pair = get(KEY_QC_TOUCH_INDEX_AF); + return strToCoordinate(pair); + } + /** @hide + * Set Sharpness Level + * + * @param sharpness level + */ + public void setSharpness(int sharpness){ + if((sharpness < 0) || (sharpness > getMaxSharpness()) ) + throw new IllegalArgumentException( + "Invalid Sharpness " + sharpness); + + set(KEY_QC_SHARPNESS, String.valueOf(sharpness)); + } + + /** @hide + * Set Contrast Level + * + * @param contrast level + */ + public void setContrast(int contrast){ + if((contrast < 0 ) || (contrast > getMaxContrast())) + throw new IllegalArgumentException( + "Invalid Contrast " + contrast); + + set(KEY_QC_CONTRAST, String.valueOf(contrast)); + } + + /** @hide + * Set Saturation Level + * + * @param saturation level + */ + public void setSaturation(int saturation){ + if((saturation < 0 ) || (saturation > getMaxSaturation())) + throw new IllegalArgumentException( + "Invalid Saturation " + saturation); + + set(KEY_QC_SATURATION, String.valueOf(saturation)); + } + + /** @hide + * @return true if full size video snapshot is supported. + */ + public boolean isPowerModeSupported() { + String str = get(KEY_QC_POWER_MODE_SUPPORTED); + return TRUE.equals(str); + } + + /** @hide + * Get Sharpness level + * + * @return sharpness level + */ + public int getSharpness(){ + return getInt(KEY_QC_SHARPNESS); + } + + /** @hide + * Get Max Sharpness Level + * + * @return max sharpness level + */ + public int getMaxSharpness(){ + return getInt(KEY_QC_MAX_SHARPNESS); + } + + /** @hide + * Get Contrast level + * + * @return contrast level + */ + public int getContrast(){ + return getInt(KEY_QC_CONTRAST); + } + + /** @hide + * Get Max Contrast Level + * + * @return max contrast level + */ + public int getMaxContrast(){ + return getInt(KEY_QC_MAX_CONTRAST); + } + + /** @hide + * Get Saturation level + * + * @return saturation level + */ + public int getSaturation(){ + return getInt(KEY_QC_SATURATION); + } + + /** @hide + * Get Max Saturation Level + * + * @return max contrast level + */ + public int getMaxSaturation(){ + return getInt(KEY_QC_MAX_SATURATION); + } + + /** @hide + * Sets GPS latitude reference coordinate. This will be stored in JPEG EXIF + * header. + * @param latRef GPS latitude reference coordinate. + */ + public void setGpsLatitudeRef(String latRef) { + set(KEY_QC_GPS_LATITUDE_REF, latRef); + } + + /** @hide + * Sets GPS longitude reference coordinate. This will be stored in JPEG EXIF + * header. + * @param lonRef GPS longitude reference coordinate. + */ + public void setGpsLongitudeRef(String lonRef) { + set(KEY_QC_GPS_LONGITUDE_REF, lonRef); + } + + /** @hide + * Sets system timestamp. This will be stored in JPEG EXIF header. + * + * @param dateTime current timestamp (UTC in seconds since January 1, + * 1970). + */ + public void setExifDateTime(String dateTime) { + set(KEY_QC_EXIF_DATETIME, dateTime); + } + + /** @hide + * Gets the current Touch AF/AEC setting. + * + * @return one of TOUCH_AF_AEC_XXX string constant. null if Touch AF/AEC + * setting is not supported. + * + */ + public String getTouchAfAec() { + return get(KEY_QC_TOUCH_AF_AEC); + } + + /** @hide + * Sets the current TOUCH AF/AEC setting. + * + * @param value TOUCH_AF_AEC_XXX string constants. + * + */ + public void setTouchAfAec(String value) { + set(KEY_QC_TOUCH_AF_AEC, value); + } + + /** @hide + * Gets the current redeye reduction setting. + * + * @return one of REDEYE_REDUCTION_XXX string constant. null if redeye reduction + * setting is not supported. + * + */ + public String getRedeyeReductionMode() { + return get(KEY_QC_REDEYE_REDUCTION); + } + + /** @hide + * Sets the redeye reduction. Other parameters may be changed after changing + * redeye reduction. After setting redeye reduction, + * applications should call getParameters to know if some parameters are + * changed. + * + * @param value REDEYE_REDUCTION_XXX string constants. + * + */ + public void setRedeyeReductionMode(String value) { + set(KEY_QC_REDEYE_REDUCTION, value); + } + + /** @hide + * Gets the frame rate mode setting. + * + * @return one of FRAME_RATE_XXX_MODE string constant. null if this + * setting is not supported. + */ + public String getPreviewFrameRateMode() { + return get(KEY_QC_PREVIEW_FRAME_RATE_MODE); + } + + /** @hide + * Sets the frame rate mode. + * + * @param value FRAME_RATE_XXX_MODE string constants. + */ + public void setPreviewFrameRateMode(String value) { + set(KEY_QC_PREVIEW_FRAME_RATE_MODE, value); + } + + /** @hide + * Gets the current auto scene detection setting. + * + * @return one of SCENE_DETECT_XXX string constant. null if auto scene detection + * setting is not supported. + * + */ + public String getSceneDetectMode() { + return get(KEY_QC_SCENE_DETECT); + } + + /** @hide + * Sets the auto scene detect. Other parameters may be changed after changing + * scene detect. After setting auto scene detection, + * applications should call getParameters to know if some parameters are + * changed. + * + * @param value SCENE_DETECT_XXX string constants. + * + */ + public void setSceneDetectMode(String value) { + set(KEY_QC_SCENE_DETECT, value); + } + + /** @hide + * Gets the current hdr bracketing mode setting. + * + * @return current hdr bracketing mode. + * @see #KEY_AE_BRACKET_OFF + * @see #KEY_AE_BRACKET_HDR + * @see #KEY_AE_BRACKET_BRACKATING + */ + public String getAEBracket() { + return get(KEY_QC_AE_BRACKET_HDR); + } + + /** @hide + * Sets the Power mode. + * + * @param value Power mode. + * @see #getPowerMode() + */ + public void setPowerMode(String value) { + set(KEY_QC_POWER_MODE, value); + } + + /** @hide + * Gets the current power mode setting. + * + * @return current power mode. null if power mode setting is not + * supported. + * @see #POWER_MODE_LOW + * @see #POWER_MODE_NORMAL + */ + public String getPowerMode() { + return get(KEY_QC_POWER_MODE); + } + + /** @hide + * Set HDR-Bracketing Level + * + * @param value HDR-Bracketing + */ + public void setAEBracket(String value){ + set(KEY_QC_AE_BRACKET_HDR, value); + } + + /** @hide + * Gets the current ISO setting. + * + * @return one of ISO_XXX string constant. null if ISO + * setting is not supported. + */ + public String getISOValue() { + return get(KEY_QC_ISO_MODE); + } + + /** @hide + * Sets the ISO. + * + * @param iso ISO_XXX string constant. + */ + public void setISOValue(String iso) { + set(KEY_QC_ISO_MODE, iso); + } + + /** @hide + * Sets the exposure time. + * + * @param value exposure time. + */ + public void setExposureTime(int value) { + set(KEY_QC_EXPOSURE_TIME, Integer.toString(value)); + } + + /** @hide + * Gets the current exposure time. + * + * @return exposure time. + */ + public String getExposureTime() { + return get(KEY_QC_EXPOSURE_TIME); + } + + /** @hide + * Gets the min supported exposure time. + * + * @return min supported exposure time. + */ + public String getMinExposureTime() { + return get(KEY_QC_MIN_EXPOSURE_TIME); + } + + /** @hide + * Gets the max supported exposure time. + * + * @return max supported exposure time. + */ + public String getMaxExposureTime() { + return get(KEY_QC_MAX_EXPOSURE_TIME); + } + + /** @hide + * Gets the current LensShade Mode. + * + * @return LensShade Mode + */ + public String getLensShade() { + return get(KEY_QC_LENSSHADE); + } + + /** @hide + * Sets the current LensShade Mode. + * + * @return LensShade Mode + */ + public void setLensShade(String lensshade) { + set(KEY_QC_LENSSHADE, lensshade); + } + + /** @hide + * Gets the current auto exposure setting. + * + * @return one of AUTO_EXPOSURE_XXX string constant. null if auto exposure + * setting is not supported. + */ + public String getAutoExposure() { + return get(KEY_QC_AUTO_EXPOSURE); + } + + /** @hide + * Sets the current auto exposure setting. + * + * @param value AUTO_EXPOSURE_XXX string constants. + */ + public void setAutoExposure(String value) { + set(KEY_QC_AUTO_EXPOSURE, value); + } + + /** @hide + * Gets the current MCE Mode. + * + * @return MCE value + */ + public String getMemColorEnhance() { + return get(KEY_QC_MEMORY_COLOR_ENHANCEMENT); + } + + /** @hide + * Sets the current MCE Mode. + * + * @return MCE Mode + */ + public void setMemColorEnhance(String mce) { + set(KEY_QC_MEMORY_COLOR_ENHANCEMENT, mce); + } + + /** @hide + * Set white balance manual cct value. + * + * @param cct user CCT setting. + */ + public void setWBManualCCT(int cct) { + set(KEY_QC_WB_MANUAL_CCT, Integer.toString(cct)); + } + + /** @hide + * Gets the WB min supported CCT. + * + * @return min cct value. + */ + public String getWBMinCCT() { + return get(KEY_QC_MIN_WB_CCT); + } + + /** @hide + * Gets the WB max supported CCT. + * + * @return max cct value. + */ + public String getMaxWBCCT() { + return get(KEY_QC_MAX_WB_CCT); + } + + /** @hide + * Gets the current WB CCT. + * + * @return CCT value + */ + public String getWBCurrentCCT() { + return get(KEY_QC_WB_MANUAL_CCT); + } + + /** @hide + * Gets the current ZSL Mode. + * + * @return ZSL mode value + */ + public String getZSLMode() { + return get(KEY_QC_ZSL); + } + + /** @hide + * Sets the current ZSL Mode. ZSL mode is set as a 0th bit in KEY_CAMERA_MODE. + * + * @return null + */ + public void setZSLMode(String zsl) { + set(KEY_QC_ZSL, zsl); + } + + /** @hide + * Sets the current Auto HDR Mode. + * @ auto_hdr auto hdr string for enable/disable + * @return null + */ + public void setAutoHDRMode(String auto_hdr){ + set(KEY_QC_AUTO_HDR_ENABLE,auto_hdr); + } + + /** @hide + * Gets the current Camera Mode Flag. Camera mode includes a + * flag(byte) which indicates different camera modes. + * For now support for ZSL added at bit0 + * + * @return Camera Mode. + */ + public String getCameraMode() { + return get(KEY_QC_CAMERA_MODE); + } + + /** @hide + * Sets the current Camera Mode. + * + * @return null + */ + public void setCameraMode(int cameraMode) { + set(KEY_QC_CAMERA_MODE, cameraMode); + } + + private static final int MANUAL_FOCUS_POS_TYPE_INDEX = 0; + private static final int MANUAL_FOCUS_POS_TYPE_DAC = 1; + /** @hide + * Set focus position. + * + * @param pos user setting of focus position. + */ + public void setFocusPosition(int type, int pos) { + set(KEY_QC_MANUAL_FOCUS_POS_TYPE, Integer.toString(type)); + set(KEY_QC_MANUAL_FOCUS_POSITION, Integer.toString(pos)); + } + + /** @hide + * Gets the current focus position. + * + * @return current focus position + */ + public String getCurrentFocusPosition() { + return get(KEY_QC_MANUAL_FOCUS_POSITION); + } + + + /** @hide + * Gets the current HFR Mode. + * + * @return VIDEO_HFR_XXX string constants + */ + public String getVideoHighFrameRate() { + return get(KEY_QC_VIDEO_HIGH_FRAME_RATE); + } + + /** @hide + * Sets the current HFR Mode. + * + * @param hfr VIDEO_HFR_XXX string constants + */ + public void setVideoHighFrameRate(String hfr) { + set(KEY_QC_VIDEO_HIGH_FRAME_RATE, hfr); + } + + /** @hide + * Gets the current Video HDR Mode. + * + * @return Video HDR mode value + */ + public String getVideoHDRMode() { + return get(KEY_QC_VIDEO_HDR); + } + + /** @hide + * Sets the current Video HDR Mode. + * + * @return null + */ + public void setVideoHDRMode(String videohdr) { + set(KEY_QC_VIDEO_HDR, videohdr); + } + + /** @hide + * Gets the current DENOISE setting. + * + * @return one of DENOISE_XXX string constant. null if Denoise + * setting is not supported. + * + */ + public String getDenoise() { + return get(KEY_QC_DENOISE); + } + + /** @hide + * Gets the current Continuous AF setting. + * + * @return one of CONTINUOUS_AF_XXX string constant. null if continuous AF + * setting is not supported. + * + */ + public String getContinuousAf() { + return get(KEY_QC_CONTINUOUS_AF); + } + + /** @hide + * Sets the current Denoise mode. + * @param value DENOISE_XXX string constants. + * + */ + + public void setDenoise(String value) { + set(KEY_QC_DENOISE, value); + } + + /** @hide + * Sets the current Continuous AF mode. + * @param value CONTINUOUS_AF_XXX string constants. + * + */ + public void setContinuousAf(String value) { + set(KEY_QC_CONTINUOUS_AF, value); + } + + /** @hide + * Gets the current selectable zone af setting. + * + * @return one of SELECTABLE_ZONE_AF_XXX string constant. null if selectable zone af + * setting is not supported. + */ + public String getSelectableZoneAf() { + return get(KEY_QC_SELECTABLE_ZONE_AF); + } + + /** @hide + * Sets the current selectable zone af setting. + * + * @param value SELECTABLE_ZONE_AF_XXX string constants. + */ + public void setSelectableZoneAf(String value) { + set(KEY_QC_SELECTABLE_ZONE_AF, value); + } + + /** @hide + * Gets the current face detection setting. + * + * @return one of FACE_DETECTION_XXX string constant. null if face detection + * setting is not supported. + * + */ + public String getFaceDetectionMode() { + return get(KEY_QC_FACE_DETECTION); + } + + /** @hide + * Sets the auto scene detect. Other settings like Touch AF/AEC might be + * changed after setting face detection. + * + * @param value FACE_DETECTION_XXX string constants. + * + */ + public void setFaceDetectionMode(String value) { + set(KEY_QC_FACE_DETECTION, value); + } + + /** @hide + * Gets the current video rotation setting. + * + * @return one of VIDEO_QC_ROTATION_XXX string constant. null if video rotation + * setting is not supported. + */ + public String getVideoRotation() { + return get(KEY_QC_VIDEO_ROTATION); + } + + /** @hide + * Sets the current video rotation setting. + * + * @param value VIDEO_QC_ROTATION_XXX string constants. + */ + public void setVideoRotation(String value) { + set(KEY_QC_VIDEO_ROTATION, value); + } + /** @hide + * Gets the supported video rotation modes. + * + * @return a List of VIDEO_QC_ROTATION_XXX string constant. null if this + * setting is not supported. + */ + public List getSupportedVideoRotationValues() { + String str = get(KEY_QC_VIDEO_ROTATION + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + // Splits a comma delimited string to an ArrayList of Coordinate. + // Return null if the passing string is null or the Coordinate is 0. + private ArrayList splitCoordinate(String str) { + if (str == null) return null; + TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(','); + splitter.setString(str); + ArrayList coordinateList = new ArrayList(); + for (String s : splitter) { + Coordinate coordinate = strToCoordinate(s); + if (coordinate != null) coordinateList.add(coordinate); + } + if (coordinateList.size() == 0) return null; + return coordinateList; + } + + // Parses a string (ex: "500x500") to Coordinate object. + // Return null if the passing string is null. + private Coordinate strToCoordinate(String str) { + if (str == null) return null; + + int pos = str.indexOf('x'); + if (pos != -1) { + String x = str.substring(0, pos); + String y = str.substring(pos + 1); + return new Coordinate(Integer.parseInt(x), + Integer.parseInt(y)); + } + Log.e(TAG, "Invalid Coordinate parameter string=" + str); + return null; + } + /* ### QC ADD-ONS: END */ }; } diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 61d5031e16ed..7935ebfbd969 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -466,6 +466,56 @@ void JNICameraContext::setCallbackMode(JNIEnv *env, bool installed, bool manualM } } +static void android_hardware_Camera_setLongshot(JNIEnv *env, jobject thiz, jboolean enable) +{ + ALOGV("setLongshot"); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + if ( enable ) { + rc = camera->sendCommand(CAMERA_CMD_LONGSHOT_ON, 0, 0); + } else { + rc = camera->sendCommand(CAMERA_CMD_LONGSHOT_OFF, 0, 0); + } + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "enabling longshot mode failed"); + } +} + +static void android_hardware_Camera_sendHistogramData(JNIEnv *env, jobject thiz) + { + ALOGV("sendHistogramData" ); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + rc = camera->sendCommand(CAMERA_CMD_HISTOGRAM_SEND_DATA, 0, 0); + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "send histogram data failed"); + } + } + static void android_hardware_Camera_setHistogramMode(JNIEnv *env, jobject thiz, jboolean mode) + { + ALOGV("setHistogramMode: mode:%d", (int)mode); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + if(mode == true) + rc = camera->sendCommand(CAMERA_CMD_HISTOGRAM_ON, 0, 0); + else + rc = camera->sendCommand(CAMERA_CMD_HISTOGRAM_OFF, 0, 0); + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "set histogram mode failed"); + } + } void JNICameraContext::addCallbackBuffer( JNIEnv *env, jbyteArray cbb, int msgType) { @@ -789,7 +839,25 @@ static void android_hardware_Camera_setHasPreviewCallback(JNIEnv *env, jobject t context->setCallbackMode(env, installed, manualBuffer); } -static void android_hardware_Camera_addCallbackBuffer(JNIEnv *env, jobject thiz, jbyteArray bytes, jint msgType) { +static void android_hardware_Camera_setMetadataCb(JNIEnv *env, jobject thiz, jboolean mode) +{ + ALOGV("setMetadataCb: mode:%d", (int)mode); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + if(mode == true) + rc = camera->sendCommand(CAMERA_CMD_METADATA_ON, 0, 0); + else + rc = camera->sendCommand(CAMERA_CMD_METADATA_OFF, 0, 0); + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "set metadata mode failed"); + } +} + +static void android_hardware_Camera_addCallbackBuffer(JNIEnv *env, jobject thiz, jbyteArray bytes, int msgType) { ALOGV("addCallbackBuffer: 0x%x", msgType); JNICameraContext* context = reinterpret_cast(env->GetLongField(thiz, fields.context)); @@ -1067,6 +1135,18 @@ static const JNINativeMethod camMethods[] = { { "native_takePicture", "(I)V", (void *)android_hardware_Camera_takePicture }, + { "native_setHistogramMode", + "(Z)V", + (void *)android_hardware_Camera_setHistogramMode }, + { "native_setMetadataCb", + "(Z)V", + (void *)android_hardware_Camera_setMetadataCb }, + { "native_sendHistogramData", + "()V", + (void *)android_hardware_Camera_sendHistogramData }, + { "native_setLongshot", + "(Z)V", + (void *)android_hardware_Camera_setLongshot }, { "native_setParameters", "(Ljava/lang/String;)V", (void *)android_hardware_Camera_setParameters }, From 2a6ab304ccf1174c2b22c8c4f493bb32a7d7d2ac Mon Sep 17 00:00:00 2001 From: Paul Keith Date: Sun, 15 Jan 2017 19:24:06 -0600 Subject: [PATCH 0056/1164] sensors: Allow opting out of default batch size * In commit d49b1ee0de1eeb2f7370bf2839e7c707fe008b37, Google introduced a default batch size for the accelerometer, meant for Android Wear devices * For some bizarre reason, this change breaks rotation on certain devices. * Specifically, this behavior has been noticed by devices using Samsung's Sensorhub firmware * As a result, add an overlay to allow opting out of this default accelerometer batch size in order to fix rotation on certain Samsung devices * Thanks to Martin Bouchet for pointing me to the offending commit in fw/b Change-Id: I8769147e1b1553a8fbad03340745a7e7377b8510 Signed-off-by: Paul Keith Signed-off-by: Josh Fox (XlxFoXxlX) --- core/res/res/values/config.xml | 5 +++++ core/res/res/values/symbols.xml | 2 ++ .../android/server/policy/WindowOrientationListener.java | 6 +++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index a36e4ae79b93..606abddc2b97 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3134,6 +3134,11 @@ + + true + false diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index f80abc1a04f9..cf239cee9316 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2907,6 +2907,8 @@ + + diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java index 57bb08102c00..b10dd217c490 100644 --- a/services/core/java/com/android/server/policy/WindowOrientationListener.java +++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java @@ -59,6 +59,7 @@ public abstract class WindowOrientationListener { private boolean mEnabled; private int mRate; private String mSensorType; + private boolean mUseDefaultBatchingForAccel; private boolean mUseSystemClockforRotationSensor; private Sensor mSensor; private OrientationJudge mOrientationJudge; @@ -115,6 +116,9 @@ private WindowOrientationListener(Context context, Handler handler, int rate) { mSensor = nonWakeUpDeviceOrientationSensor; } + mUseDefaultBatchingForAccel = context.getResources().getBoolean( + com.android.internal.R.bool.config_useDefaultBatchingForAccel); + mUseSystemClockforRotationSensor = context.getResources().getBoolean( com.android.internal.R.bool.config_useSystemClockforRotationSensor); @@ -161,7 +165,7 @@ public void enable(boolean clearCurrentRotation) { + clearCurrentRotation); } mOrientationJudge.resetLocked(clearCurrentRotation); - if (mSensor.getType() == Sensor.TYPE_ACCELEROMETER) { + if (mSensor.getType() == Sensor.TYPE_ACCELEROMETER && mUseDefaultBatchingForAccel) { mSensorManager.registerListener( mOrientationJudge, mSensor, mRate, DEFAULT_BATCH_LATENCY, mHandler); } else { From e0aadeaadeb73f79e7cbde829dd29b66c0427a29 Mon Sep 17 00:00:00 2001 From: Praveen Chavan Date: Tue, 14 Jul 2015 12:38:37 -0700 Subject: [PATCH 0057/1164] CamcorderProfiles: Add new profiles for recorder Below changes are squased: video: Add QHD & 2K profile for recorder add VGA and 4K-DCI profiles. Change-Id: I4d23d7609225e921f6d0500bb03756bbfb2cde21 Signed-off-by: Joe Maples Signed-off-by: Josh Fox (XlxFoXxlX) --- core/jni/android_hardware_Camera.cpp | 6 ++ .../java/android/media/CamcorderProfile.java | 75 ++++++++++++++++++- media/jni/android_media_MediaProfiles.cpp | 9 ++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 7935ebfbd969..37178387fc43 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -469,6 +469,7 @@ void JNICameraContext::setCallbackMode(JNIEnv *env, bool installed, bool manualM static void android_hardware_Camera_setLongshot(JNIEnv *env, jobject thiz, jboolean enable) { ALOGV("setLongshot"); +#ifdef QCOM_HARDWARE JNICameraContext* context; status_t rc; sp camera = get_native_camera(env, thiz, &context); @@ -483,11 +484,13 @@ static void android_hardware_Camera_setLongshot(JNIEnv *env, jobject thiz, jbool if (rc != NO_ERROR) { jniThrowException(env, "java/lang/RuntimeException", "enabling longshot mode failed"); } +#endif } static void android_hardware_Camera_sendHistogramData(JNIEnv *env, jobject thiz) { ALOGV("sendHistogramData" ); +#ifdef QCOM_HARDWARE JNICameraContext* context; status_t rc; sp camera = get_native_camera(env, thiz, &context); @@ -498,10 +501,12 @@ static void android_hardware_Camera_sendHistogramData(JNIEnv *env, jobject thiz) if (rc != NO_ERROR) { jniThrowException(env, "java/lang/RuntimeException", "send histogram data failed"); } +#endif } static void android_hardware_Camera_setHistogramMode(JNIEnv *env, jobject thiz, jboolean mode) { ALOGV("setHistogramMode: mode:%d", (int)mode); +#ifdef QCOM_HARDWARE JNICameraContext* context; status_t rc; sp camera = get_native_camera(env, thiz, &context); @@ -515,6 +520,7 @@ static void android_hardware_Camera_sendHistogramData(JNIEnv *env, jobject thiz) if (rc != NO_ERROR) { jniThrowException(env, "java/lang/RuntimeException", "set histogram mode failed"); } +#endif } void JNICameraContext::addCallbackBuffer( JNIEnv *env, jbyteArray cbb, int msgType) diff --git a/media/java/android/media/CamcorderProfile.java b/media/java/android/media/CamcorderProfile.java index d303a2e39882..6785670d1926 100644 --- a/media/java/android/media/CamcorderProfile.java +++ b/media/java/android/media/CamcorderProfile.java @@ -206,6 +206,77 @@ public class CamcorderProfile private static final int QUALITY_HIGH_SPEED_LIST_START = QUALITY_HIGH_SPEED_LOW; private static final int QUALITY_HIGH_SPEED_LIST_END = QUALITY_HIGH_SPEED_2160P; + // Vendor-specific quality profiles + /** + * Quality level corresponding to the VGA (640 x 480) resolution. + * @hide + */ + public static final int QUALITY_VGA = 10000; + + /** + * Quality level corresponding to the 4k-DCI (4096 x 2160) resolution. + * @hide + */ + public static final int QUALITY_4KDCI = 10001; + + /** + * Time lapse quality level corresponding to the VGA (640 x 480) resolution. + * @hide + */ + public static final int QUALITY_TIME_LAPSE_VGA = 10002; + + /** + * Time lapse quality level corresponding to the 4k-DCI (4096 x 2160) resolution. + * @hide + */ + public static final int QUALITY_TIME_LAPSE_4KDCI = 10003; + + /** + * High speed ( >= 100fps) quality level corresponding to the CIF (352 x 288) + * @hide + */ + public static final int QUALITY_HIGH_SPEED_CIF = 10004; + + /** + * High speed ( >= 100fps) quality level corresponding to the VGA (640 x 480) + * @hide + */ + public static final int QUALITY_HIGH_SPEED_VGA = 10005; + + /** + * High speed ( >= 100fps) quality level corresponding to the 4K-DCI (4096 x 2160) + * @hide + */ + public static final int QUALITY_HIGH_SPEED_4KDCI = 10006; + + /** + * Quality level corresponding to QHD resolution + * @hide + */ + public static final int QUALITY_QHD = 10007; + + /** + * Quality level corresponding to 2K resolution + * @hide + */ + public static final int QUALITY_2k = 10008; + + /** + * Time lapse quality level corresponding to the QHD resolution. + * @hide + */ + public static final int QUALITY_TIME_LAPSE_QHD = 10009; + + /** + * Time lapse quality level corresponding to the 2K resolution. + * @hide + */ + public static final int QUALITY_TIME_LAPSE_2k = 10010; + + // Start and end of vendor quality list + private static final int QUALITY_VENDOR_LIST_START = QUALITY_VGA; + private static final int QUALITY_VENDOR_LIST_END = QUALITY_TIME_LAPSE_2k; + /** * Default recording duration in seconds before the session is terminated. * This is useful for applications like MMS has limited file size requirement. @@ -391,7 +462,9 @@ public static CamcorderProfile get(int cameraId, int quality) { (quality >= QUALITY_TIME_LAPSE_LIST_START && quality <= QUALITY_TIME_LAPSE_LIST_END) || (quality >= QUALITY_HIGH_SPEED_LIST_START && - quality <= QUALITY_HIGH_SPEED_LIST_END))) { + quality <= QUALITY_HIGH_SPEED_LIST_END) || + (quality >= QUALITY_VENDOR_LIST_START && + quality <= QUALITY_VENDOR_LIST_END))) { String errMessage = "Unsupported quality level: " + quality; throw new IllegalArgumentException(errMessage); } diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp index 5bc80925eca4..08da08a32daf 100644 --- a/media/jni/android_media_MediaProfiles.cpp +++ b/media/jni/android_media_MediaProfiles.cpp @@ -169,8 +169,13 @@ static bool isCamcorderQualityKnown(int quality) quality <= CAMCORDER_QUALITY_LIST_END) || (quality >= CAMCORDER_QUALITY_TIME_LAPSE_LIST_START && quality <= CAMCORDER_QUALITY_TIME_LAPSE_LIST_END) || - (quality >= CAMCORDER_QUALITY_HIGH_SPEED_LIST_START && - quality <= CAMCORDER_QUALITY_HIGH_SPEED_LIST_END)); + (quality >= CAMCORDER_QUALITY_HIGH_SPEED_LIST_START && + quality <= CAMCORDER_QUALITY_HIGH_SPEED_LIST_END) +#ifdef QCOM_HARDWARE + || (quality >= CAMCORDER_QUALITY_VENDOR_START && + quality <= CAMCORDER_QUALITY_VENDOR_END) +#endif + ); } static jobject From 73bdc22089e719e69c15551953d1445c7f3d07d6 Mon Sep 17 00:00:00 2001 From: Vijay Kumar Tumati Date: Wed, 22 Apr 2015 12:50:02 +0530 Subject: [PATCH 0058/1164] Camera: Longshot with Burst Functionality. New Longshot stop command is sent after receiving all the required YUV callbacks or releasing the shutter before reaching Max number. Change-Id: I264d94cde624b5f2ead88236bdff8d6db41e12e6 Signed-off-by: Joe Maples Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/hardware/Camera.java | 9 +++++++++ core/jni/android_hardware_Camera.cpp | 24 +++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index a0aef4808e83..19117116b586 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -2291,6 +2291,15 @@ public final void setLongshot(boolean enable) } private native final void native_setLongshot(boolean enable); + /** @hide + * Stop longshot. Available only in ZSL. + */ + public final void stopLongshot() + { + native_stopLongshot(); + } + private native final void native_stopLongshot(); + /** @hide * Handles the Touch Co-ordinate. */ diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 37178387fc43..2782f8c5356d 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -487,6 +487,21 @@ static void android_hardware_Camera_setLongshot(JNIEnv *env, jobject thiz, jbool #endif } +static void android_hardware_Camera_stopLongshot(JNIEnv *env, jobject thiz) +{ + ALOGV("stopLongshot"); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + rc = camera->sendCommand(CAMERA_CMD_STOP_LONGSHOT, 0, 0); + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "enabling longshot mode failed"); + } +} + static void android_hardware_Camera_sendHistogramData(JNIEnv *env, jobject thiz) { ALOGV("sendHistogramData" ); @@ -1150,9 +1165,12 @@ static const JNINativeMethod camMethods[] = { { "native_sendHistogramData", "()V", (void *)android_hardware_Camera_sendHistogramData }, - { "native_setLongshot", - "(Z)V", - (void *)android_hardware_Camera_setLongshot }, + { "native_setLongshot", + "(Z)V", + (void *)android_hardware_Camera_setLongshot }, + { "native_stopLongshot", + "()V", + (void *)android_hardware_Camera_stopLongshot }, { "native_setParameters", "(Ljava/lang/String;)V", (void *)android_hardware_Camera_setParameters }, From d5efffc2a86e505282c1c2d91c3276178e76442f Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Tue, 3 Mar 2015 10:43:28 +0100 Subject: [PATCH 0059/1164] Allow sending vendor- or device-specific commands to the camera HAL. Change-Id: I2aaa9e526b6f1a35d45e96b6d23e3db972d82733 Signed-off-by: Joe Maples Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/hardware/Camera.java | 14 ++++++++++++++ core/jni/android_hardware_Camera.cpp | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 19117116b586..3b45430058c4 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -1821,6 +1821,20 @@ private void updateAppOpsPlayAudio() { } } + /** + * Send a vendor-specific camera command + * + * @hide + */ + public final void sendVendorCommand(int cmd, int arg1, int arg2) { + if (cmd < 1000) { + throw new IllegalArgumentException("Command numbers must be at least 1000"); + } + _sendVendorCommand(cmd, arg1, arg2); + } + + private native final void _sendVendorCommand(int cmd, int arg1, int arg2); + /** * Callback interface for zoom changes during a smooth zoom operation. * diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 2782f8c5356d..27e098acb41c 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -1108,6 +1108,18 @@ static void android_hardware_Camera_enableFocusMoveCallback(JNIEnv *env, jobject } } +static void android_hardware_Camera_sendVendorCommand(JNIEnv *env, jobject thiz, + jint cmd, jint arg1, jint arg2) +{ + ALOGV("sendVendorCommand"); + sp camera = get_native_camera(env, thiz, NULL); + if (camera == 0) return; + + if (camera->sendCommand(cmd, arg1, arg2) != NO_ERROR) { + jniThrowRuntimeException(env, "sending vendor command failed"); + } +} + //------------------------------------------------- static const JNINativeMethod camMethods[] = { @@ -1207,6 +1219,9 @@ static const JNINativeMethod camMethods[] = { { "enableFocusMoveCallback", "(I)V", (void *)android_hardware_Camera_enableFocusMoveCallback}, + { "_sendVendorCommand", + "(III)V", + (void *)android_hardware_Camera_sendVendorCommand }, }; struct field { From 76ad5c75d0f8ce1c63f67028af5160c26c770bce Mon Sep 17 00:00:00 2001 From: Sauhard Pande Date: Thu, 21 Jul 2016 18:23:21 -0700 Subject: [PATCH 0060/1164] Camera: Expose Aux camera to apps present in the whitelist Issue: 3rd party apk cannot handle additional aux camera and may cause crash, Mono camera doesnt support all capabilities of HAL3 causing CTS issue. Fix: 1. Expose aux camera to apps present in the whitelist 2. ignore the availabe/unavailable status update for aux camera 3. returning exception for open request for bad cameraid CRs-Fixed: 1086937 Change-Id: I15910154c6df205e6d4e00bfad30a00c9e3d5bee Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/hardware/Camera.java | 37 ++++++++++++++++- .../hardware/camera2/CameraManager.java | 41 +++++++++++++++++++ core/jni/android_hardware_Camera.cpp | 2 +- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 3b45430058c4..2a3963f364b4 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -37,6 +37,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.SystemProperties; import android.renderscript.Allocation; import android.renderscript.Element; import android.renderscript.RSIllegalArgumentException; @@ -288,7 +289,35 @@ public class Camera { * @return total number of accessible camera devices, or 0 if there are no * cameras or an error was encountered enumerating them. */ - public native static int getNumberOfCameras(); + public static int getNumberOfCameras() { + boolean exposeAuxCamera = false; + String packageName = ActivityThread.currentOpPackageName(); + /* Force to expose only two cameras + * if the package name does not falls in this bucket + */ + String packageList = SystemProperties.get("vendor.camera.aux.packagelist"); + if (packageList.length() > 0) { + TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(','); + splitter.setString(packageList); + for (String str : splitter) { + if (packageName.equals(str)) { + exposeAuxCamera = true; + break; + } + } + } + int numberOfCameras = _getNumberOfCameras(); + if (exposeAuxCamera == false && (numberOfCameras > 2)) { + numberOfCameras = 2; + } + return numberOfCameras; + } + + /** + * Returns the number of physical cameras available on this device. + */ + /** @hide */ + public native static int _getNumberOfCameras(); /** * Returns the information about a particular camera. @@ -299,6 +328,9 @@ public class Camera { * low-level failure). */ public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) { + if(cameraId >= getNumberOfCameras()){ + throw new RuntimeException("Unknown camera ID"); + } _getCameraInfo(cameraId, cameraInfo); IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE); IAudioService audioService = IAudioService.Stub.asInterface(b); @@ -570,6 +602,9 @@ public int cameraInitUnspecified(int cameraId) { /** used by Camera#open, Camera#open(int) */ Camera(int cameraId) { + if(cameraId >= getNumberOfCameras()){ + throw new RuntimeException("Unknown camera ID"); + } int err = cameraInitNormal(cameraId); if (checkInitErrors(err)) { if (err == -EACCES) { diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 7ebe0f9a8d8d..3eab2700a2be 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemService; +import android.app.ActivityThread; import android.content.Context; import android.hardware.CameraInfo; import android.hardware.CameraStatus; @@ -39,6 +40,7 @@ import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.SystemProperties; +import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; @@ -910,8 +912,22 @@ public String[] getCameraIdList() { // Try to make sure we have an up-to-date list of camera devices. connectCameraServiceLocked(); + boolean exposeAuxCamera = false; + String packageName = ActivityThread.currentOpPackageName(); + String packageList = SystemProperties.get("vendor.camera.aux.packagelist"); + if (packageList.length() > 0) { + TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(','); + splitter.setString(packageList); + for (String str : splitter) { + if (packageName.equals(str)) { + exposeAuxCamera = true; + break; + } + } + } int idCount = 0; for (int i = 0; i < mDeviceStatus.size(); i++) { + if(!exposeAuxCamera && (i == 2)) break; int status = mDeviceStatus.valueAt(i); if (status == ICameraServiceListener.STATUS_NOT_PRESENT || status == ICameraServiceListener.STATUS_ENUMERATING) continue; @@ -920,6 +936,7 @@ public String[] getCameraIdList() { cameraIds = new String[idCount]; idCount = 0; for (int i = 0; i < mDeviceStatus.size(); i++) { + if(!exposeAuxCamera && (i == 2)) break; int status = mDeviceStatus.valueAt(i); if (status == ICameraServiceListener.STATUS_NOT_PRESENT || status == ICameraServiceListener.STATUS_ENUMERATING) continue; @@ -1101,6 +1118,30 @@ private void updateCallbackLocked(AvailabilityCallback callback, Executor execut } private void onStatusChangedLocked(int status, String id) { + /* Force to ignore the last mono/aux camera status update + * if the package name does not falls in this bucket + */ + boolean exposeMonoCamera = false; + String packageName = ActivityThread.currentOpPackageName(); + String packageList = SystemProperties.get("vendor.camera.aux.packagelist"); + if (packageList.length() > 0) { + TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(','); + splitter.setString(packageList); + for (String str : splitter) { + if (packageName.equals(str)) { + exposeMonoCamera = true; + break; + } + } + } + + if (exposeMonoCamera == false) { + if (Integer.parseInt(id) >= 2) { + Log.w(TAG, "[soar.cts] ignore the status update of camera: " + id); + return; + } + } + if (DEBUG) { Log.v(TAG, String.format("Camera id %s has status changed to 0x%x", id, status)); diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 27e098acb41c..1ba08438e824 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -1123,7 +1123,7 @@ static void android_hardware_Camera_sendVendorCommand(JNIEnv *env, jobject thiz, //------------------------------------------------- static const JNINativeMethod camMethods[] = { - { "getNumberOfCameras", + { "_getNumberOfCameras", "()I", (void *)android_hardware_Camera_getNumberOfCameras }, { "_getCameraInfo", From e75c031215dc40cbdb768f0bac80913578279af5 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Wed, 27 Jul 2016 17:36:47 -0700 Subject: [PATCH 0061/1164] MountService: Unmount internal storage before restarting framework This is a squash of the following two commits that have been binderized to work on P. mountservice: Shut down volumes before restarting framework * Vold assumes that when FUSE is killed, the mount is gone. This isn't true with sdcardfs, since the daemon doesn't continue to run. Cryptfs was assuming this behavior, and the system would hang during decryption since the emulated storage doesn't get unmounted. * Send the shutdown command before committing suicide. mountservice: Don't nuke all volumes when decrypting * Instead, just unmount the emulated internal volume since it's the only one which can prevent cryptfs from restarting. Change-Id: Iac4bc8d2b7ce0a4cacafb19e4edda84e4b752f29 Signed-off-by: Joe Maples Signed-off-by: Josh Fox (XlxFoXxlX) --- .../core/java/com/android/server/StorageManagerService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index c2a7205fd522..44cd2af2348e 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -2251,6 +2251,12 @@ public int decryptStorage(String password) { try { mVold.fdeCheckPassword(password); mHandler.postDelayed(() -> { + // unmount the internal emulated volume first + try { + mVold.unmount(findVolumeByIdOrThrow("emulated").id); + } catch (Exception e) { + Slog.e(TAG, "unable to shut down internal volume", e); + } try { mVold.fdeRestart(); } catch (Exception e) { From ba19c2eb35476aafb02ec94707b22ebc0b006440 Mon Sep 17 00:00:00 2001 From: Pawit Pornkitprasan Date: Sun, 1 Sep 2013 16:24:14 +0700 Subject: [PATCH 0062/1164] PackageManager: allow build-time disabling of components Allow components to be specified as disabled at build time (applied on boot). This allows stock OTA components to be marked as disabled in CM builds. Change-Id: I6e4499cc40a779792a5ea97a10137399dad7d69f SystemUpdateService: enable service but lock its receivers [1/2] Added a check for ensure that disabled components are not re-enabled at runtime Added code for forcing enable of previously disabled components Change-Id: Icfcfa26ccb85028d32edbb5cdb3dd7cdae85b720 Signed-off-by: Josh Fox (XlxFoXxlX) --- core/res/res/values/aosip_config.xml | 8 ++++ core/res/res/values/aosip_symbols.xml | 5 +++ .../server/pm/PackageManagerService.java | 40 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/core/res/res/values/aosip_config.xml b/core/res/res/values/aosip_config.xml index d36b07fd3ecb..c0d1c035849e 100644 --- a/core/res/res/values/aosip_config.xml +++ b/core/res/res/values/aosip_config.xml @@ -17,4 +17,12 @@ false + + + + + + + + diff --git a/core/res/res/values/aosip_symbols.xml b/core/res/res/values/aosip_symbols.xml index b984fe5a1806..e7ae3bcf5504 100644 --- a/core/res/res/values/aosip_symbols.xml +++ b/core/res/res/values/aosip_symbols.xml @@ -18,4 +18,9 @@ + + + + + diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 76fd7b086517..7f3b5a14f5bc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1237,6 +1237,8 @@ private static boolean hasValidDomains(ActivityIntentInfo filter) { filter.hasDataScheme(IntentFilter.SCHEME_HTTPS)); } + ArrayList mDisabledComponentsList; + // Set of pending broadcasts for aggregating enable/disable of components. static class PendingPackageBroadcasts { // for each user id, a map of components within that package> @@ -3162,6 +3164,38 @@ public void onDefaultRuntimePermissionsGranted(int userId) { Slog.i(TAG, "Deferred reconcileAppsData finished " + count + " packages"); }, "prepareAppData"); + // Disable components marked for disabling at build-time + mDisabledComponentsList = new ArrayList(); + for (String name : mContext.getResources().getStringArray( + com.android.internal.R.array.config_disabledComponents)) { + ComponentName cn = ComponentName.unflattenFromString(name); + mDisabledComponentsList.add(cn); + Slog.v(TAG, "Disabling " + name); + String className = cn.getClassName(); + PackageSetting pkgSetting = mSettings.mPackages.get(cn.getPackageName()); + if (pkgSetting == null || pkgSetting.pkg == null + || !pkgSetting.pkg.hasComponentClassName(className)) { + Slog.w(TAG, "Unable to disable " + name); + continue; + } + pkgSetting.disableComponentLPw(className, UserHandle.USER_OWNER); + } + + // Enable components marked for forced-enable at build-time + for (String name : mContext.getResources().getStringArray( + com.android.internal.R.array.config_forceEnabledComponents)) { + ComponentName cn = ComponentName.unflattenFromString(name); + Slog.v(TAG, "Enabling " + name); + String className = cn.getClassName(); + PackageSetting pkgSetting = mSettings.mPackages.get(cn.getPackageName()); + if (pkgSetting == null || pkgSetting.pkg == null + || !pkgSetting.pkg.hasComponentClassName(className)) { + Slog.w(TAG, "Unable to enable " + name); + continue; + } + pkgSetting.enableComponentLPw(className, UserHandle.USER_OWNER); + } + // If this is first boot after an OTA, and a normal boot, then // we need to clear code cache directories. // Note that we do *not* clear the application profiles. These remain valid @@ -20669,6 +20703,12 @@ public void setUpdateAvailable(String packageName, boolean updateAvailable) { public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags, int userId) { if (!sUserManager.exists(userId)) return; + // Don't allow to enable components marked for disabling at build-time + if (mDisabledComponentsList.contains(componentName)) { + Slog.d(TAG, "Ignoring attempt to set enabled state of disabled component " + + componentName.flattenToString()); + return; + } setEnabledSetting(componentName.getPackageName(), componentName.getClassName(), newState, flags, userId, null); } From 8d22adf2ec9386feae43842c70549dd633d2628a Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Thu, 2 Jun 2016 15:29:16 -0700 Subject: [PATCH 0063/1164] SystemUI: Add support for persistent usb drive notification. This option can be enabled via config_persistUsbDriveNotification Change-Id: I331a759aeb914e46e3ef4842896d3465d894707a TICKET: PAELLA-225 Signed-off-by: Josh Fox (XlxFoXxlX) --- core/res/res/values/aosip_config.xml | 3 +++ core/res/res/values/aosip_symbols.xml | 2 ++ .../src/com/android/systemui/usb/StorageNotification.java | 2 ++ 3 files changed, 7 insertions(+) diff --git a/core/res/res/values/aosip_config.xml b/core/res/res/values/aosip_config.xml index c0d1c035849e..48cb3c87b0cc 100644 --- a/core/res/res/values/aosip_config.xml +++ b/core/res/res/values/aosip_config.xml @@ -25,4 +25,7 @@ + + + false diff --git a/core/res/res/values/aosip_symbols.xml b/core/res/res/values/aosip_symbols.xml index e7ae3bcf5504..34c26e0627ad 100644 --- a/core/res/res/values/aosip_symbols.xml +++ b/core/res/res/values/aosip_symbols.xml @@ -23,4 +23,6 @@ + + diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java index 7e4aa6518cb1..c9e843aa1b9c 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java +++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java @@ -393,6 +393,8 @@ private Notification onVolumeMounted(VolumeInfo vol) { mContext.getString(R.string.ext_media_unmount_action), buildUnmountPendingIntent(vol))) .setContentIntent(browseIntent) + .setOngoing(mContext.getResources().getBoolean( + R.bool.config_persistUsbDriveNotification)) .setCategory(Notification.CATEGORY_SYSTEM); // Non-adoptable disks can't be snoozed. if (disk.isAdoptable()) { From 6ec5f5c43bb4de155ff4f100aa8d3aae72b16ab9 Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Wed, 23 Nov 2016 10:12:35 +0100 Subject: [PATCH 0064/1164] Make Build.TYPE and Build.FINGERPRINT consistent for apps. Some apps (namely Android Wear) like to do comparisons between TYPE and FINGERPRINT and throw errors on inconsistencies. As our fingerprints are almost always taken from stock ROMs, they don't really match our builds, causing said comparisons to fail. Avoid those failures by taking build type out of fingerprint for apps. Change-Id: I8e8db64de7ea224572ecb3695c85abea91e0e29f Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/os/Build.java | 43 +++++++++++++++++++ .../com/android/internal/os/RuntimeInit.java | 2 + 2 files changed, 45 insertions(+) diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index dfdeb346befd..cda67dada7e2 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -30,7 +30,11 @@ import dalvik.system.VMRuntime; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Information about the current build, extracted from system properties. @@ -922,6 +926,7 @@ public static class VERSION_CODES { /** The type of build, like "user" or "eng". */ public static final String TYPE = getString("ro.build.type"); + private static String TYPE_FOR_APPS = parseBuildTypeFromFingerprint(); /** Comma-separated tags describing the build, like "unsigned,debug". */ public static final String TAGS = getString("ro.build.tags"); @@ -948,6 +953,44 @@ private static String deriveFingerprint() { return finger; } + /* + * Some apps like to compare the build type embedded in fingerprint + * to the actual build type. As the fingerprint in our case is almost + * always hardcoded to the stock ROM fingerprint, provide that instead + * of the actual one if possible. + */ + private static String parseBuildTypeFromFingerprint() { + final String fingerprint = SystemProperties.get("ro.build.fingerprint"); + if (TextUtils.isEmpty(fingerprint)) { + return null; + } + Pattern fingerprintPattern = + Pattern.compile("(.*)\\/(.*)\\/(.*):(.*)\\/(.*)\\/(.*):(.*)\\/(.*)"); + Matcher matcher = fingerprintPattern.matcher(fingerprint); + return matcher.matches() ? matcher.group(7) : null; + } + + /** @hide */ + public static void adjustBuildTypeIfNeeded() { + if (Process.isApplicationUid(Process.myUid()) && !TextUtils.isEmpty(TYPE_FOR_APPS)) { + try { + // This is sick. TYPE is final (which can't be changed because it's an API + // guarantee), but we have to reassign it. Resort to reflection to unset the + // final modifier, change the value and restore the final modifier afterwards. + Field typeField = Build.class.getField("TYPE"); + Field accessFlagsField = Field.class.getDeclaredField("accessFlags"); + accessFlagsField.setAccessible(true); + int currentFlags = accessFlagsField.getInt(typeField); + accessFlagsField.setInt(typeField, currentFlags & ~Modifier.FINAL); + typeField.set(null, TYPE_FOR_APPS); + accessFlagsField.setInt(typeField, currentFlags); + accessFlagsField.setAccessible(false); + } catch (Exception e) { + // shouldn't happen, but we don't want to crash the app even if it does happen + } + } + } + /** * Ensure that raw fingerprint system property is defined. If it was derived * dynamically by {@link #deriveFingerprint()} this is where we push the diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java index a9cd5c8e4adc..4ab21d8d128d 100644 --- a/core/java/com/android/internal/os/RuntimeInit.java +++ b/core/java/com/android/internal/os/RuntimeInit.java @@ -198,6 +198,8 @@ protected static final void commonInit() { Thread.setUncaughtExceptionPreHandler(loggingHandler); Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler)); + Build.adjustBuildTypeIfNeeded(); + /* * Install a TimezoneGetter subclass for ZoneInfo.db */ From d96426467c7fb1e4f6b1edf1d6a34e2e8e34ac09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dcaro=20Hoff?= Date: Sun, 4 Jun 2017 12:17:51 -0300 Subject: [PATCH 0065/1164] fingerprint: handle PerformanceStats NULL pointers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bcc100a has added support for this feature, but the NULL checks weren't complete, only "handleAcquired" was checking if PerformanceStats was supported before calling the API. Extend the NULL checks to "handleAuthenticated" and "handleFailedAttempt" calls as well. Change-Id: I3cc9b35ea6b81dc0c503b9feab940873b344323e Signed-off-by: Ícaro Hoff Signed-off-by: Josh Fox (XlxFoXxlX) --- .../fingerprint/FingerprintService.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index 06329e571b43..b8dd3901a0fe 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -457,10 +457,12 @@ protected void handleAuthenticated(long deviceId, int fingerId, int groupId, if (client != null && client.onAuthenticated(fingerId, groupId)) { removeClient(client); } - if (fingerId != 0) { - mPerformanceStats.accept++; - } else { - mPerformanceStats.reject++; + if (mPerformanceStats != null) { + if (fingerId != 0) { + mPerformanceStats.accept++; + } else { + mPerformanceStats.reject++; + } } } @@ -892,10 +894,12 @@ public int handleFailedAttempt() { mFailedAttempts.put(currentUser, mFailedAttempts.get(currentUser, 0) + 1); mTimedLockoutCleared.put(ActivityManager.getCurrentUser(), false); final int lockoutMode = getLockoutMode(); - if (lockoutMode == AuthenticationClient.LOCKOUT_PERMANENT) { - mPerformanceStats.permanentLockout++; - } else if (lockoutMode == AuthenticationClient.LOCKOUT_TIMED) { - mPerformanceStats.lockout++; + if (mPerformanceStats != null) { + if (lockoutMode == AuthenticationClient.LOCKOUT_PERMANENT) { + mPerformanceStats.permanentLockout++; + } else if (lockoutMode == AuthenticationClient.LOCKOUT_TIMED) { + mPerformanceStats.lockout++; + } } // Failing multiple times will continue to push out the lockout time From 7125cd8c0c776b8eda11fa38194fc29ae6d6925f Mon Sep 17 00:00:00 2001 From: Adrian DC Date: Tue, 28 Jun 2016 16:20:28 +0200 Subject: [PATCH 0066/1164] SystemUI: Restrict persistent USB drive notifications to USB disks * Without the addition of the isUsb check, a regular FAT32 MicroSD would have a persistent notification that is unwished Change-Id: I396a861702674d0a6a70beb5206fb4c7374ec85d Signed-off-by: Josh Fox (XlxFoXxlX) --- .../src/com/android/systemui/usb/StorageNotification.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java index c9e843aa1b9c..dd81ac536c99 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java +++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java @@ -393,9 +393,12 @@ private Notification onVolumeMounted(VolumeInfo vol) { mContext.getString(R.string.ext_media_unmount_action), buildUnmountPendingIntent(vol))) .setContentIntent(browseIntent) - .setOngoing(mContext.getResources().getBoolean( - R.bool.config_persistUsbDriveNotification)) .setCategory(Notification.CATEGORY_SYSTEM); + // USB disks notification can be persistent + if (disk.isUsb()) { + builder.setOngoing(mContext.getResources().getBoolean( + R.bool.config_persistUsbDriveNotification)); + } // Non-adoptable disks can't be snoozed. if (disk.isAdoptable()) { builder.setDeleteIntent(buildSnoozeIntent(vol.getFsUuid())); From d4af6391e9ce5b2f226fd657a0245173381297cc Mon Sep 17 00:00:00 2001 From: dianlujitao Date: Thu, 8 Feb 2018 21:48:44 +0800 Subject: [PATCH 0067/1164] NtpTrustedTime: Refresh NTP server from resources before requesting time * NtpTrustedTime initialized before carrier/country specific resources got loaded, so generally the default NTP server is always in use. * Always fetch NTP server from resources unless secure NTP server is set to ensure that carrier/country specific customization works. Change-Id: I9b09680ea5640c35660d1cd0b910af22af930144 --- core/java/android/util/NtpTrustedTime.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/core/java/android/util/NtpTrustedTime.java b/core/java/android/util/NtpTrustedTime.java index 30d7b6c0786c..7191e305f214 100644 --- a/core/java/android/util/NtpTrustedTime.java +++ b/core/java/android/util/NtpTrustedTime.java @@ -1,5 +1,6 @@ /* * Copyright (C) 2011 The Android Open Source Project + * Copyright (C) 2018 The LineageOS Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,20 +41,22 @@ public class NtpTrustedTime implements TrustedTime { private static NtpTrustedTime sSingleton; private static Context sContext; - private final String mServer; + private String mServer; private final long mTimeout; private ConnectivityManager mCM; private boolean mHasCache; + private final boolean mHasSecureServer; private long mCachedNtpTime; private long mCachedNtpElapsedRealtime; private long mCachedNtpCertainty; - private NtpTrustedTime(String server, long timeout) { + private NtpTrustedTime(String server, long timeout, boolean hasSecureServer) { if (LOGD) Log.d(TAG, "creating NtpTrustedTime using " + server); mServer = server; mTimeout = timeout; + mHasSecureServer = hasSecureServer; } public static synchronized NtpTrustedTime getInstance(Context context) { @@ -72,7 +75,7 @@ public static synchronized NtpTrustedTime getInstance(Context context) { resolver, Settings.Global.NTP_TIMEOUT, defaultTimeout); final String server = secureServer != null ? secureServer : defaultServer; - sSingleton = new NtpTrustedTime(server, timeout); + sSingleton = new NtpTrustedTime(server, timeout, secureServer != null); sContext = context; } @@ -114,6 +117,11 @@ public boolean forceRefresh(Network network) { if (LOGD) Log.d(TAG, "forceRefresh() from cache miss"); final SntpClient client = new SntpClient(); + if (!mHasSecureServer) { + mServer = sContext.getResources().getString( + com.android.internal.R.string.config_ntpServer); + if (LOGD) Log.d(TAG, "NTP server changed to " + mServer); + } if (client.requestTime(mServer, (int) mTimeout, network)) { mHasCache = true; mCachedNtpTime = client.getNtpTime(); From beb4ca1b205daeb63570364867cef3a9240d2317 Mon Sep 17 00:00:00 2001 From: mfonville Date: Mon, 26 Sep 2016 13:17:56 +0200 Subject: [PATCH 0068/1164] webview_packages: prefer the more powerful webview packages If Gapps are installed, better webview providers become avaliable. This commit adds support for those and makes the system choose the best provider: Chrome Stable>Google Webview>AOSP Webview It also allows the user to choose between additional providers from Play Store: Chrome Beta, Chrome Dev and Chrome Canary. AOSP WebView is used as Fallback in case no Gapps were installed. If Gapps were detected, AOSP WebView will be blocked and cannot be chosen any more. This patch is a collobarative work of: mfonville @mfonville rapperskull @rapperskull Arne-Christian Blystad @Blystad Alex Naidis @TheCrazyLex You can find more information on this topic here: opengapps/aosp_build#76 Change-Id: I3beecf38c75600ec05c9018259dfe3b539b73614 Signed-off-by: Alex Naidis Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- core/res/res/xml/config_webview_packages.xml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/res/res/xml/config_webview_packages.xml b/core/res/res/xml/config_webview_packages.xml index f062b59a008c..4f5097b095a6 100644 --- a/core/res/res/xml/config_webview_packages.xml +++ b/core/res/res/xml/config_webview_packages.xml @@ -15,7 +15,21 @@ --> - - + + + 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 + + + From a25c310fff9730345094a4e7989dc8781bf37c21 Mon Sep 17 00:00:00 2001 From: Alex Naidis Date: Sun, 30 Oct 2016 21:47:07 +0100 Subject: [PATCH 0069/1164] webview_packages: correct signature definition for Chrome Stable This is an incremental fix onto this patch: https://github.com/AOSPA/android_frameworks_base/commit/d36582165d4694da101cc65755af0841d443c80e Previously the definition of the signature for Chrome Stable was ignored since it wasn't inside the definition of Chrome Stable as webviewprovider. Thanks goes to @AKPWebDesign for initially noticing this. Change-Id: Id5c051859e7e51e11304874ec2defaa11aede1bf Signed-off-by: Alex Naidis Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- core/res/res/xml/config_webview_packages.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/res/res/xml/config_webview_packages.xml b/core/res/res/xml/config_webview_packages.xml index 4f5097b095a6..68cfd00dc237 100644 --- a/core/res/res/xml/config_webview_packages.xml +++ b/core/res/res/xml/config_webview_packages.xml @@ -16,8 +16,9 @@ - + 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 From 1b0f6651da9a9e5be0c141284fc0fa37028a01b7 Mon Sep 17 00:00:00 2001 From: Alex Naidis Date: Wed, 14 Dec 2016 13:04:18 +0100 Subject: [PATCH 0070/1164] webview_packages: fix incorrect signatures Chrome Stable and Google Webview had incorrect signatures. That was due to an incorrect method of determining the right signature. That mistake wasn't noticed because Android disables the signature check on "userdebug" and "eng" builds. It is only enabled on "user" builds. So this commit replaces the wrong signatures of Chrome Stable and Google Webview by the correct ones and thus makes them avaliable webview providers on "user" builds. Main credits go to @KreAch3R for his extensive research on the issue. Change-Id: I081783b59254bfed0b2e3568ba8ae2801d86efea Signed-off-by: Alex Naidis Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- core/res/res/xml/config_webview_packages.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/res/res/xml/config_webview_packages.xml b/core/res/res/xml/config_webview_packages.xml index 68cfd00dc237..574f7c15fc25 100644 --- a/core/res/res/xml/config_webview_packages.xml +++ b/core/res/res/xml/config_webview_packages.xml @@ -17,7 +17,7 @@ - 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 @@ -29,7 +29,7 @@ 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 From 30512a7575a0b3286bd529beb986041c3bcbdb53 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 3 Apr 2016 12:58:09 -0700 Subject: [PATCH 0071/1164] audio: Don't play sound effects if stream is muted * Stop turning on the audio hardware and playing silence. * Kind of annoying with certain types of Bluetooth headphones that don't actually play silence very well (hissssssssss). Not to mention power usage. Change-Id: I6985db8710f8b0f61619ac57e8efb9e4e01cc31a Signed-off-by: Josh Fox (XlxFoXxlX) --- .../core/java/com/android/server/audio/AudioService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 13de652350dc..046d5366a99c 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -5595,7 +5595,11 @@ public void handleMessage(Message msg) { break; case MSG_PLAY_SOUND_EFFECT: - onPlaySoundEffect(msg.arg1, msg.arg2); + if (isStreamMute(AudioSystem.STREAM_SYSTEM)) { + Log.d(TAG, "Stream muted, skip playback"); + } else { + onPlaySoundEffect(msg.arg1, msg.arg2); + } break; case MSG_BTA2DP_DOCK_TIMEOUT: From bfc06026f5fe662f028d82111da0e362b1939a0e Mon Sep 17 00:00:00 2001 From: Alexander Martinz Date: Mon, 5 Jan 2015 22:20:05 +0100 Subject: [PATCH 0072/1164] PowerProfile: allow overriding default power profile * override it with ro.power_profile.override Change-Id: I2b229822b18a54060d577f25c0ddaf5b7e7563b7 Signed-off-by: Alexander Martinz Signed-off-by: Josh Fox (XlxFoXxlX) --- .../com/android/internal/os/PowerProfile.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java index 246a50f6ceac..b0e4ca815df8 100644 --- a/core/java/com/android/internal/os/PowerProfile.java +++ b/core/java/com/android/internal/os/PowerProfile.java @@ -20,6 +20,8 @@ import android.content.Context; import android.content.res.Resources; import android.content.res.XmlResourceParser; +import android.os.SystemProperties; +import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.XmlUtils; @@ -37,6 +39,7 @@ * [hidden] */ public class PowerProfile { + private static final String TAG = "PowerProfile"; /* * POWER_CPU_SUSPEND: Power consumption when CPU is in power collapse mode. @@ -243,8 +246,9 @@ public PowerProfile(Context context, boolean forTest) { } private void readPowerValuesFromXml(Context context, boolean forTest) { - final int id = forTest ? com.android.internal.R.xml.power_profile_test : + int stockId = forTest ? com.android.internal.R.xml.power_profile_test : com.android.internal.R.xml.power_profile; + final int id = getPowerProfileResId(context, stockId); final Resources resources = context.getResources(); XmlResourceParser parser = resources.getXml(id); boolean parsingArray = false; @@ -403,6 +407,27 @@ public double getAveragePowerForCpuCore(int cluster, int step) { return 0; } + private int getPowerProfileResId(final Context context, int id) { + /* + * If ro.power_profile.override is set, use it to override the default. + * This is used for devices, which need to dynamically define the power profile. + */ + String powerProfileOverride = SystemProperties.get("ro.power_profile.override"); + if (!powerProfileOverride.isEmpty()) { + int tmpId = context.getResources().getIdentifier(powerProfileOverride, "xml", + "android"); + if (tmpId > 0) { + Slog.i(TAG, "getPowerProfileResId: using power profile \"" + + powerProfileOverride + "\""); + id = tmpId; + } else { + Slog.e(TAG, "getPowerProfileResId: could not retrieve power profile \"" + + powerProfileOverride + "\", using default instead"); + } + } + return id; + } + /** * Returns the number of memory bandwidth buckets defined in power_profile.xml, or a * default value if the subsystem has no recorded value. From 2d576bdf3d8804796391066303b9aedae3a934b8 Mon Sep 17 00:00:00 2001 From: Carlo Savignano Date: Tue, 25 Oct 2016 17:12:49 +0800 Subject: [PATCH 0073/1164] fingerprint: notify client when cancelling succeeded * Some fingerprint hardware hals might not notify userspace in time in some scenarios when successful authentication cancel is performed. * This is observed for example in some devices that have power and/or home buttons merged with fingerprint sensor, but not limited to such cases. * Add a opt-in configuration to enable client authentication cancel from fingerprint service when successful. * This addresses originally an issue where requesting fingerprint to be disabled and then enabled will wait till cancelling timeout before changing fingerprint sensor state and start authenticating again. Change-Id: I6a6795fbb795f0c6a4ff8ad27ac807e2f744c2d9 Signed-off-by: Carlo Savignano Signed-off-by: Josh Fox (XlxFoXxlX) --- core/res/res/values/aosip_config.xml | 4 ++++ core/res/res/values/aosip_symbols.xml | 4 ++++ .../android/server/fingerprint/FingerprintService.java | 9 ++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/res/res/values/aosip_config.xml b/core/res/res/values/aosip_config.xml index 48cb3c87b0cc..ec60b8f56874 100644 --- a/core/res/res/values/aosip_config.xml +++ b/core/res/res/values/aosip_config.xml @@ -28,4 +28,8 @@ false + + + false + diff --git a/core/res/res/values/aosip_symbols.xml b/core/res/res/values/aosip_symbols.xml index 34c26e0627ad..b3c565dfad41 100644 --- a/core/res/res/values/aosip_symbols.xml +++ b/core/res/res/values/aosip_symbols.xml @@ -25,4 +25,8 @@ + + + + diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index b8dd3901a0fe..9f9ed33f7535 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -146,6 +146,7 @@ private class PerformanceStats { private ClientMonitor mCurrentClient; private ClientMonitor mPendingClient; private PerformanceStats mPerformanceStats; + private final boolean mNotifyClient; private IBinder mToken = new Binder(); // used for internal FingerprintService enumeration private ArrayList mUnknownFingerprints = new ArrayList<>(); // hw fingerprints @@ -261,6 +262,8 @@ public FingerprintService(Context context) { ServiceManager.getService(Context.STATUS_BAR_SERVICE)); mActivityManager = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)) .getService(); + mNotifyClient = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_notifyClientOnFingerprintCancelSuccess); } @Override @@ -1227,7 +1230,11 @@ public void run() { if (client instanceof AuthenticationClient) { if (client.getToken() == token) { if (DEBUG) Slog.v(TAG, "stop client " + client.getOwnerString()); - client.stop(client.getToken() == token); + final int stopResult = client.stop(client.getToken() == token); + if (mNotifyClient && (stopResult == 0)) { + handleError(mHalDeviceId, + FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0); + } } else { if (DEBUG) Slog.v(TAG, "can't stop client " + client.getOwnerString() + " since tokens don't match"); From 45c96ef5a2d88caed313e643180f1cf0d7d6c499 Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Mon, 24 Feb 2014 23:36:48 +0700 Subject: [PATCH 0074/1164] [1/2]Base: Factor out preference-in-storage check to overridable method. Change-Id: I64966e15e0e92a2058809ead2c694a9badae881b (cherry picked from commit da6a6b0ffc1b6f21c64bb804341f2b32bb933922) Signed-off-by: Josh Fox (XlxFoXxlX) --- core/java/android/preference/Preference.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java index 4306bc47f2b5..32760d6e7a67 100644 --- a/core/java/android/preference/Preference.java +++ b/core/java/android/preference/Preference.java @@ -1543,6 +1543,14 @@ protected void onPrepareForRemoval() { public void setDefaultValue(Object defaultValue) { mDefaultValue = defaultValue; } + + /** + * Returns whether the preference can be found in persistent storage + * @hide + */ + protected boolean isPersisted() { + return getSharedPreferences().contains(mKey); + } private void dispatchSetInitialValue() { if (getPreferenceDataStore() != null) { @@ -1552,7 +1560,7 @@ private void dispatchSetInitialValue() { // By now, we know if we are persistent. final boolean shouldPersist = shouldPersist(); - if (!shouldPersist || !getSharedPreferences().contains(mKey)) { + if (!shouldPersist || !isPersisted()) { if (mDefaultValue != null) { onSetInitialValue(false, mDefaultValue); } From c5cc75ecb46fe506468eb6f83cfd468ec33343af Mon Sep 17 00:00:00 2001 From: Jesse Chan Date: Sat, 12 May 2018 00:14:26 -0500 Subject: [PATCH 0075/1164] Add an option to force pre-O apps to use full screen aspect ratio When an app target pre-O releases, the default max aspect ratio is 1.86:1 which leads to ugly black areas on devices that have screens with higher aspect ratio (for example Galaxy S8/S9). This change adds an option to allow users to change default aspect ratio for pre-O apps to 2.1 which would fit recent devices. Wight554: Simplify the code, we don't need the Settings for that, just bool Change-Id: I1ff5998e3a3429bfb9429674b4fe504d0b6ec025 Signed-off-by: Josh Fox (XlxFoXxlX) --- core/res/res/values/aosip_config.xml | 4 ++++ core/res/res/values/aosip_symbols.xml | 4 ++++ .../core/java/com/android/server/am/ActivityRecord.java | 9 ++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/res/res/values/aosip_config.xml b/core/res/res/values/aosip_config.xml index ec60b8f56874..ade94537e38c 100644 --- a/core/res/res/values/aosip_config.xml +++ b/core/res/res/values/aosip_config.xml @@ -32,4 +32,8 @@ false + + false + 2.1 + diff --git a/core/res/res/values/aosip_symbols.xml b/core/res/res/values/aosip_symbols.xml index b3c565dfad41..1773f7ad2905 100644 --- a/core/res/res/values/aosip_symbols.xml +++ b/core/res/res/values/aosip_symbols.xml @@ -29,4 +29,8 @@ + + + + diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 75f27231c976..34cb1e91e180 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -150,6 +150,7 @@ import android.content.pm.ApplicationInfo; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.GraphicBuffer; import android.graphics.Rect; @@ -362,6 +363,10 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo private boolean mShowWhenLocked; private boolean mTurnScreenOn; + // Full screen aspect ratio + private final float mFullScreenAspectRatio = Resources.getSystem().getFloat( + com.android.internal.R.dimen.config_screenAspectRatio); + /** * Temp configs used in {@link #ensureActivityConfiguration(int, boolean)} */ @@ -2421,7 +2426,9 @@ boolean isConfigurationCompatible(Configuration config) { // TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer. private void computeBounds(Rect outBounds) { outBounds.setEmpty(); - final float maxAspectRatio = info.maxAspectRatio; + final boolean higherAspectRatio = Resources.getSystem().getBoolean( + com.android.internal.R.bool.config_haveHigherAspectRatioScreen); + final float maxAspectRatio = higherAspectRatio ? mFullScreenAspectRatio : info.maxAspectRatio; final ActivityStack stack = getStack(); if (task == null || stack == null || task.inMultiWindowMode() || maxAspectRatio == 0 || isInVrUiMode(getConfiguration())) { From ee58f5ffe27b62f9135f384ef8587b2cf2646b97 Mon Sep 17 00:00:00 2001 From: jhenrique09 Date: Sat, 11 Aug 2018 13:40:00 -0400 Subject: [PATCH 0076/1164] Revert "Remove getIntWithSubId in TelephonyManager." This reverts commit ccc427426f418d6de93ab3bc0654cc377f1e3390. Fix missing symbol on cne Change-Id: Ic86855178af88265197dafd978ac99d0a45fbeed Signed-off-by: Josh Fox (XlxFoXxlX) --- .../android/telephony/TelephonyManager.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 487490c194b6..3ecb6bbfa88e 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -81,6 +81,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import android.content.ContentResolver; +import android.provider.Settings; + /** * Provides access to information about the telephony services on * the device. Applications can use the methods in this class to @@ -6629,6 +6632,45 @@ public boolean isHearingAidCompatibilitySupported() { return false; } + /** + * This function retrieves value for setting "name+subId", and if that is not found + * retrieves value for setting "name", and if that is not found throws + * SettingNotFoundException + * + * @hide + */ + public static int getIntWithSubId(ContentResolver cr, String name, int subId) + throws SettingNotFoundException { + try { + return Settings.Global.getInt(cr, name + subId); + } catch (SettingNotFoundException e) { + try { + int val = Settings.Global.getInt(cr, name); + Settings.Global.putInt(cr, name + subId, val); + + /* We are now moving from 'setting' to 'setting+subId', and using the value stored + * for 'setting' as default. Reset the default (since it may have a user set + * value). */ + int default_val = val; + if (name.equals(Settings.Global.MOBILE_DATA)) { + default_val = "true".equalsIgnoreCase( + SystemProperties.get("ro.com.android.mobiledata", "true")) ? 1 : 0; + } else if (name.equals(Settings.Global.DATA_ROAMING)) { + default_val = "true".equalsIgnoreCase( + SystemProperties.get("ro.com.android.dataroaming", "false")) ? 1 : 0; + } + + if (default_val != val) { + Settings.Global.putInt(cr, name, default_val); + } + + return val; + } catch (SettingNotFoundException exc) { + throw new SettingNotFoundException(name); + } + } + } + /** * Returns the IMS Registration Status for a particular Subscription ID. * From ce07ec658207a2207088a86cd83eb5178a8e6fcc Mon Sep 17 00:00:00 2001 From: Till Kottmann Date: Mon, 4 Jun 2018 18:52:36 +0200 Subject: [PATCH 0077/1164] SystemUI: Animate switching keyguard indications The animations will be ignored while dozing and indications will instantly switch. Test: visual Change-Id: Ifeaea516b37be733cf7957bbb46ad60e791dcc28 --- .../KeyguardIndicationController.java | 6 +- .../phone/KeyguardIndicationTextView.java | 59 +++++++++++++++++-- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 795140ea9d04..7e4cac421c4c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -298,18 +298,18 @@ protected final void updateIndication(boolean animate) { if (!TextUtils.isEmpty(mTransientIndication)) { // When dozing we ignore any text color and use white instead, because // colors can be hard to read in low brightness. - mTextView.switchIndication(mTransientIndication); + mTextView.switchIndication(mTransientIndication, false /* animate */); } else if (mPowerPluggedIn) { String indication = computePowerIndication(); if (animate) { animateText(mTextView, indication); } else { - mTextView.switchIndication(indication); + mTextView.switchIndication(indication, false /* animate */); } } else { String percentage = NumberFormat.getPercentInstance() .format(mBatteryLevel / 100f); - mTextView.switchIndication(percentage); + mTextView.switchIndication(percentage, false /* animate */); } return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java index c5c3fff7d1af..cffac22d97d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java @@ -20,13 +20,18 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; +import android.view.animation.Interpolator; import android.widget.TextView; +import com.android.systemui.Interpolators; + /** * A view to show hints on Keyguard ("Swipe up to unlock", "Tap again to open"). */ public class KeyguardIndicationTextView extends TextView { + private static final long ANIMATION_DURATION = 500; + public KeyguardIndicationTextView(Context context) { super(context); } @@ -45,19 +50,63 @@ public KeyguardIndicationTextView(Context context, AttributeSet attrs, int defSt } /** - * Changes the text with an animation and makes sure a single indication is shown long enough. + * Changes the text, optionally with an animation. * * @param text The text to show. + * @param animate Whether or not the change should be animated. */ - public void switchIndication(CharSequence text) { - - // TODO: Animation, make sure that we will show one indication long enough. - if (TextUtils.isEmpty(text)) { + public void switchIndication(CharSequence text, boolean animate) { + if(animate) { + switchIndication(text); + } else if(TextUtils.isEmpty(text)) { setVisibility(View.INVISIBLE); } else { + setText(text); setVisibility(View.VISIBLE); + } + } + + /** + * Changes the text with an animation and makes sure a single indication is shown long enough. + * + * @param text The text to show. + */ + public void switchIndication(CharSequence text) { + // TODO: Make sure that we will show one indication long enough. + if (TextUtils.isEmpty(text) && getVisibility() == View.VISIBLE) { + animateVisibility(View.INVISIBLE, ANIMATION_DURATION, Interpolators.ALPHA_OUT, null); + } else if(!TextUtils.isEmpty(text) && getVisibility() == View.INVISIBLE) { setText(text); + animateVisibility(View.VISIBLE, ANIMATION_DURATION, Interpolators.ALPHA_IN, null); + } else if(getVisibility() == View.VISIBLE){ + // Fade out the current indication + animateVisibility(View.INVISIBLE, ANIMATION_DURATION / 2, Interpolators.ALPHA_OUT, () -> { + // Fade in the new indication + setText(text); + animateVisibility(View.VISIBLE, ANIMATION_DURATION / 2, Interpolators.ALPHA_IN, null); + }); + } + } + + private void animateVisibility(int targetVisibility, long duration, Interpolator interpolator, + Runnable endAction) { + float targetAlpha = 0f; + if (targetVisibility == View.VISIBLE) { + setVisibility(View.VISIBLE); + targetAlpha = 1f; } + animate() + .alpha(targetAlpha) + .setDuration(duration) + .setInterpolator(interpolator) + .withEndAction(() -> { + if (targetVisibility == View.INVISIBLE) { + setVisibility(View.INVISIBLE); + } + if (endAction != null) { + endAction.run(); + } + }); } /** From 8b427378b7e7a1794d02de43fb5ce63737a69aa9 Mon Sep 17 00:00:00 2001 From: maxwen Date: Mon, 31 Oct 2016 23:48:50 +0100 Subject: [PATCH 0078/1164] SystemUI: make QS columns count configurable And add infrastructure to add more settings and distribute them to QS panel PS4 we must explicitly hide the columns submenu base: SystemUI: add column count 6 now that we have hide label base: SystemUI: qs colums menu with checkboxes base: SystemUI add landscape qs columns config allow max 9 columns in landscape Change-Id: I401cca347da1a94f352a9ffcb99f1409ddc4d008 Signed-off-by: Adin Kwok Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/provider/Settings.java | 11 ++ .../SystemUI/res/menu/qs_customize_menu.xml | 54 ++++++++ .../SystemUI/res/values/aosip_strings.xml | 31 +++++ .../android/systemui/qs/PagedTileLayout.java | 8 ++ .../com/android/systemui/qs/QSFragment.java | 5 + .../src/com/android/systemui/qs/QSPanel.java | 8 ++ .../com/android/systemui/qs/QuickQSPanel.java | 3 + .../com/android/systemui/qs/TileLayout.java | 29 +++- .../systemui/qs/customize/QSCustomizer.java | 126 ++++++++++++++++-- .../systemui/qs/customize/TileAdapter.java | 15 ++- 10 files changed, 272 insertions(+), 18 deletions(-) create mode 100644 packages/SystemUI/res/menu/qs_customize_menu.xml create mode 100644 packages/SystemUI/res/values/aosip_strings.xml diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 05104182f2ec..db503cd09873 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4094,6 +4094,17 @@ public boolean validate(@Nullable String value) { * the setting value. See an example above. */ + /** + * Number of qs columns on landscape orientation + * @hide + */ + public static final String QS_LAYOUT_COLUMNS_LANDSCAPE = "qs_layout_columns_landscape"; + + /** + * @hide + */ + public static final String QS_LAYOUT_COLUMNS = "qs_layout_columns"; + /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. diff --git a/packages/SystemUI/res/menu/qs_customize_menu.xml b/packages/SystemUI/res/menu/qs_customize_menu.xml new file mode 100644 index 000000000000..33e76ce617dd --- /dev/null +++ b/packages/SystemUI/res/menu/qs_customize_menu.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/values/aosip_strings.xml b/packages/SystemUI/res/values/aosip_strings.xml new file mode 100644 index 000000000000..cf7682f3b8d3 --- /dev/null +++ b/packages/SystemUI/res/values/aosip_strings.xml @@ -0,0 +1,31 @@ + + + + + + Portrait columns + Landscape columns + 3 + 4 + 5 + 6 + 7 + 8 + 9 + Reset + + diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index ab822696d382..fdfcae69df7f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -427,4 +427,12 @@ public boolean isViewFromObject(View view, Object object) { public interface PageListener { void onPageChanged(boolean isFirst); } + + @Override + public void updateSettings() { + for (int i = 0; i < mPages.size(); i++) { + mPages.get(i).updateSettings(); + } + postDistributeTiles(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index b146cfccf180..4c16624c2adb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -387,6 +387,11 @@ public void notifyCustomizeChanged() { // Let the panel know the position changed and it needs to update where notifications // and whatnot are. mPanelView.onQsHeightChanged(); + + // when we come back from customize update + if (!mQSCustomizer.isCustomizing()) { + mQSPanel.updateSettings(); + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 0876a5d3f456..ba0360bfb7ba 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -109,6 +109,7 @@ public QSPanel(Context context, AttributeSet attrs) { mPanelPageIndicator = (PageIndicator) LayoutInflater.from(context).inflate( R.layout.qs_page_indicator, this, false); addView(mPanelPageIndicator); + updateSettings(); ((PagedTileLayout) mTileLayout).setPageIndicator(mPanelPageIndicator); mQsTileRevealController = new QSTileRevealController(mContext, this, @@ -662,9 +663,16 @@ public interface QSTileLayout { int getOffsetTop(TileRecord tile); boolean updateResources(); + void updateSettings(); void setListening(boolean listening); default void setExpansion(float expansion) {} } + + public void updateSettings() { + if (mTileLayout != null) { + mTileLayout.updateSettings(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index c9c04d9ead0b..59f3a7a58c8d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -315,5 +315,8 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { R.id.expand_indicator); } } + @Override + public void updateSettings() { + } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index 45d63e0c1359..1a411e8d578e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -1,7 +1,10 @@ package com.android.systemui.qs; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; +import android.os.UserHandle; +import android.provider.Settings; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; @@ -24,6 +27,7 @@ public class TileLayout extends ViewGroup implements QSTileLayout { protected int mCellMarginHorizontal; protected int mCellMarginVertical; protected int mSidePadding; + protected int mDefaultColumns; protected final ArrayList mRecords = new ArrayList<>(); private int mCellMarginTop; @@ -76,17 +80,12 @@ public void removeAllViews() { public boolean updateResources() { final Resources res = mContext.getResources(); - final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns)); mCellHeight = mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height); mCellMarginHorizontal = res.getDimensionPixelSize(R.dimen.qs_tile_margin_horizontal); mCellMarginVertical= res.getDimensionPixelSize(R.dimen.qs_tile_margin_vertical); mCellMarginTop = res.getDimensionPixelSize(R.dimen.qs_tile_margin_top); mSidePadding = res.getDimensionPixelOffset(R.dimen.qs_tile_layout_margin_side); - if (mColumns != columns) { - mColumns = columns; - requestLayout(); - return true; - } + updateSettings(); return false; } @@ -155,4 +154,22 @@ private int getColumnStart(int column) { return getPaddingStart() + mSidePadding + mCellMarginHorizontal / 2 + column * (mCellWidth + mCellMarginHorizontal); } + + @Override + public void updateSettings() { + final Resources res = mContext.getResources(); + mDefaultColumns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns)); + boolean isPortrait = res.getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT; + int columns = Settings.System.getIntForUser( + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, mDefaultColumns, + UserHandle.USER_CURRENT); + int columnsLandscape = Settings.System.getIntForUser( + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, mDefaultColumns, + UserHandle.USER_CURRENT); + if (mColumns != (isPortrait ? columns : columnsLandscape)) { + mColumns = isPortrait ? columns : columnsLandscape; + requestLayout(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 394c3225bceb..b61c728f2582 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -22,6 +22,10 @@ import android.content.res.Configuration; import android.graphics.Point; import android.os.Bundle; +import android.content.res.Resources; +import android.content.Intent; +import android.os.UserHandle; +import android.provider.Settings; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; @@ -30,6 +34,7 @@ import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; @@ -61,7 +66,6 @@ */ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListener { - private static final int MENU_RESET = Menu.FIRST; private static final String EXTRA_QS_CUSTOMIZING = "qs_customizing"; private final QSDetailClipper mClipper; @@ -81,6 +85,11 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene private boolean mOpening; private boolean mIsShowingNavBackdrop; + private GridLayoutManager mLayout; + private int mDefaultColumns; + private Menu mColumnsSubMenu; + private Menu mColumnsLandscapeSubMenu; + public QSCustomizer(Context context, AttributeSet attrs) { super(new ContextThemeWrapper(context, R.style.edit_theme), attrs); @@ -98,21 +107,32 @@ public void onClick(View v) { } }); mToolbar.setOnMenuItemClickListener(this); - mToolbar.getMenu().add(Menu.NONE, MENU_RESET, 0, - mContext.getString(com.android.internal.R.string.reset)); - mToolbar.setTitle(R.string.qs_edit); + MenuInflater menuInflater = new MenuInflater(mContext); + menuInflater.inflate(R.menu.qs_customize_menu, mToolbar.getMenu()); + MenuItem menuItem = mToolbar.getMenu().findItem(R.id.menu_item_columns); + if (menuItem != null) { + mColumnsSubMenu = menuItem.getSubMenu(); + } + MenuItem menuItemLand = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape); + if (menuItemLand != null) { + mColumnsLandscapeSubMenu = menuItemLand.getSubMenu(); + } + updateColumnsMenu(); int accentColor = Utils.getColorAttr(context, android.R.attr.colorAccent); mToolbar.setTitleTextColor(accentColor); mToolbar.getNavigationIcon().setTint(accentColor); mToolbar.getOverflowIcon().setTint(accentColor); - mRecyclerView = findViewById(android.R.id.list); + mToolbar.setTitle(R.string.qs_edit); + mDefaultColumns = Math.max(1, + mContext.getResources().getInteger(R.integer.quick_settings_num_columns)); + mRecyclerView = (RecyclerView) findViewById(android.R.id.list); mTileAdapter = new TileAdapter(getContext()); mTileQueryHelper = new TileQueryHelper(context, mTileAdapter); mRecyclerView.setAdapter(mTileAdapter); mTileAdapter.getItemTouchHelper().attachToRecyclerView(mRecyclerView); - GridLayoutManager layout = new GridLayoutManager(getContext(), 3); - layout.setSpanSizeLookup(mTileAdapter.getSizeLookup()); - mRecyclerView.setLayoutManager(layout); + mLayout = new GridLayoutManager(getContext(), mDefaultColumns); + mLayout.setSpanSizeLookup(mTileAdapter.getSizeLookup()); + mRecyclerView.setLayoutManager(mLayout); mRecyclerView.addItemDecoration(mTileAdapter.getItemDecoration()); DefaultItemAnimator animator = new DefaultItemAnimator(); animator.setMoveDuration(TileAdapter.MOVE_DURATION); @@ -135,6 +155,7 @@ private void updateNavBackDrop(Configuration newConfig) { navBackdrop.setVisibility(mIsShowingNavBackdrop ? View.VISIBLE : View.GONE); } updateNavColors(); + updateSettings(); } private void updateNavColors() { @@ -196,6 +217,12 @@ public void hide(int x, int y) { if (isShown) { MetricsLogger.hidden(getContext(), MetricsProto.MetricsEvent.QS_EDIT); isShown = false; + if (mColumnsSubMenu != null) { + mColumnsSubMenu.close(); + } + if (mColumnsLandscapeSubMenu != null) { + mColumnsLandscapeSubMenu.close(); + } mToolbar.dismissPopupMenus(); setCustomizing(false); save(); @@ -223,11 +250,44 @@ public boolean isCustomizing() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { - case MENU_RESET: + case R.id.menu_item_reset: MetricsLogger.action(getContext(), MetricsProto.MetricsEvent.ACTION_QS_EDIT_RESET); reset(); break; + case R.id.menu_item_columns_three: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS, 3, UserHandle.USER_CURRENT); + break; + case R.id.menu_item_columns_four: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS, 4, UserHandle.USER_CURRENT); + break; + case R.id.menu_item_columns_five: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS, 5, UserHandle.USER_CURRENT); + break; + case R.id.menu_item_columns_landscape_four: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, 4, UserHandle.USER_CURRENT); + break; + case R.id.menu_item_columns_landscape_five: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, 5, UserHandle.USER_CURRENT); + break; + case R.id.menu_item_columns_landscape_six: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, 6, UserHandle.USER_CURRENT); + break; + case R.id.menu_item_columns_landscape_seven: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, 7, UserHandle.USER_CURRENT); + break; + case R.id.menu_item_columns_landscape_eight: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, 8, UserHandle.USER_CURRENT); + break; } + updateSettings(); return false; } @@ -238,6 +298,13 @@ private void reset() { tiles.add(tile); } mTileAdapter.resetTileSpecs(mHost, tiles); + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS, mDefaultColumns, + UserHandle.USER_CURRENT); + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, mDefaultColumns, + UserHandle.USER_CURRENT); + updateSettings(); } private void setTileSpecs() { @@ -326,4 +393,45 @@ public void onAnimationCancel(Animator animation) { mNotifQsContainer.setCustomizerAnimating(false); } }; + + public void updateSettings() { + final Resources res = mContext.getResources(); + boolean isPortrait = res.getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT; + int columns = Settings.System.getIntForUser( + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, mDefaultColumns, + UserHandle.USER_CURRENT); + int columnsLandscape = Settings.System.getIntForUser( + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, mDefaultColumns, + UserHandle.USER_CURRENT); + mTileAdapter.setColumnCount(isPortrait ? columns : columnsLandscape); + mLayout.setSpanCount(isPortrait ? columns : columnsLandscape); + updateColumnsMenu(); + } + + private void updateColumnsMenu() { + int columns = Settings.System.getIntForUser( + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, mDefaultColumns, + UserHandle.USER_CURRENT); + MenuItem menuItemThree = mToolbar.getMenu().findItem(R.id.menu_item_columns_three); + menuItemThree.setChecked(columns == 3); + MenuItem menuItemFour = mToolbar.getMenu().findItem(R.id.menu_item_columns_four); + menuItemFour.setChecked(columns == 4); + MenuItem menuItemFive = mToolbar.getMenu().findItem(R.id.menu_item_columns_five); + menuItemFive.setChecked(columns == 5); + + int columnsLandscape = Settings.System.getIntForUser( + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, mDefaultColumns, + UserHandle.USER_CURRENT); + menuItemFour = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_four); + menuItemFour.setChecked(columnsLandscape == 4); + menuItemFive = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_five); + menuItemFive.setChecked(columnsLandscape == 5); + MenuItem menuItemSix = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_six); + menuItemSix.setChecked(columnsLandscape == 6); + MenuItem menuItemSeven = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_seven); + menuItemSeven.setChecked(columnsLandscape == 7); + MenuItem menuItemEight = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_eight); + menuItemEight.setChecked(columnsLandscape == 8); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 517c4b7599af..5a4f421b074d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -487,13 +487,18 @@ public void stopDrag() { } } - private final SpanSizeLookup mSizeLookup = new SpanSizeLookup() { + private class OmniSpanSizeLookup extends SpanSizeLookup { + private int mColumns = 3; @Override public int getSpanSize(int position) { final int type = getItemViewType(position); - return type == TYPE_EDIT || type == TYPE_DIVIDER ? 3 : 1; + return type == TYPE_EDIT || type == TYPE_DIVIDER ? mColumns : 1; } - }; + public void setColumnCount(int columns) { + mColumns = columns; + } + } + private final OmniSpanSizeLookup mSizeLookup = new OmniSpanSizeLookup(); private class TileItemDecoration extends ItemDecoration { private final ColorDrawable mDrawable; @@ -601,4 +606,8 @@ public boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHold public void onSwiped(ViewHolder viewHolder, int direction) { } }; + + public void setColumnCount(int columns) { + mSizeLookup.setColumnCount(columns); + } } From 524008776582f52cde534fd69d2ac1d7c66a753e Mon Sep 17 00:00:00 2001 From: maxwen Date: Thu, 21 Sep 2017 00:38:01 +0200 Subject: [PATCH 0079/1164] SystemUI: hide QS expand image on bigger column counts we neeeeed space Change-Id: I207d781e7e1094a8425de9f545a53a57d7001d5a Signed-off-by: Josh Fox(XlxFoXxlX) --- .../android/systemui/plugins/qs/QSTileView.java | 3 +++ .../com/android/systemui/qs/PagedTileLayout.java | 5 +++++ .../src/com/android/systemui/qs/QSPanel.java | 10 +++++++++- .../src/com/android/systemui/qs/QuickQSPanel.java | 5 +++++ .../src/com/android/systemui/qs/TileLayout.java | 5 +++++ .../systemui/qs/customize/QSCustomizer.java | 1 + .../android/systemui/qs/tileimpl/QSTileView.java | 15 ++++++++++++--- 7 files changed, 40 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java index 53f7e44bc25a..841b8331e3b4 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java @@ -50,4 +50,7 @@ public QSTileView(Context context) { public abstract void onStateChanged(State state); public abstract int getDetailY(); + public void setHideExpand(boolean value) { + // empty by default + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index fdfcae69df7f..4ffbcb41544f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -435,4 +435,9 @@ public void updateSettings() { } postDistributeTiles(); } + + @Override + public int getNumColumns() { + return mPages.get(0).getNumColumns(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index ba0360bfb7ba..0b058f5eee63 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -29,6 +29,7 @@ import android.os.Message; import android.service.quicksettings.Tile; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; @@ -105,11 +106,11 @@ public QSPanel(Context context, AttributeSet attrs) { R.layout.qs_paged_tile_layout, this, false); mTileLayout.setListening(mListening); addView((View) mTileLayout); + updateSettings(); mPanelPageIndicator = (PageIndicator) LayoutInflater.from(context).inflate( R.layout.qs_page_indicator, this, false); addView(mPanelPageIndicator); - updateSettings(); ((PagedTileLayout) mTileLayout).setPageIndicator(mPanelPageIndicator); mQsTileRevealController = new QSTileRevealController(mContext, this, @@ -132,6 +133,7 @@ protected void addDivider() { mDivider.setBackgroundColor(Utils.applyAlpha(mDivider.getAlpha(), getColorForState(mContext, Tile.STATE_ACTIVE))); addView(mDivider); + updateSettings(); } public View getDivider() { @@ -468,6 +470,7 @@ public void onAnnouncementRequested(CharSequence announcement) { r.callback = callback; r.tileView.init(r.tile); r.tile.refreshState(); + r.tileView.setHideExpand(mTileLayout.getNumColumns() > 4); mRecords.add(r); if (mTileLayout != null) { @@ -664,6 +667,7 @@ public interface QSTileLayout { boolean updateResources(); void updateSettings(); + int getNumColumns(); void setListening(boolean listening); @@ -673,6 +677,10 @@ default void setExpansion(float expansion) {} public void updateSettings() { if (mTileLayout != null) { mTileLayout.updateSettings(); + for (TileRecord r : mRecords) { + QSTileView v = r.tileView; + v.setHideExpand(mTileLayout.getNumColumns() > 4); + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 59f3a7a58c8d..ed269fc55d31 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -318,5 +318,10 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @Override public void updateSettings() { } + + @Override + public int getNumColumns() { + return getNumQuickTiles(mContext); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index 1a411e8d578e..239bb0f6eae4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -172,4 +172,9 @@ public void updateSettings() { requestLayout(); } } + + @Override + public int getNumColumns() { + return mColumns; + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index b61c728f2582..5cea6d845f33 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -139,6 +139,7 @@ public void onClick(View v) { mRecyclerView.setItemAnimator(animator); mLightBarController = Dependency.get(LightBarController.class); updateNavBackDrop(getResources().getConfiguration()); + updateSettings(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java index 91cd65259d73..9bb47d1e13df 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java @@ -46,6 +46,8 @@ public class QSTileView extends QSTileBaseView { private ViewGroup mLabelContainer; private View mExpandIndicator; private View mExpandSpace; + private boolean mHideEpxand; + private boolean mDualTarget; public QSTileView(Context context, QSIconView icon) { this(context, icon, false); @@ -126,9 +128,10 @@ protected void handleStateChanged(QSTile.State state) { : View.VISIBLE); } boolean dualTarget = DUAL_TARGET_ALLOWED && state.dualTarget; - mExpandIndicator.setVisibility(dualTarget ? View.VISIBLE : View.GONE); - mExpandSpace.setVisibility(dualTarget ? View.VISIBLE : View.GONE); - mLabelContainer.setContentDescription(dualTarget ? state.dualLabelContentDescription + mDualTarget = dualTarget; + mExpandIndicator.setVisibility((mDualTarget && !mHideEpxand) ? View.VISIBLE : View.GONE); + mExpandSpace.setVisibility((mDualTarget && !mHideEpxand) ? View.VISIBLE : View.GONE); + mLabelContainer.setContentDescription(mDualTarget ? state.dualLabelContentDescription : null); if (dualTarget != mLabelContainer.isClickable()) { mLabelContainer.setClickable(dualTarget); @@ -148,4 +151,10 @@ public void init(OnClickListener click, OnClickListener secondaryClick, mLabelContainer.setClickable(false); mLabelContainer.setLongClickable(false); } + + public void setHideExpand(boolean value) { + mHideEpxand = value; + mExpandIndicator.setVisibility((mDualTarget && !mHideEpxand) ? View.VISIBLE : View.GONE); + mExpandSpace.setVisibility((mDualTarget && !mHideEpxand) ? View.VISIBLE : View.GONE); + } } From 21100d1c02b54e1a3c9aa3d92b40603f8d0e5048 Mon Sep 17 00:00:00 2001 From: maxwen Date: Thu, 21 Sep 2017 03:29:56 +0200 Subject: [PATCH 0080/1164] SystemUI: add back QS hide label if enabled label click (secondary) will be reassigned to long click for dual target tiles Change-Id: I440362ab38057cbfba7750d75825179bd830c4e8 Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/provider/Settings.java | 11 +++- .../android/systemui/plugins/qs/QSTile.java | 1 + .../systemui/plugins/qs/QSTileView.java | 3 + .../SystemUI/res/menu/qs_customize_menu.xml | 9 +++ packages/SystemUI/res/values/aosip_dimens.xml | 22 ++++++++ .../SystemUI/res/values/aosip_strings.xml | 1 + .../android/systemui/qs/PagedTileLayout.java | 5 ++ .../src/com/android/systemui/qs/QSPanel.java | 26 ++++++++- .../com/android/systemui/qs/QuickQSPanel.java | 5 ++ .../com/android/systemui/qs/TileLayout.java | 25 +++++++-- .../systemui/qs/customize/QSCustomizer.java | 55 +++++++++++++------ .../systemui/qs/customize/TileAdapter.java | 9 +++ .../systemui/qs/tileimpl/QSTileImpl.java | 11 +++- .../systemui/qs/tileimpl/QSTileView.java | 5 ++ .../systemui/qs/tiles/BluetoothTile.java | 5 ++ .../android/systemui/qs/tiles/DndTile.java | 5 ++ .../android/systemui/qs/tiles/WifiTile.java | 5 ++ 17 files changed, 174 insertions(+), 29 deletions(-) create mode 100644 packages/SystemUI/res/values/aosip_dimens.xml diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index db503cd09873..c9604085b5e8 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4094,6 +4094,11 @@ public boolean validate(@Nullable String value) { * the setting value. See an example above. */ + /** + * @hide + */ + public static final String QS_LAYOUT_COLUMNS = "qs_layout_columns"; + /** * Number of qs columns on landscape orientation * @hide @@ -4101,9 +4106,10 @@ public boolean validate(@Nullable String value) { public static final String QS_LAYOUT_COLUMNS_LANDSCAPE = "qs_layout_columns_landscape"; /** + * Whether to display qs tile titles in the qs panel * @hide */ - public static final String QS_LAYOUT_COLUMNS = "qs_layout_columns"; + public static final String QS_TILE_TITLE_VISIBILITY = "qs_tile_title_visibility"; /** * Settings to backup. This is here so that it's in the same place as the settings @@ -4278,6 +4284,9 @@ public boolean validate(@Nullable String value) { PRIVATE_SETTINGS.add(EGG_MODE); PRIVATE_SETTINGS.add(SHOW_BATTERY_PERCENT); PRIVATE_SETTINGS.add(DISPLAY_COLOR_MODE); + PRIVATE_SETTINGS.add(QS_LAYOUT_COLUMNS); + PRIVATE_SETTINGS.add(QS_LAYOUT_COLUMNS_LANDSCAPE); + PRIVATE_SETTINGS.add(QS_TILE_TITLE_VISIBILITY); } /** diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java index 61f7fe8dc019..2d8aa2c301c7 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java @@ -67,6 +67,7 @@ public interface QSTile { CharSequence getTileLabel(); State getState(); + boolean isDualTarget(); default LogMaker populate(LogMaker logMaker) { return logMaker; diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java index 841b8331e3b4..6c4f84167777 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java @@ -53,4 +53,7 @@ public QSTileView(Context context) { public void setHideExpand(boolean value) { // empty by default } + public void setHideLabel(boolean value) { + // empty by default + } } diff --git a/packages/SystemUI/res/menu/qs_customize_menu.xml b/packages/SystemUI/res/menu/qs_customize_menu.xml index 33e76ce617dd..2681d8f9a919 100644 --- a/packages/SystemUI/res/menu/qs_customize_menu.xml +++ b/packages/SystemUI/res/menu/qs_customize_menu.xml @@ -27,11 +27,17 @@ limitations under the License. + + @@ -49,6 +55,9 @@ limitations under the License. android:checkable="true" /> + diff --git a/packages/SystemUI/res/values/aosip_dimens.xml b/packages/SystemUI/res/values/aosip_dimens.xml new file mode 100644 index 000000000000..56668d07bef7 --- /dev/null +++ b/packages/SystemUI/res/values/aosip_dimens.xml @@ -0,0 +1,22 @@ + + + + + + 48dp + + diff --git a/packages/SystemUI/res/values/aosip_strings.xml b/packages/SystemUI/res/values/aosip_strings.xml index cf7682f3b8d3..3d8f6174294a 100644 --- a/packages/SystemUI/res/values/aosip_strings.xml +++ b/packages/SystemUI/res/values/aosip_strings.xml @@ -27,5 +27,6 @@ 8 9 Reset + Show labels diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 4ffbcb41544f..d0265c10ea33 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -440,4 +440,9 @@ public void updateSettings() { public int getNumColumns() { return mPages.get(0).getNumColumns(); } + + @Override + public boolean isShowTitles() { + return mPages.get(0).isShowTitles(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 0b058f5eee63..58cb0a435a6e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -470,11 +470,11 @@ public void onAnnouncementRequested(CharSequence announcement) { r.callback = callback; r.tileView.init(r.tile); r.tile.refreshState(); - r.tileView.setHideExpand(mTileLayout.getNumColumns() > 4); mRecords.add(r); if (mTileLayout != null) { mTileLayout.addTile(r); + configureTile(r.tile, r.tileView); } return r; @@ -668,18 +668,38 @@ public interface QSTileLayout { boolean updateResources(); void updateSettings(); int getNumColumns(); + boolean isShowTitles(); void setListening(boolean listening); default void setExpansion(float expansion) {} } + private void configureTile(QSTile t, QSTileView v) { + if (mTileLayout != null) { + v.setHideExpand(mTileLayout.getNumColumns() > 4); + v.setHideLabel(!mTileLayout.isShowTitles()); + if (t.isDualTarget()) { + if (!mTileLayout.isShowTitles()) { + v.setOnLongClickListener(view -> { + t.secondaryClick(); + return true; + }); + } else { + v.setOnLongClickListener(view -> { + t.longClick(); + return true; + }); + } + } + } + } + public void updateSettings() { if (mTileLayout != null) { mTileLayout.updateSettings(); for (TileRecord r : mRecords) { - QSTileView v = r.tileView; - v.setHideExpand(mTileLayout.getNumColumns() > 4); + configureTile(r.tile, r.tileView); } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index ed269fc55d31..413d2fc96efe 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -323,5 +323,10 @@ public void updateSettings() { public int getNumColumns() { return getNumQuickTiles(mContext); } + + @Override + public boolean isShowTitles() { + return false; + } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index 239bb0f6eae4..eb1dbe3bbc68 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -27,7 +27,7 @@ public class TileLayout extends ViewGroup implements QSTileLayout { protected int mCellMarginHorizontal; protected int mCellMarginVertical; protected int mSidePadding; - protected int mDefaultColumns; + protected boolean mShowTitles = true; protected final ArrayList mRecords = new ArrayList<>(); private int mCellMarginTop; @@ -158,17 +158,27 @@ private int getColumnStart(int column) { @Override public void updateSettings() { final Resources res = mContext.getResources(); - mDefaultColumns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns)); + int defaultColumns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns)); boolean isPortrait = res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; int columns = Settings.System.getIntForUser( - mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, mDefaultColumns, + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, defaultColumns, UserHandle.USER_CURRENT); int columnsLandscape = Settings.System.getIntForUser( - mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, mDefaultColumns, + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, defaultColumns, UserHandle.USER_CURRENT); - if (mColumns != (isPortrait ? columns : columnsLandscape)) { + boolean showTitles = Settings.System.getIntForUser( + mContext.getContentResolver(), Settings.System.QS_TILE_TITLE_VISIBILITY, 1, + UserHandle.USER_CURRENT) == 1; + + if (showTitles) { + mCellHeight = mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height); + } else { + mCellHeight = mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height_wo_label); + } + if (mColumns != (isPortrait ? columns : columnsLandscape) || mShowTitles != showTitles) { mColumns = isPortrait ? columns : columnsLandscape; + mShowTitles = showTitles; requestLayout(); } } @@ -177,4 +187,9 @@ public void updateSettings() { public int getNumColumns() { return mColumns; } + + @Override + public boolean isShowTitles() { + return mShowTitles; + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 5cea6d845f33..c92808259425 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -86,7 +86,6 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene private boolean mIsShowingNavBackdrop; private GridLayoutManager mLayout; - private int mDefaultColumns; private Menu mColumnsSubMenu; private Menu mColumnsLandscapeSubMenu; @@ -117,20 +116,24 @@ public void onClick(View v) { if (menuItemLand != null) { mColumnsLandscapeSubMenu = menuItemLand.getSubMenu(); } - updateColumnsMenu(); + int qsTitlesValue = Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.QS_TILE_TITLE_VISIBILITY, 1, + UserHandle.USER_CURRENT); + MenuItem qsTitlesMenuItem = mToolbar.getMenu().findItem(R.id.menu_item_titles); + qsTitlesMenuItem.setChecked(qsTitlesValue == 1); int accentColor = Utils.getColorAttr(context, android.R.attr.colorAccent); mToolbar.setTitleTextColor(accentColor); mToolbar.getNavigationIcon().setTint(accentColor); mToolbar.getOverflowIcon().setTint(accentColor); mToolbar.setTitle(R.string.qs_edit); - mDefaultColumns = Math.max(1, + int defaultColumns = Math.max(1, mContext.getResources().getInteger(R.integer.quick_settings_num_columns)); mRecyclerView = (RecyclerView) findViewById(android.R.id.list); mTileAdapter = new TileAdapter(getContext()); mTileQueryHelper = new TileQueryHelper(context, mTileAdapter); mRecyclerView.setAdapter(mTileAdapter); mTileAdapter.getItemTouchHelper().attachToRecyclerView(mRecyclerView); - mLayout = new GridLayoutManager(getContext(), mDefaultColumns); + mLayout = new GridLayoutManager(getContext(), defaultColumns); mLayout.setSpanSizeLookup(mTileAdapter.getSizeLookup()); mRecyclerView.setLayoutManager(mLayout); mRecyclerView.addItemDecoration(mTileAdapter.getItemDecoration()); @@ -267,6 +270,14 @@ public boolean onMenuItemClick(MenuItem item) { Settings.System.putIntForUser(mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, 5, UserHandle.USER_CURRENT); break; + case R.id.menu_item_columns_six: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS, 6, UserHandle.USER_CURRENT); + break; + case R.id.menu_item_columns_landscape_three: + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, 3, UserHandle.USER_CURRENT); + break; case R.id.menu_item_columns_landscape_four: Settings.System.putIntForUser(mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, 4, UserHandle.USER_CURRENT); @@ -287,6 +298,12 @@ public boolean onMenuItemClick(MenuItem item) { Settings.System.putIntForUser(mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, 8, UserHandle.USER_CURRENT); break; + case R.id.menu_item_titles: + item.setChecked(!item.isChecked()); + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.QS_TILE_TITLE_VISIBILITY, item.isChecked() ? 1 : 0, + UserHandle.USER_CURRENT); + break; } updateSettings(); return false; @@ -299,13 +316,6 @@ private void reset() { tiles.add(tile); } mTileAdapter.resetTileSpecs(mHost, tiles); - Settings.System.putIntForUser(mContext.getContentResolver(), - Settings.System.QS_LAYOUT_COLUMNS, mDefaultColumns, - UserHandle.USER_CURRENT); - Settings.System.putIntForUser(mContext.getContentResolver(), - Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, mDefaultColumns, - UserHandle.USER_CURRENT); - updateSettings(); } private void setTileSpecs() { @@ -399,20 +409,25 @@ public void updateSettings() { final Resources res = mContext.getResources(); boolean isPortrait = res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; + int defaultColumns = Math.max(1, mContext.getResources().getInteger(R.integer.quick_settings_num_columns)); int columns = Settings.System.getIntForUser( - mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, mDefaultColumns, + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, defaultColumns, UserHandle.USER_CURRENT); int columnsLandscape = Settings.System.getIntForUser( - mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, mDefaultColumns, + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, defaultColumns, UserHandle.USER_CURRENT); + boolean showTitles = Settings.System.getIntForUser( + mContext.getContentResolver(), Settings.System.QS_TILE_TITLE_VISIBILITY, 1, + UserHandle.USER_CURRENT) == 1; mTileAdapter.setColumnCount(isPortrait ? columns : columnsLandscape); + mTileAdapter.setHideLabel(!showTitles); mLayout.setSpanCount(isPortrait ? columns : columnsLandscape); - updateColumnsMenu(); + updateColumnsMenu(defaultColumns); } - private void updateColumnsMenu() { + private void updateColumnsMenu(int defaultColumns) { int columns = Settings.System.getIntForUser( - mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, mDefaultColumns, + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS, defaultColumns, UserHandle.USER_CURRENT); MenuItem menuItemThree = mToolbar.getMenu().findItem(R.id.menu_item_columns_three); menuItemThree.setChecked(columns == 3); @@ -420,15 +435,19 @@ private void updateColumnsMenu() { menuItemFour.setChecked(columns == 4); MenuItem menuItemFive = mToolbar.getMenu().findItem(R.id.menu_item_columns_five); menuItemFive.setChecked(columns == 5); + MenuItem menuItemSix = mToolbar.getMenu().findItem(R.id.menu_item_columns_six); + menuItemSix.setChecked(columns == 6); int columnsLandscape = Settings.System.getIntForUser( - mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, mDefaultColumns, + mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, defaultColumns, UserHandle.USER_CURRENT); + menuItemThree = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_three); + menuItemThree.setChecked(columnsLandscape == 3); menuItemFour = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_four); menuItemFour.setChecked(columnsLandscape == 4); menuItemFive = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_five); menuItemFive.setChecked(columnsLandscape == 5); - MenuItem menuItemSix = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_six); + menuItemSix = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_six); menuItemSix.setChecked(columnsLandscape == 6); MenuItem menuItemSeven = mToolbar.getMenu().findItem(R.id.menu_item_columns_landscape_seven); menuItemSeven.setChecked(columnsLandscape == 7); diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 5a4f421b074d..fcc35cb1cdea 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -89,6 +89,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta private int mAccessibilityAction = ACTION_NONE; private int mAccessibilityFromIndex; private QSTileHost mHost; + private boolean mHideLabel; public TileAdapter(Context context) { mContext = context; @@ -279,6 +280,7 @@ public void onLayoutChange(View v, int left, int top, int right, int bottom, } holder.mTileView.handleStateChanged(info.state); holder.mTileView.setShowAppLabel(position > mEditIndex && !info.isSystem); + holder.mTileView.setHideLabel(mHideLabel); final boolean selectable = mAccessibilityAction == ACTION_NONE || position < mEditIndex; if (!(mAccessibilityManager.isTouchExplorationEnabled() && selectable)) { @@ -610,4 +612,11 @@ public void onSwiped(ViewHolder viewHolder, int direction) { public void setColumnCount(int columns) { mSizeLookup.setColumnCount(columns); } + + public void setHideLabel(boolean value) { + if (mHideLabel != value) { + mHideLabel = value; + notifyDataSetChanged(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 834feb7781ea..7fa7506d52bc 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -93,6 +93,11 @@ public abstract class QSTileImpl implements QSTile { abstract protected void handleUpdateState(TState state, Object arg); + @Override + public boolean isDualTarget() { + return false; + } + /** * Declare the category of this tile. * @@ -260,8 +265,10 @@ protected void handleSecondaryClick() { } protected void handleLongClick() { - Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard( - getLongClickIntent(), 0); + if (getLongClickIntent() != null) { + Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard( + getLongClickIntent(), 0); + } } public abstract Intent getLongClickIntent(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java index 9bb47d1e13df..b0f7c3f700fb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java @@ -20,6 +20,7 @@ import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; +import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -157,4 +158,8 @@ public void setHideExpand(boolean value) { mExpandIndicator.setVisibility((mDualTarget && !mHideEpxand) ? View.VISIBLE : View.GONE); mExpandSpace.setVisibility((mDualTarget && !mHideEpxand) ? View.VISIBLE : View.GONE); } + + public void setHideLabel(boolean value) { + mLabelContainer.setVisibility(value ? View.GONE : View.VISIBLE); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index cd0031173f8b..2c0b0eabe903 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -68,6 +68,11 @@ public BluetoothTile(QSHost host) { mDetailAdapter = (BluetoothDetailAdapter) createDetailAdapter(); } + @Override + public boolean isDualTarget() { + return true; + } + @Override public DetailAdapter getDetailAdapter() { return mDetailAdapter; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index 67900d93be9a..58a67d572d14 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -98,6 +98,11 @@ protected void handleDestroy() { } } + @Override + public boolean isDualTarget() { + return true; + } + public static void setVisible(Context context, boolean visible) { Prefs.putBoolean(context, Prefs.Key.DND_TILE_VISIBLE, visible); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index d8f7b71d58a5..a4606d201c6a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -71,6 +71,11 @@ public WifiTile(QSHost host) { mActivityStarter = Dependency.get(ActivityStarter.class); } + @Override + public boolean isDualTarget() { + return true; + } + @Override public SignalState newTileState() { return new SignalState(); From 520863993e0b0e095978ccea8b51ccd28650af9a Mon Sep 17 00:00:00 2001 From: Adin Kwok Date: Wed, 15 Aug 2018 22:28:08 -0700 Subject: [PATCH 0081/1164] SystemUI: change QS hide label preference Change-Id: I1157b4160999fdf97c5d808a8a118ec45aace186 Signed-off-by: Josh Fox(XlxFoXxlX) --- core/java/android/provider/Settings.java | 4 ++-- packages/SystemUI/res/values/aosip_strings.xml | 2 +- .../SystemUI/src/com/android/systemui/qs/TileLayout.java | 2 +- .../com/android/systemui/qs/customize/QSCustomizer.java | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index c9604085b5e8..fb63d411d9d5 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4109,7 +4109,7 @@ public boolean validate(@Nullable String value) { * Whether to display qs tile titles in the qs panel * @hide */ - public static final String QS_TILE_TITLE_VISIBILITY = "qs_tile_title_visibility"; + public static final String QS_TILE_HIDE_TITLE = "qs_tile_hide_title"; /** * Settings to backup. This is here so that it's in the same place as the settings @@ -4286,7 +4286,7 @@ public boolean validate(@Nullable String value) { PRIVATE_SETTINGS.add(DISPLAY_COLOR_MODE); PRIVATE_SETTINGS.add(QS_LAYOUT_COLUMNS); PRIVATE_SETTINGS.add(QS_LAYOUT_COLUMNS_LANDSCAPE); - PRIVATE_SETTINGS.add(QS_TILE_TITLE_VISIBILITY); + PRIVATE_SETTINGS.add(QS_TILE_HIDE_TITLE); } /** diff --git a/packages/SystemUI/res/values/aosip_strings.xml b/packages/SystemUI/res/values/aosip_strings.xml index 3d8f6174294a..635527b3d88e 100644 --- a/packages/SystemUI/res/values/aosip_strings.xml +++ b/packages/SystemUI/res/values/aosip_strings.xml @@ -27,6 +27,6 @@ 8 9 Reset - Show labels + Hide labels diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index eb1dbe3bbc68..d7bf0fa99312 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -168,7 +168,7 @@ public void updateSettings() { mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, defaultColumns, UserHandle.USER_CURRENT); boolean showTitles = Settings.System.getIntForUser( - mContext.getContentResolver(), Settings.System.QS_TILE_TITLE_VISIBILITY, 1, + mContext.getContentResolver(), Settings.System.QS_TILE_HIDE_TITLE, 1, UserHandle.USER_CURRENT) == 1; if (showTitles) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index c92808259425..d6520a02dc1d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -117,10 +117,10 @@ public void onClick(View v) { mColumnsLandscapeSubMenu = menuItemLand.getSubMenu(); } int qsTitlesValue = Settings.System.getIntForUser(mContext.getContentResolver(), - Settings.System.QS_TILE_TITLE_VISIBILITY, 1, + Settings.System.QS_TILE_HIDE_TITLE, 1, UserHandle.USER_CURRENT); MenuItem qsTitlesMenuItem = mToolbar.getMenu().findItem(R.id.menu_item_titles); - qsTitlesMenuItem.setChecked(qsTitlesValue == 1); + qsTitlesMenuItem.setChecked(qsTitlesValue != 1); int accentColor = Utils.getColorAttr(context, android.R.attr.colorAccent); mToolbar.setTitleTextColor(accentColor); mToolbar.getNavigationIcon().setTint(accentColor); @@ -301,7 +301,7 @@ public boolean onMenuItemClick(MenuItem item) { case R.id.menu_item_titles: item.setChecked(!item.isChecked()); Settings.System.putIntForUser(mContext.getContentResolver(), - Settings.System.QS_TILE_TITLE_VISIBILITY, item.isChecked() ? 1 : 0, + Settings.System.QS_TILE_HIDE_TITLE, item.isChecked() ? 0 : 1, UserHandle.USER_CURRENT); break; } @@ -417,7 +417,7 @@ public void updateSettings() { mContext.getContentResolver(), Settings.System.QS_LAYOUT_COLUMNS_LANDSCAPE, defaultColumns, UserHandle.USER_CURRENT); boolean showTitles = Settings.System.getIntForUser( - mContext.getContentResolver(), Settings.System.QS_TILE_TITLE_VISIBILITY, 1, + mContext.getContentResolver(), Settings.System.QS_TILE_HIDE_TITLE, 1, UserHandle.USER_CURRENT) == 1; mTileAdapter.setColumnCount(isPortrait ? columns : columnsLandscape); mTileAdapter.setHideLabel(!showTitles); From 70f7c745c2d26bbd561fc2379bca436a971a7afe Mon Sep 17 00:00:00 2001 From: Christian Oder Date: Mon, 29 Aug 2016 00:49:52 +0200 Subject: [PATCH 0082/1164] base: Show SystemUI Tuner by default Change-Id: I8c6a723de52766e6cd30a935090bcc8de81d467f Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- packages/SystemUI/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index c1e545891b5e..b9aee0eb45a7 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -280,7 +280,7 @@ android:exported="true" /> Date: Sun, 27 Aug 2017 17:24:37 -0400 Subject: [PATCH 0083/1164] qs: Hide tuner icon Change-Id: I0ef09f8875deb57fa74a945bf8d6d06788fd43a9 Signed-off-by: Joe Maples Signed-off-by: Josh Fox(XlxFoXxlX) --- packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java index b7907a605ca5..c85ae843f9de 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java @@ -279,8 +279,6 @@ public void updateEverything() { private void updateVisibilities() { mSettingsContainer.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE); - mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility( - TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE); final boolean isDemo = UserManager.isDeviceInDemoMode(mContext); mMultiUserSwitch.setVisibility(showUserSwitcher(isDemo) ? View.VISIBLE : View.INVISIBLE); mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); From bb816b890ee7b716557890957a6eb9f3daa2db61 Mon Sep 17 00:00:00 2001 From: maxwen Date: Thu, 25 Jan 2018 00:41:00 +0100 Subject: [PATCH 0084/1164] SystemUI: bring back tuner navbar editor from N Change-Id: I1b47c354f19b134af0ff39018b843c01864827bb Signed-off-by: mydongistiny Signed-off-by: Josh Fox(XlxFoXxlX) --- .../SystemUI/res/drawable/ic_menu_reset.xml | 9 + .../SystemUI/res/layout/nav_bar_tuner.xml | 28 + .../SystemUI/res/layout/nav_width_view.xml | 3 +- .../SystemUI/res/menu/nav_bar_tuner_menu.xml | 22 + .../SystemUI/res/values/aosip_strings.xml | 22 + packages/SystemUI/res/xml/nav_bar_tuner.xml | 9 +- .../phone/NavigationBarInflaterView.java | 4 +- .../tuner/KeycodeSelectionHelper.java | 83 +++ .../android/systemui/tuner/NavBarEditor.java | 639 ++++++++++++++++++ .../android/systemui/tuner/NavBarTuner.java | 4 +- 10 files changed, 815 insertions(+), 8 deletions(-) create mode 100644 packages/SystemUI/res/drawable/ic_menu_reset.xml create mode 100644 packages/SystemUI/res/layout/nav_bar_tuner.xml create mode 100644 packages/SystemUI/res/menu/nav_bar_tuner_menu.xml create mode 100644 packages/SystemUI/src/com/android/systemui/tuner/KeycodeSelectionHelper.java create mode 100644 packages/SystemUI/src/com/android/systemui/tuner/NavBarEditor.java diff --git a/packages/SystemUI/res/drawable/ic_menu_reset.xml b/packages/SystemUI/res/drawable/ic_menu_reset.xml new file mode 100644 index 000000000000..38066b8e31ba --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_menu_reset.xml @@ -0,0 +1,9 @@ + + + diff --git a/packages/SystemUI/res/layout/nav_bar_tuner.xml b/packages/SystemUI/res/layout/nav_bar_tuner.xml new file mode 100644 index 000000000000..3aacb074c8ee --- /dev/null +++ b/packages/SystemUI/res/layout/nav_bar_tuner.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/packages/SystemUI/res/layout/nav_width_view.xml b/packages/SystemUI/res/layout/nav_width_view.xml index 6a72faf9fbea..227b63b7ef3b 100644 --- a/packages/SystemUI/res/layout/nav_width_view.xml +++ b/packages/SystemUI/res/layout/nav_width_view.xml @@ -22,5 +22,4 @@ android:id="@+id/seekbar" android:layout_height="wrap_content" android:layout_width="match_parent" - android:paddingTop="12dp" - android:paddingBottom="4dp" /> + android:padding="16dp" /> diff --git a/packages/SystemUI/res/menu/nav_bar_tuner_menu.xml b/packages/SystemUI/res/menu/nav_bar_tuner_menu.xml new file mode 100644 index 000000000000..a866a5da26c6 --- /dev/null +++ b/packages/SystemUI/res/menu/nav_bar_tuner_menu.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/packages/SystemUI/res/values/aosip_strings.xml b/packages/SystemUI/res/values/aosip_strings.xml index 635527b3d88e..0d96c1692974 100644 --- a/packages/SystemUI/res/values/aosip_strings.xml +++ b/packages/SystemUI/res/values/aosip_strings.xml @@ -29,4 +29,26 @@ Reset Hide labels + + Preview + Keycode + No home button found + A home button is required to be able to navigate this device. Please add a home button before saving. + The Clipboard allows items to be dragged directly to the clipboard. Items can also be dragged directly out of the clipboard when present. + Keycode buttons allow keyboard keys to be added to the Navigation Bar. When pressed they emulate the selected keyboard key. First the key must be selected for the button, followed by an image to be shown on the button. + Start + Center + End + Spacer + Menu / Keyboard Switcher + Select button to add + Add button + Save + Reset + Select Keyboard Button + Left + Right + Editor + Configure navigaton bar + diff --git a/packages/SystemUI/res/xml/nav_bar_tuner.xml b/packages/SystemUI/res/xml/nav_bar_tuner.xml index 68e8fad1e24a..6ac24d456f28 100644 --- a/packages/SystemUI/res/xml/nav_bar_tuner.xml +++ b/packages/SystemUI/res/xml/nav_bar_tuner.xml @@ -26,7 +26,7 @@ android:entries="@array/nav_bar_layouts" android:entryValues="@array/nav_bar_layouts_values" /> - + android:title="@string/right_icon" />--> + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index e6f2c33c33d2..84d530aace58 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -79,8 +79,8 @@ public class NavigationBarInflaterView extends FrameLayout public static final String KEY_CODE_START = "("; public static final String KEY_IMAGE_DELIM = ":"; public static final String KEY_CODE_END = ")"; - private static final String WEIGHT_SUFFIX = "W"; - private static final String WEIGHT_CENTERED_SUFFIX = "WC"; + public static final String WEIGHT_SUFFIX = "W"; + public static final String WEIGHT_CENTERED_SUFFIX = "WC"; private final List mPlugins = new ArrayList<>(); private final Display mDisplay; diff --git a/packages/SystemUI/src/com/android/systemui/tuner/KeycodeSelectionHelper.java b/packages/SystemUI/src/com/android/systemui/tuner/KeycodeSelectionHelper.java new file mode 100644 index 000000000000..096ecc0b8bae --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/tuner/KeycodeSelectionHelper.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui.tuner; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.view.KeyEvent; + +import com.android.systemui.R; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; + +public class KeycodeSelectionHelper { + + private static final ArrayList mKeycodeStrings = new ArrayList<>(); + private static final ArrayList mKeycodes = new ArrayList<>(); + + private static final String KEYCODE_STRING = "KEYCODE_"; + + static { + Class cls = KeyEvent.class; + for (Field field : cls.getDeclaredFields()) { + if (Modifier.isStatic(field.getModifiers()) + && field.getName().startsWith(KEYCODE_STRING) + && field.getType().equals(int.class)) { + try { + mKeycodeStrings.add(formatString(field.getName())); + mKeycodes.add((Integer) field.get(null)); + } catch (IllegalAccessException e) { + } + } + } + } + + // Force the string into something somewhat readable. + private static String formatString(String name) { + StringBuilder str = new StringBuilder(name.replace(KEYCODE_STRING, "").replace("_", " ") + .toLowerCase()); + for (int i = 0; i < str.length(); i++) { + if (i == 0 || str.charAt(i - 1) == ' ') { + str.setCharAt(i, Character.toUpperCase(str.charAt(i))); + } + } + return str.toString(); + } + + public static void showKeycodeSelect(Context context, final OnSelectionComplete listener) { + new AlertDialog.Builder(context) + .setTitle(R.string.select_keycode) + .setItems(mKeycodeStrings.toArray(new String[0]), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + listener.onSelectionComplete(mKeycodes.get(which)); + } + }).show(); + } + + public static Intent getSelectImageIntent() { + return new Intent(Intent.ACTION_OPEN_DOCUMENT).addCategory(Intent.CATEGORY_OPENABLE) + .setType("image/*"); + } + + public interface OnSelectionComplete { + void onSelectionComplete(int code); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/tuner/NavBarEditor.java b/packages/SystemUI/src/com/android/systemui/tuner/NavBarEditor.java new file mode 100644 index 000000000000..1329ec9ae998 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/tuner/NavBarEditor.java @@ -0,0 +1,639 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui.tuner; + +import android.annotation.Nullable; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Fragment; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.ColorStateList; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.helper.ItemTouchHelper; +import android.util.Log; +import android.util.TypedValue; +import android.view.Display; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.Surface; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.TextView; + +import com.android.systemui.R; + +import java.util.ArrayList; +import java.util.List; + +import com.android.systemui.Dependency; + +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.BACK; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.BUTTON_SEPARATOR; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.CLIPBOARD; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.GRAVITY_SEPARATOR; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.HOME; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.KEY; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.KEY_CODE_END; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.KEY_CODE_START; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.KEY_IMAGE_DELIM; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.MENU_IME; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.NAVSPACE; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.NAV_BAR_VIEWS; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.RECENT; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.SIZE_MOD_END; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.SIZE_MOD_START; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.WEIGHT_SUFFIX; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.WEIGHT_CENTERED_SUFFIX; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.LEFT; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.RIGHT; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.extractButton; +import static com.android.systemui.statusbar.phone.NavigationBarInflaterView.extractSize; + +public class NavBarEditor extends TunerPreferenceFragment implements TunerService.Tunable { + private static final String TAG = "NavBarEditor"; + private static final int READ_REQUEST = 42; + + private static final float PREVIEW_SCALE = .95f; + private static final float PREVIEW_SCALE_LANDSCAPE = .75f; + + private NavBarAdapter mNavBarAdapter; + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + } + + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, + Bundle savedInstanceState) { + final View view = inflater.inflate(R.layout.nav_bar_tuner, container, false); + getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); + return view; + } + + private void notifyChanged() { + Settings.Secure.putString(getContext().getContentResolver(), + NAV_BAR_VIEWS, mNavBarAdapter.getNavString()); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + RecyclerView recyclerView = (RecyclerView) view.findViewById(android.R.id.list); + final Context context = getContext(); + recyclerView.setLayoutManager(new LinearLayoutManager(context)); + mNavBarAdapter = new NavBarAdapter(context); + recyclerView.setAdapter(mNavBarAdapter); + recyclerView.addItemDecoration(new Dividers(context)); + final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(mNavBarAdapter.mCallbacks); + mNavBarAdapter.setTouchHelper(itemTouchHelper); + itemTouchHelper.attachToRecyclerView(recyclerView); + + Dependency.get(TunerService.class).addTunable(this, NAV_BAR_VIEWS); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + Dependency.get(TunerService.class).removeTunable(this); + } + + @Override + public void onTuningChanged(String key, String navLayout) { + if (!NAV_BAR_VIEWS.equals(key)) return; + Context context = getContext(); + if (navLayout == null) { + navLayout = context.getString(R.string.config_navBarLayout); + } + String[] views = navLayout.split(GRAVITY_SEPARATOR); + String[] groups = new String[] { NavBarAdapter.START, NavBarAdapter.CENTER, + NavBarAdapter.END}; + CharSequence[] groupLabels = new String[] { getString(R.string.start), + getString(R.string.center), getString(R.string.end) }; + mNavBarAdapter.clear(); + for (int i = 0; i < 3; i++) { + mNavBarAdapter.addButton(groups[i], groupLabels[i]); + for (String button : views[i].split(BUTTON_SEPARATOR)) { + mNavBarAdapter.addButton(button, getLabel(button, context)); + } + } + mNavBarAdapter.addButton(NavBarAdapter.ADD, getString(R.string.add_button)); + setHasOptionsMenu(true); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.nav_bar_tuner_menu, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.nav_bar_reset) { + Settings.Secure.putString(getContext().getContentResolver(), + NAV_BAR_VIEWS, null); + return true; + } else if (item.getItemId() == android.R.id.home) { + getActivity().onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); + } + + private static CharSequence getLabel(String button, Context context) { + if (button.startsWith(HOME)) { + return context.getString(R.string.accessibility_home); + } else if (button.startsWith(BACK)) { + return context.getString(R.string.accessibility_back); + } else if (button.startsWith(RECENT)) { + return context.getString(R.string.accessibility_recent); + } else if (button.startsWith(NAVSPACE)) { + return context.getString(R.string.space); + } else if (button.startsWith(LEFT)) { + return context.getString(R.string.left); + } else if (button.startsWith(RIGHT)) { + return context.getString(R.string.right); + /*} else if (button.equals(MENU_IME)) { + return context.getString(R.string.menu_ime);*/ + /*} else if (button.startsWith(CLIPBOARD)) { + return context.getString(R.string.clipboard);*/ + /*} else if (button.startsWith(KEY)) { + return context.getString(R.string.keycode);*/ + } + return button; + } + + private static class Holder extends RecyclerView.ViewHolder { + private TextView title; + + public Holder(View itemView) { + super(itemView); + title = (TextView) itemView.findViewById(android.R.id.title); + } + } + + private static class Dividers extends RecyclerView.ItemDecoration { + private final Drawable mDivider; + + public Dividers(Context context) { + TypedValue value = new TypedValue(); + context.getTheme().resolveAttribute(android.R.attr.listDivider, value, true); + mDivider = context.getDrawable(value.resourceId); + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + super.onDraw(c, parent, state); + final int left = parent.getPaddingLeft(); + final int right = parent.getWidth() - parent.getPaddingRight(); + + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int top = child.getBottom() + params.bottomMargin; + final int bottom = top + mDivider.getIntrinsicHeight(); + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + } + + /*private void selectImage() { + startActivityForResult(KeycodeSelectionHelper.getSelectImageIntent(), READ_REQUEST); + }*/ + + /*@Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == READ_REQUEST && resultCode == Activity.RESULT_OK && data != null) { + final Uri uri = data.getData(); + final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION); + getContext().getContentResolver().takePersistableUriPermission(uri, takeFlags); + mNavBarAdapter.onImageSelected(uri); + } else { + super.onActivityResult(requestCode, resultCode, data); + } + }*/ + + private class NavBarAdapter extends RecyclerView.Adapter + implements View.OnClickListener { + + private static final String START = "start"; + private static final String CENTER = "center"; + private static final String END = "end"; + private static final String ADD = "add"; + + private static final int ADD_ID = 0; + private static final int BUTTON_ID = 1; + private static final int CATEGORY_ID = 2; + + private List mButtons = new ArrayList<>(); + private List mLabels = new ArrayList<>(); + private int mCategoryLayout; + private int mButtonLayout; + private ItemTouchHelper mTouchHelper; + + // Stored keycode while we wait for image selection on a KEY. + private int mKeycode; + + public NavBarAdapter(Context context) { + TypedArray attrs = context.getTheme().obtainStyledAttributes(null, + android.R.styleable.Preference, android.R.attr.preferenceStyle, 0); + mButtonLayout = attrs.getResourceId(android.R.styleable.Preference_layout, 0); + attrs = context.getTheme().obtainStyledAttributes(null, + android.R.styleable.Preference, android.R.attr.preferenceCategoryStyle, 0); + mCategoryLayout = attrs.getResourceId(android.R.styleable.Preference_layout, 0); + } + + public void setTouchHelper(ItemTouchHelper itemTouchHelper) { + mTouchHelper = itemTouchHelper; + } + + public void clear() { + mButtons.clear(); + mLabels.clear(); + notifyDataSetChanged(); + } + + public void addButton(String button, CharSequence label) { + mButtons.add(button); + mLabels.add(label); + notifyItemInserted(mLabels.size() - 1); + } + + public boolean hasHomeButton() { + final int N = mButtons.size(); + for (int i = 0; i < N; i++) { + if (mButtons.get(i).startsWith(HOME)) { + return true; + } + } + return false; + } + + private String getNavString() { + StringBuilder builder = new StringBuilder(); + for (int i = 1; i < mButtons.size() - 1; i++) { + String button = mButtons.get(i); + if (button.equals(CENTER) || button.equals(END)) { + if (builder.length() == 0 || builder.toString().endsWith(GRAVITY_SEPARATOR)) { + // No start or center buttons, fill with a space. + builder.append(NAVSPACE); + } + builder.append(GRAVITY_SEPARATOR); + continue; + } else if (builder.length() != 0 && !builder.toString().endsWith( + GRAVITY_SEPARATOR)) { + builder.append(BUTTON_SEPARATOR); + } + builder.append(button); + } + if (builder.toString().endsWith(GRAVITY_SEPARATOR)) { + // No end buttons, fill with space. + builder.append(NAVSPACE); + } + return builder.toString(); + } + + @Override + public int getItemViewType(int position) { + String button = mButtons.get(position); + if (button.equals(START) || button.equals(CENTER) || button.equals(END)) { + return CATEGORY_ID; + } + if (button.equals(ADD)) { + return ADD_ID; + } + return BUTTON_ID; + } + + @Override + public Holder onCreateViewHolder(ViewGroup parent, int viewType) { + final Context context = parent.getContext(); + final LayoutInflater inflater = LayoutInflater.from(context); + final View view = inflater.inflate(getLayoutId(viewType), parent, false); + if (viewType == BUTTON_ID) { + inflater.inflate(R.layout.nav_control_widget, + (ViewGroup) view.findViewById(android.R.id.widget_frame)); + } + return new Holder(view); + } + + private int getLayoutId(int viewType) { + if (viewType == CATEGORY_ID) { + return mCategoryLayout; + } + return mButtonLayout; + } + + @Override + public void onBindViewHolder(Holder holder, int position) { + holder.title.setText(mLabels.get(position)); + if (holder.getItemViewType() == BUTTON_ID) { + bindButton(holder, position); + } else if (holder.getItemViewType() == ADD_ID) { + bindAdd(holder); + } + } + + private void bindAdd(Holder holder) { + TypedValue value = new TypedValue(); + final Context context = holder.itemView.getContext(); + context.getTheme().resolveAttribute(android.R.attr.colorAccent, value, true); + final ImageView icon = (ImageView) holder.itemView.findViewById(android.R.id.icon); + icon.setImageResource(R.drawable.ic_add); + icon.setImageTintList(ColorStateList.valueOf(context.getColor(value.resourceId))); + holder.itemView.findViewById(android.R.id.summary).setVisibility(View.GONE); + holder.itemView.setClickable(true); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showAddDialog(v.getContext()); + } + }); + } + + private void bindButton(final Holder holder, int position) { + final Context context = holder.itemView.getContext(); + holder.itemView.findViewById(android.R.id.icon_frame).setVisibility(View.GONE); + holder.itemView.findViewById(android.R.id.summary).setVisibility(View.GONE); + + if (mLabels.get(position).equals(context.getString(R.string.accessibility_home))) { + holder.itemView.findViewById(R.id.close).setVisibility(View.INVISIBLE); + } else { + holder.itemView.findViewById(R.id.close).setVisibility(View.VISIBLE); + bindClick(holder.itemView.findViewById(R.id.close), holder); + } + bindClick(holder.itemView.findViewById(R.id.width), holder); + holder.itemView.findViewById(R.id.drag).setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + mTouchHelper.startDrag(holder); + return true; + } + }); + } + + private void showAddDialog(final Context context) { + final String[] options = new String[] { + BACK, HOME, RECENT, NAVSPACE, LEFT, RIGHT + }; + final CharSequence[] labels = new CharSequence[options.length]; + for (int i = 0; i < options.length; i++) { + labels[i] = getLabel(options[i], context); + } + new AlertDialog.Builder(context) + .setTitle(R.string.select_button) + .setItems(labels, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + /*if (KEY.equals(options[which])) { + showKeyDialogs(context); + } else {*/ + int index = mButtons.size() - 1; + //showAddedMessage(context, options[which]); + mButtons.add(index, options[which]); + mLabels.add(index, labels[which]); + + notifyItemInserted(index); + notifyChanged(); + //} + } + }).setNegativeButton(android.R.string.cancel, null) + .show(); + } + + /*private void onImageSelected(Uri uri) { + int index = mButtons.size() - 1; + mButtons.add(index, KEY + KEY_CODE_START + mKeycode + KEY_IMAGE_DELIM + uri.toString() + + KEY_CODE_END); + mLabels.add(index, getLabel(KEY, getContext())); + + notifyItemInserted(index); + notifyChanged(); + }*/ + + /*private void showKeyDialogs(final Context context) { + final KeycodeSelectionHelper.OnSelectionComplete listener = + new KeycodeSelectionHelper.OnSelectionComplete() { + @Override + public void onSelectionComplete(int code) { + mKeycode = code; + selectImage(); + } + }; + new AlertDialog.Builder(context) + .setTitle(R.string.keycode) + .setMessage(R.string.keycode_description) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + KeycodeSelectionHelper.showKeycodeSelect(context, listener); + } + }).show(); + }*/ + + /*private void showAddedMessage(Context context, String button) { + if (CLIPBOARD.equals(button)) { + new AlertDialog.Builder(context) + .setTitle(R.string.clipboard) + .setMessage(R.string.clipboard_description) + .setPositiveButton(android.R.string.ok, null) + .show(); + } + }*/ + + private void bindClick(View view, Holder holder) { + view.setOnClickListener(this); + view.setTag(holder); + } + + @Override + public void onClick(View v) { + Holder holder = (Holder) v.getTag(); + if (v.getId() == R.id.width) { + showWidthDialog(holder, v.getContext()); + } else if (v.getId() == R.id.close) { + int position = holder.getAdapterPosition(); + mButtons.remove(position); + mLabels.remove(position); + notifyItemRemoved(position); + notifyChanged(); + } + } + + private void showWidthDialog(final Holder holder, Context context) { + final String buttonSpec = mButtons.get(holder.getAdapterPosition()); + String sizeStr = extractSize(buttonSpec); + float amount = 1.0f; + if (sizeStr != null && sizeStr.contains(WEIGHT_SUFFIX)) { + amount = Float.parseFloat(sizeStr.substring(0, sizeStr.indexOf(WEIGHT_SUFFIX))); + } + final boolean isCenterButton = buttonSpec.startsWith(HOME) || buttonSpec.startsWith(BACK) || + buttonSpec.startsWith(RECENT); + final AlertDialog dialog = new AlertDialog.Builder(context) + .setTitle(R.string.adjust_button_width) + .setView(R.layout.nav_width_view) + .setNegativeButton(android.R.string.cancel, null).create(); + dialog.setButton(DialogInterface.BUTTON_POSITIVE, + context.getString(android.R.string.ok), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface d, int which) { + final String button = extractButton(buttonSpec); + SeekBar seekBar = (SeekBar) dialog.findViewById(R.id.seekbar); + float newAmount = getAmountValue(seekBar.getProgress()); + if (newAmount == 1f) { + mButtons.set(holder.getAdapterPosition(), button); + } else { + mButtons.set(holder.getAdapterPosition(), button + + SIZE_MOD_START + newAmount + (isCenterButton ? + WEIGHT_CENTERED_SUFFIX : WEIGHT_SUFFIX) + SIZE_MOD_END); + } + notifyChanged(); + } + }); + dialog.show(); + SeekBar seekBar = (SeekBar) dialog.findViewById(R.id.seekbar); + // Range is .25 - 1.75. + seekBar.setMax(6); + seekBar.setProgress(getProgressValue(amount)); + } + + private int getProgressValue(float amount) { + if (amount == .25f) { + return 0; + } + if (amount == .5f) { + return 1; + } + if (amount == .75f) { + return 2; + } + if (amount == 1f) { + return 3; + } + if (amount == 1.25f) { + return 4; + } + if (amount == 1.5f) { + return 5; + } + if (amount == 1.75f) { + return 6; + } + return 3; + } + + private float getAmountValue(int progress) { + if (progress == 0) { + return .25f; + } + if (progress == 1) { + return .5f; + } + if (progress == 2) { + return .75f; + } + if (progress == 3) { + return 1f; + } + if (progress == 4) { + return 1.25f; + } + if (progress == 5) { + return 1.5f; + } + if (progress == 6) { + return 1.75f; + } + return 1f; + } + + @Override + public int getItemCount() { + return mButtons.size(); + } + + private final ItemTouchHelper.Callback mCallbacks = new ItemTouchHelper.Callback() { + @Override + public boolean isLongPressDragEnabled() { + return false; + } + + @Override + public boolean isItemViewSwipeEnabled() { + return false; + } + + @Override + public int getMovementFlags(RecyclerView recyclerView, + RecyclerView.ViewHolder viewHolder) { + if (viewHolder.getItemViewType() != BUTTON_ID) { + return makeMovementFlags(0, 0); + } + int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; + return makeMovementFlags(dragFlags, 0); + } + + @Override + public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, + RecyclerView.ViewHolder target) { + int from = viewHolder.getAdapterPosition(); + int to = target.getAdapterPosition(); + if (to == 0) { + // Can't go above the top. + return false; + } + move(from, to, mButtons); + move(from, to, mLabels); + notifyChanged(); + notifyItemMoved(from, to); + return true; + } + + private void move(int from, int to, List list) { + list.add(from > to ? to : to + 1, list.get(from)); + list.remove(from > to ? from + 1 : from); + } + + @Override + public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { + // Don't care. + } + }; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java b/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java index eb0c89b06528..4a01a61ae8bb 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java @@ -88,8 +88,8 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.nav_bar_tuner); bindLayout((ListPreference) findPreference(LAYOUT)); - bindButton(NAV_BAR_LEFT, NAVSPACE, LEFT); - bindButton(NAV_BAR_RIGHT, MENU_IME_ROTATE, RIGHT); + //bindButton(NAV_BAR_LEFT, NAVSPACE, LEFT); + //bindButton(NAV_BAR_RIGHT, MENU_IME_ROTATE, RIGHT); } @Override From eae0a0ea3f2c937ac8b61092462e2b5c001f55da Mon Sep 17 00:00:00 2001 From: bryan2894 Date: Thu, 10 Nov 2016 01:37:27 -0500 Subject: [PATCH 0085/1164] SystemUI: add more buttons to NavBar Tuner @mydongistiny: -Updated for 8.1 with N Tuner -Fixed buttons for ButtonDispatcher -Added new search drawble Change-Id: I69ddeadb66b4ada6ff17e07258f9fd7d6f00d6e2 Signed-off-by: mydongistiny Signed-off-by: Josh Fox(XlxFoXxlX) --- .../res/drawable/ic_sysbar_search_default.xml | 9 ++++ .../res/layout/menu_ime_always_show.xml | 43 +++++++++++++++++++ packages/SystemUI/res/layout/search.xml | 26 +++++++++++ .../SystemUI/res/values/aosip_strings.xml | 2 + .../phone/NavigationBarInflaterView.java | 6 +++ .../statusbar/phone/NavigationBarView.java | 21 +++++++++ .../android/systemui/tuner/NavBarEditor.java | 10 ++++- .../android/systemui/tuner/NavBarTuner.java | 2 + 8 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 packages/SystemUI/res/drawable/ic_sysbar_search_default.xml create mode 100644 packages/SystemUI/res/layout/menu_ime_always_show.xml create mode 100644 packages/SystemUI/res/layout/search.xml diff --git a/packages/SystemUI/res/drawable/ic_sysbar_search_default.xml b/packages/SystemUI/res/drawable/ic_sysbar_search_default.xml new file mode 100644 index 000000000000..5b03b37d7010 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_sysbar_search_default.xml @@ -0,0 +1,9 @@ + + + diff --git a/packages/SystemUI/res/layout/menu_ime_always_show.xml b/packages/SystemUI/res/layout/menu_ime_always_show.xml new file mode 100644 index 000000000000..a87a0b551563 --- /dev/null +++ b/packages/SystemUI/res/layout/menu_ime_always_show.xml @@ -0,0 +1,43 @@ + + + + + + + diff --git a/packages/SystemUI/res/layout/search.xml b/packages/SystemUI/res/layout/search.xml new file mode 100644 index 000000000000..635aa99d6c2f --- /dev/null +++ b/packages/SystemUI/res/layout/search.xml @@ -0,0 +1,26 @@ + + + + diff --git a/packages/SystemUI/res/values/aosip_strings.xml b/packages/SystemUI/res/values/aosip_strings.xml index 0d96c1692974..abe539525fca 100644 --- a/packages/SystemUI/res/values/aosip_strings.xml +++ b/packages/SystemUI/res/values/aosip_strings.xml @@ -50,5 +50,7 @@ Right Editor Configure navigaton bar + Menu / Keyboard Switcher (always show) + Search diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index 84d530aace58..c0f18cead2ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -60,9 +60,11 @@ public class NavigationBarInflaterView extends FrameLayout public static final String NAV_BAR_RIGHT = "sysui_nav_bar_right"; public static final String MENU_IME_ROTATE = "menu_ime"; + public static final String MENU_IME_ALWAYS_SHOW = "menu_ime_always_show"; public static final String BACK = "back"; public static final String HOME = "home"; public static final String RECENT = "recent"; + public static final String SEARCH = "search"; public static final String NAVSPACE = "space"; public static final String CLIPBOARD = "clipboard"; public static final String KEY = "key"; @@ -387,6 +389,10 @@ private View createView(String buttonSpec, ViewGroup parent, LayoutInflater infl v = inflater.inflate(R.layout.recent_apps, parent, false); } else if (MENU_IME_ROTATE.equals(button)) { v = inflater.inflate(R.layout.menu_ime, parent, false); + } else if (MENU_IME_ALWAYS_SHOW.equals(button)) { + v = inflater.inflate(R.layout.menu_ime_always_show, parent, false); + } else if (SEARCH.equals(button)) { + v = inflater.inflate(R.layout.search, parent, false); } else if (NAVSPACE.equals(button)) { v = inflater.inflate(R.layout.nav_key_space, parent, false); } else if (CLIPBOARD.equals(button)) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 2a1f92f5edda..c22ddb6d0ec1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -127,6 +127,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener