diff options
Diffstat (limited to 'core/java/android')
23 files changed, 355 insertions, 122 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index be7287f..f63d13c 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2452,6 +2452,15 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeNoException(); return true; } + + case UPDATE_LOCK_TASK_PACKAGES_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + int userId = data.readInt(); + String[] packages = data.readStringArray(); + updateLockTaskPackages(userId, packages); + reply.writeNoException(); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -5687,5 +5696,18 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } + @Override + public void updateLockTaskPackages(int userId, String[] packages) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeInt(userId); + data.writeStringArray(packages); + mRemote.transact(UPDATE_LOCK_TASK_PACKAGES_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY); + reply.readException(); + data.recycle(); + reply.recycle(); + } + private IBinder mRemote; } diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 6ec5457..10dcd85 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -62,19 +62,19 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Process; import android.os.RemoteException; +import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; import android.util.Log; import android.view.Display; -import android.os.SystemProperties; + +import dalvik.system.VMRuntime; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.Preconditions; import com.android.internal.util.UserIcons; -import dalvik.system.VMRuntime; - import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -1363,7 +1363,17 @@ final class ApplicationPackageManager extends PackageManager { try { mPM.movePackage(packageName, observer, flags); } catch (RemoteException e) { - // Should never happen! + throw e.rethrowAsRuntimeException(); + } + } + + @Override + public void movePackageAndData(String packageName, String volumeUuid, + IPackageMoveObserver observer) { + try { + mPM.movePackageAndData(packageName, volumeUuid, observer); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); } } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index e20b0da..4a1d6ff 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -488,6 +488,7 @@ public interface IActivityManager extends IInterface { public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) throws RemoteException; + public void updateLockTaskPackages(int userId, String[] packages) throws RemoteException; /* * Private non-Binder interfaces @@ -823,4 +824,5 @@ public interface IActivityManager extends IInterface { int SET_DUMP_HEAP_DEBUG_LIMIT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+287; int DUMP_HEAP_FINISHED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+288; int SET_VOICE_KEEP_AWAKE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+289; + int UPDATE_LOCK_TASK_PACKAGES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+290; } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 514802e9..eea47b7 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2908,6 +2908,24 @@ public class Intent implements Parcelable, Cloneable { /** {@hide} */ public static final String EXTRA_SETTING_NEW_VALUE = "new_value"; + /** + * Activity Action: Process a piece of text. + * <p>Input: {@link #EXTRA_PROCESS_TEXT} contains the text to be processed. + * {@link #EXTRA_PROCESS_TEXT_READONLY} states if the resulting text will be read-only.</p> + * <p>Output: {@link #EXTRA_PROCESS_TEXT} contains the processed text.</p> + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_PROCESS_TEXT = "android.intent.action.PROCESS_TEXT"; + /** + * The name of the extra used to define the text to be processed. + */ + public static final String EXTRA_PROCESS_TEXT = "android.intent.extra.PROCESS_TEXT"; + /** + * The name of the extra used to define if the processed text will be used as read-only. + */ + public static final String EXTRA_PROCESS_TEXT_READONLY = + "android.intent.extra.PROCESS_TEXT_READONLY"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Standard intent categories (see addCategory()). diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 8567c01..5bdb7bb 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -459,6 +459,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public int largestWidthLimitDp = 0; /** {@hide} */ + public String volumeUuid; + /** {@hide} */ public String scanSourceDir; /** {@hide} */ public String scanPublicSourceDir; @@ -726,6 +728,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { requiresSmallestWidthDp = orig.requiresSmallestWidthDp; compatibleWidthLimitDp = orig.compatibleWidthLimitDp; largestWidthLimitDp = orig.largestWidthLimitDp; + volumeUuid = orig.volumeUuid; scanSourceDir = orig.scanSourceDir; scanPublicSourceDir = orig.scanPublicSourceDir; sourceDir = orig.sourceDir; @@ -778,6 +781,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeInt(requiresSmallestWidthDp); dest.writeInt(compatibleWidthLimitDp); dest.writeInt(largestWidthLimitDp); + dest.writeString(volumeUuid); dest.writeString(scanSourceDir); dest.writeString(scanPublicSourceDir); dest.writeString(sourceDir); @@ -829,6 +833,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { requiresSmallestWidthDp = source.readInt(); compatibleWidthLimitDp = source.readInt(); largestWidthLimitDp = source.readInt(); + volumeUuid = source.readString(); scanSourceDir = source.readString(); scanPublicSourceDir = source.readString(); sourceDir = source.readString(); diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl index ba62cd6..154ff85 100644 --- a/core/java/android/content/pm/IPackageInstaller.aidl +++ b/core/java/android/content/pm/IPackageInstaller.aidl @@ -44,7 +44,8 @@ interface IPackageInstaller { void registerCallback(IPackageInstallerCallback callback, int userId); void unregisterCallback(IPackageInstallerCallback callback); - void uninstall(String packageName, int flags, in IntentSender statusReceiver, int userId); + void uninstall(String packageName, String callerPackageName, int flags, + in IntentSender statusReceiver, int userId); void setPermissionsResult(int sessionId, boolean accepted); } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 649bb47..eed0df5 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -432,7 +432,8 @@ interface IPackageManager { PackageCleanItem nextPackageToClean(in PackageCleanItem lastPackage); void movePackage(String packageName, IPackageMoveObserver observer, int flags); - + void movePackageAndData(String packageName, String volumeUuid, IPackageMoveObserver observer); + boolean addPermissionAsync(in PermissionInfo info); boolean setInstallLocation(int loc); diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 80efd0b..b7ee82d 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -423,7 +423,7 @@ public class PackageInstaller { */ public void uninstall(@NonNull String packageName, @NonNull IntentSender statusReceiver) { try { - mInstaller.uninstall(packageName, 0, statusReceiver, mUserId); + mInstaller.uninstall(packageName, mInstallerPackageName, 0, statusReceiver, mUserId); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } @@ -887,6 +887,8 @@ public class PackageInstaller { public Uri referrerUri; /** {@hide} */ public String abiOverride; + /** {@hide} */ + public String volumeUuid; /** * Construct parameters for a new package install session. @@ -911,6 +913,7 @@ public class PackageInstaller { originatingUri = source.readParcelable(null); referrerUri = source.readParcelable(null); abiOverride = source.readString(); + volumeUuid = source.readString(); } /** @@ -1008,6 +1011,7 @@ public class PackageInstaller { pw.printPair("originatingUri", originatingUri); pw.printPair("referrerUri", referrerUri); pw.printPair("abiOverride", abiOverride); + pw.printPair("volumeUuid", volumeUuid); pw.println(); } @@ -1028,6 +1032,7 @@ public class PackageInstaller { dest.writeParcelable(originatingUri, flags); dest.writeParcelable(referrerUri, flags); dest.writeString(abiOverride); + dest.writeString(volumeUuid); } public static final Parcelable.Creator<SessionParams> diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 46d6ffb3..4c99d09 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -43,7 +43,9 @@ import android.os.Bundle; import android.os.Environment; import android.os.RemoteException; import android.os.UserHandle; +import android.os.storage.VolumeInfo; import android.util.AndroidException; + import com.android.internal.util.ArrayUtils; import java.io.File; @@ -339,15 +341,17 @@ public abstract class PackageManager { public static final int INSTALL_ALLOW_TEST = 0x00000004; /** - * Flag parameter for {@link #installPackage} to indicate that this - * package has to be installed on the sdcard. + * Flag parameter for {@link #installPackage} to indicate that this package + * must be installed to an ASEC on a {@link VolumeInfo#TYPE_PUBLIC}. + * * @hide */ public static final int INSTALL_EXTERNAL = 0x00000008; /** * Flag parameter for {@link #installPackage} to indicate that this package - * has to be installed on the sdcard. + * must be installed to internal storage. + * * @hide */ public static final int INSTALL_INTERNAL = 0x00000010; @@ -4099,8 +4103,12 @@ public abstract class PackageManager { * * @hide */ - public abstract void movePackage( - String packageName, IPackageMoveObserver observer, int flags); + @Deprecated + public abstract void movePackage(String packageName, IPackageMoveObserver observer, int flags); + + /** {@hide} */ + public abstract void movePackageAndData(String packageName, String volumeUuid, + IPackageMoveObserver observer); /** * Returns the device identity that verifiers can use to associate their scheme to a particular diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index f4ad434..c1e6a4d 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -604,7 +604,7 @@ public class PackageParser { public final static int PARSE_MUST_BE_APK = 1<<2; public final static int PARSE_IGNORE_PROCESSES = 1<<3; public final static int PARSE_FORWARD_LOCK = 1<<4; - public final static int PARSE_ON_SDCARD = 1<<5; + public final static int PARSE_EXTERNAL_STORAGE = 1<<5; public final static int PARSE_IS_SYSTEM_DIR = 1<<6; public final static int PARSE_IS_PRIVILEGED = 1<<7; public final static int PARSE_COLLECT_CERTIFICATES = 1<<8; @@ -1408,7 +1408,7 @@ public class PackageParser { } /* Set the global "on SD card" flag */ - if ((flags & PARSE_ON_SDCARD) != 0) { + if ((flags & PARSE_EXTERNAL_STORAGE) != 0) { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; } diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index b5eeb30..bc6d4ce 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -1284,14 +1284,12 @@ public final class Configuration implements Parcelable, Comparable<Configuration /** * Set the locale. This is the preferred way for setting up the locale (instead of using the - * direct accessor). This will also set the userLocale and layout direction according to - * the locale. + * direct accessor). This will also set the layout direction according to the locale. * * @param loc The locale. Can be null. */ public void setLocale(Locale loc) { locale = loc; - userSetLocale = true; setLayoutDirection(locale); } diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 3051926..508fdee 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -269,15 +269,6 @@ public abstract class BatteryStats implements Parcelable { public abstract long getTotalTimeLocked(long elapsedRealtimeUs, int which); /** - * Returns the total time in microseconds associated with this Timer since the - * 'mark' was last set. - * - * @param elapsedRealtimeUs current elapsed realtime of system in microseconds - * @return a time in microseconds - */ - public abstract long getTimeSinceMarkLocked(long elapsedRealtimeUs); - - /** * Temporary for debugging. */ public abstract void logState(Printer pw, String prefix); @@ -341,17 +332,7 @@ public abstract class BatteryStats implements Parcelable { * @return a Map from Strings to Uid.Pkg objects. */ public abstract ArrayMap<String, ? extends Pkg> getPackageStats(); - - /** - * Returns the time in milliseconds that this app kept the WiFi controller in the - * specified state <code>type</code>. - * @param type one of {@link #CONTROLLER_IDLE_TIME}, {@link #CONTROLLER_RX_TIME}, or - * {@link #CONTROLLER_TX_TIME}. - * @param which one of {@link #STATS_CURRENT}, {@link #STATS_SINCE_CHARGED}, or - * {@link #STATS_SINCE_UNPLUGGED}. - */ - public abstract long getWifiControllerActivity(int type, int which); - + /** * {@hide} */ @@ -1933,6 +1914,7 @@ public abstract class BatteryStats implements Parcelable { public static final int NETWORK_MOBILE_TX_DATA = 1; public static final int NETWORK_WIFI_RX_DATA = 2; public static final int NETWORK_WIFI_TX_DATA = 3; + public static final int NUM_NETWORK_ACTIVITY_TYPES = NETWORK_WIFI_TX_DATA + 1; public abstract long getNetworkActivityBytes(int type, int which); @@ -1941,25 +1923,10 @@ public abstract class BatteryStats implements Parcelable { public static final int CONTROLLER_IDLE_TIME = 0; public static final int CONTROLLER_RX_TIME = 1; public static final int CONTROLLER_TX_TIME = 2; - public static final int CONTROLLER_POWER_DRAIN = 3; - public static final int NUM_CONTROLLER_ACTIVITY_TYPES = CONTROLLER_POWER_DRAIN + 1; + public static final int CONTROLLER_ENERGY = 3; + public static final int NUM_CONTROLLER_ACTIVITY_TYPES = CONTROLLER_ENERGY + 1; - /** - * For {@link #CONTROLLER_IDLE_TIME}, {@link #CONTROLLER_RX_TIME}, and - * {@link #CONTROLLER_TX_TIME}, returns the time spent (in milliseconds) in the - * respective state. - * For {@link #CONTROLLER_POWER_DRAIN}, returns the power used by the controller in - * milli-ampere-milliseconds (mAms). - */ public abstract long getBluetoothControllerActivity(int type, int which); - - /** - * For {@link #CONTROLLER_IDLE_TIME}, {@link #CONTROLLER_RX_TIME}, and - * {@link #CONTROLLER_TX_TIME}, returns the time spent (in milliseconds) in the - * respective state. - * For {@link #CONTROLLER_POWER_DRAIN}, returns the power used by the controller in - * milli-ampere-milliseconds (mAms). - */ public abstract long getWifiControllerActivity(int type, int which); /** @@ -2651,7 +2618,7 @@ public abstract class BatteryStats implements Parcelable { label = "???"; } dumpLine(pw, uid, category, POWER_USE_ITEM_DATA, label, - BatteryStatsHelper.makemAh(bs.totalPowerMah)); + BatteryStatsHelper.makemAh(bs.value)); } } @@ -3297,13 +3264,6 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); - sb.append(" WiFi Energy use: ").append(BatteryStatsHelper.makemAh( - getWifiControllerActivity(CONTROLLER_POWER_DRAIN, which) / (double)(1000*60*60))); - sb.append(" mAh"); - pw.println(sb.toString()); - - sb.setLength(0); - sb.append(prefix); sb.append(" Bluetooth on: "); formatTimeMs(sb, bluetoothOnTime / 1000); sb.append("("); sb.append(formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)); sb.append(")"); @@ -3416,48 +3376,48 @@ public abstract class BatteryStats implements Parcelable { final BatterySipper bs = sippers.get(i); switch (bs.drainType) { case IDLE: - pw.print(prefix); pw.print(" Idle: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Idle: "); printmAh(pw, bs.value); pw.println(); break; case CELL: - pw.print(prefix); pw.print(" Cell standby: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Cell standby: "); printmAh(pw, bs.value); pw.println(); break; case PHONE: - pw.print(prefix); pw.print(" Phone calls: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Phone calls: "); printmAh(pw, bs.value); pw.println(); break; case WIFI: - pw.print(prefix); pw.print(" Wifi: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Wifi: "); printmAh(pw, bs.value); pw.println(); break; case BLUETOOTH: - pw.print(prefix); pw.print(" Bluetooth: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Bluetooth: "); printmAh(pw, bs.value); pw.println(); break; case SCREEN: - pw.print(prefix); pw.print(" Screen: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Screen: "); printmAh(pw, bs.value); pw.println(); break; case FLASHLIGHT: - pw.print(prefix); pw.print(" Flashlight: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Flashlight: "); printmAh(pw, bs.value); pw.println(); break; case APP: pw.print(prefix); pw.print(" Uid "); UserHandle.formatUid(pw, bs.uidObj.getUid()); - pw.print(": "); printmAh(pw, bs.totalPowerMah); pw.println(); + pw.print(": "); printmAh(pw, bs.value); pw.println(); break; case USER: pw.print(prefix); pw.print(" User "); pw.print(bs.userId); - pw.print(": "); printmAh(pw, bs.totalPowerMah); pw.println(); + pw.print(": "); printmAh(pw, bs.value); pw.println(); break; case UNACCOUNTED: - pw.print(prefix); pw.print(" Unaccounted: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Unaccounted: "); printmAh(pw, bs.value); pw.println(); break; case OVERCOUNTED: - pw.print(prefix); pw.print(" Over-counted: "); printmAh(pw, bs.totalPowerMah); + pw.print(prefix); pw.print(" Over-counted: "); printmAh(pw, bs.value); pw.println(); break; } diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 486f9b4..5a5d8b7 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -43,6 +43,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; /** @@ -231,8 +232,7 @@ public class StorageManager { mLooper = looper; mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount")); if (mMountService == null) { - Log.e(TAG, "Unable to connect to mount service! - is it running yet?"); - return; + throw new IllegalStateException("Failed to find running mount service"); } } @@ -442,6 +442,42 @@ public class StorageManager { } /** {@hide} */ + public @Nullable DiskInfo findDiskById(String id) { + Preconditions.checkNotNull(id); + // TODO; go directly to service to make this faster + for (DiskInfo disk : getDisks()) { + if (Objects.equals(disk.id, id)) { + return disk; + } + } + return null; + } + + /** {@hide} */ + public @Nullable VolumeInfo findVolumeById(String id) { + Preconditions.checkNotNull(id); + // TODO; go directly to service to make this faster + for (VolumeInfo vol : getVolumes()) { + if (Objects.equals(vol.id, id)) { + return vol; + } + } + return null; + } + + /** {@hide} */ + public @Nullable VolumeInfo findVolumeByUuid(String fsUuid) { + Preconditions.checkNotNull(fsUuid); + // TODO; go directly to service to make this faster + for (VolumeInfo vol : getVolumes()) { + if (Objects.equals(vol.fsUuid, fsUuid)) { + return vol; + } + } + return null; + } + + /** {@hide} */ public @NonNull List<VolumeInfo> getVolumes() { try { return Arrays.asList(mMountService.getVolumes()); diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index c8c2f65..2dc0361 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -44,6 +44,7 @@ import java.io.File; * @hide */ public class VolumeInfo implements Parcelable { + /** Real volume representing internal emulated storage */ public static final String ID_EMULATED_INTERNAL = "emulated"; public static final int TYPE_PUBLIC = 0; diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 5afbd6d..7565654b 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -226,6 +226,35 @@ public final class MediaStore { public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA"; /** + * The name of the Intent action used to indicate that a camera launch might be imminent. This + * broadcast should be targeted to the package that is receiving + * {@link #INTENT_ACTION_STILL_IMAGE_CAMERA} or + * {@link #INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE}, depending on the context. If such + * intent would launch the resolver activity, this broadcast should not be sent at all. + * <p> + * A receiver of this broadcast should do the absolute minimum amount of work to initialize the + * camera in order to reduce startup time in likely case that shortly after an actual camera + * launch intent would be sent. + * <p> + * In case the actual intent will not be fired, the target package will receive + * {@link #ACTION_STILL_IMAGE_CAMERA_COOLDOWN}. However, it is recommended that the receiver + * also implements a timeout to close the camera after receiving this intent, as there is no + * guarantee that {@link #ACTION_STILL_IMAGE_CAMERA_COOLDOWN} will be delivered. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_STILL_IMAGE_CAMERA_PREWARM = "android.media.action.STILL_IMAGE_CAMERA_PREWARM"; + + /** + * The name of the Intent action used to indicate that an imminent camera launch has been + * cancelled by the user. This broadcast should be targeted to the package that has received + * {@link #ACTION_STILL_IMAGE_CAMERA_PREWARM}. + * <p> + * A receiver of this broadcast should close the camera immediately. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_STILL_IMAGE_CAMERA_COOLDOWN = "android.media.action.STILL_IMAGE_CAMERA_COOLDOWN"; + + /** * The name of the Intent action used to launch a camera in still image mode * for use when the device is secured (e.g. with a pin, password, pattern, * or face unlock). Applications responding to this intent must not expose diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java index e94a312..5e2accd 100644 --- a/core/java/android/security/keymaster/KeymasterDefs.java +++ b/core/java/android/security/keymaster/KeymasterDefs.java @@ -171,6 +171,10 @@ public final class KeymasterDefs { public static final int KM_KEY_FORMAT_PKCS12 = 2; public static final int KM_KEY_FORMAT_RAW = 3; + // User authenticators. + public static final int HW_AUTH_PASSWORD = 1 << 0; + public static final int HW_AUTH_FINGERPRINT = 1 << 1; + // Error codes. public static final int KM_ERROR_OK = 0; public static final int KM_ERROR_ROOT_OF_TRUST_ALREADY_SET = -1; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 384bd2c..b6f1e3b 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -8400,7 +8400,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return true; } } break; - case R.id.accessibility_action_show_on_screen: { + case R.id.accessibilityActionShowOnScreen: { if (mAttachInfo != null) { final Rect r = mAttachInfo.mTmpInvalRect; getDrawingRect(r); @@ -16918,7 +16918,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @Nullable public ColorStateList getForegroundTintList() { return mForegroundInfo != null && mForegroundInfo.mTintInfo != null - ? mBackgroundTint.mTintList : null; + ? mForegroundInfo.mTintInfo.mTintList : null; } /** diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index ec527d5..0736ed8 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -266,7 +266,8 @@ public class AccessibilityNodeInfo implements Parcelable { * Action to set the selection. Performing this action with no arguments * clears the selection. * <p> - * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_SELECTION_START_INT}, + * <strong>Arguments:</strong> + * {@link #ACTION_ARGUMENT_SELECTION_START_INT}, * {@link #ACTION_ARGUMENT_SELECTION_END_INT}<br> * <strong>Example:</strong> * <code><pre><p> @@ -302,7 +303,8 @@ public class AccessibilityNodeInfo implements Parcelable { * null</code> or empty {@link CharSequence} will clear the text. This action will also put the * cursor at the end of text. * <p> - * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE}<br> + * <strong>Arguments:</strong> + * {@link #ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE}<br> * <strong>Example:</strong> * <code><pre><p> * Bundle arguments = new Bundle(); @@ -326,12 +328,15 @@ public class AccessibilityNodeInfo implements Parcelable { * Argument for which movement granularity to be used when traversing the node text. * <p> * <strong>Type:</strong> int<br> - * <strong>Actions:</strong> {@link #ACTION_NEXT_AT_MOVEMENT_GRANULARITY}, - * {@link #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY} + * <strong>Actions:</strong> + * <ul> + * <li>{@link AccessibilityAction#ACTION_NEXT_AT_MOVEMENT_GRANULARITY}</li> + * <li>{@link AccessibilityAction#ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY}</li> + * </ul> * </p> * - * @see #ACTION_NEXT_AT_MOVEMENT_GRANULARITY - * @see #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY + * @see AccessibilityAction#ACTION_NEXT_AT_MOVEMENT_GRANULARITY + * @see AccessibilityAction#ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY */ public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT"; @@ -340,12 +345,15 @@ public class AccessibilityNodeInfo implements Parcelable { * Argument for which HTML element to get moving to the next/previous HTML element. * <p> * <strong>Type:</strong> String<br> - * <strong>Actions:</strong> {@link #ACTION_NEXT_HTML_ELEMENT}, - * {@link #ACTION_PREVIOUS_HTML_ELEMENT} + * <strong>Actions:</strong> + * <ul> + * <li>{@link AccessibilityAction#ACTION_NEXT_HTML_ELEMENT}</li> + * <li>{@link AccessibilityAction#ACTION_PREVIOUS_HTML_ELEMENT}</li> + * </ul> * </p> * - * @see #ACTION_NEXT_HTML_ELEMENT - * @see #ACTION_PREVIOUS_HTML_ELEMENT + * @see AccessibilityAction#ACTION_NEXT_HTML_ELEMENT + * @see AccessibilityAction#ACTION_PREVIOUS_HTML_ELEMENT */ public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING"; @@ -355,12 +363,14 @@ public class AccessibilityNodeInfo implements Parcelable { * or to move it otherwise. * <p> * <strong>Type:</strong> boolean<br> - * <strong>Actions:</strong> {@link #ACTION_NEXT_AT_MOVEMENT_GRANULARITY}, - * {@link #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY} - * </p> + * <strong>Actions:</strong> + * <ul> + * <li>{@link AccessibilityAction#ACTION_NEXT_AT_MOVEMENT_GRANULARITY}</li> + * <li>{@link AccessibilityAction#ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY}</li> + * </ul> * - * @see #ACTION_NEXT_AT_MOVEMENT_GRANULARITY - * @see #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY + * @see AccessibilityAction#ACTION_NEXT_AT_MOVEMENT_GRANULARITY + * @see AccessibilityAction#ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY */ public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN"; @@ -369,10 +379,12 @@ public class AccessibilityNodeInfo implements Parcelable { * Argument for specifying the selection start. * <p> * <strong>Type:</strong> int<br> - * <strong>Actions:</strong> {@link #ACTION_SET_SELECTION} - * </p> + * <strong>Actions:</strong> + * <ul> + * <li>{@link AccessibilityAction#ACTION_SET_SELECTION}</li> + * </ul> * - * @see #ACTION_SET_SELECTION + * @see AccessibilityAction#ACTION_SET_SELECTION */ public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT"; @@ -381,26 +393,58 @@ public class AccessibilityNodeInfo implements Parcelable { * Argument for specifying the selection end. * <p> * <strong>Type:</strong> int<br> - * <strong>Actions:</strong> {@link #ACTION_SET_SELECTION} - * </p> + * <strong>Actions:</strong> + * <ul> + * <li>{@link AccessibilityAction#ACTION_SET_SELECTION}</li> + * </ul> * - * @see #ACTION_SET_SELECTION + * @see AccessibilityAction#ACTION_SET_SELECTION */ public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT"; /** - * Argument for specifying the text content to set + * Argument for specifying the text content to set. * <p> * <strong>Type:</strong> CharSequence<br> - * <strong>Actions:</strong> {@link #ACTION_SET_TEXT} - * </p> + * <strong>Actions:</strong> + * <ul> + * <li>{@link AccessibilityAction#ACTION_SET_TEXT}</li> + * </ul> * - * @see #ACTION_SET_TEXT + * @see AccessibilityAction#ACTION_SET_TEXT */ public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE"; + /** + * Argument for specifying the collection row to make visible on screen. + * <p> + * <strong>Type:</strong> int<br> + * <strong>Actions:</strong> + * <ul> + * <li>{@link AccessibilityAction#ACTION_SCROLL_TO_POSITION}</li> + * </ul> + * + * @see AccessibilityAction#ACTION_SCROLL_TO_POSITION + */ + public static final String ACTION_ARGUMENT_ROW_INT = + "android.view.accessibility.action.ARGUMENT_ROW_INT"; + + /** + * Argument for specifying the collection column to make visible on screen. + * <p> + * <strong>Type:</strong> int<br> + * <strong>Actions:</strong> + * <ul> + * <li>{@link AccessibilityAction#ACTION_SCROLL_TO_POSITION}</li> + * </ul> + * + * @see AccessibilityAction#ACTION_SCROLL_TO_POSITION + */ + public static final String ACTION_ARGUMENT_COLUMN_INT = + "android.view.accessibility.action.ARGUMENT_COLUMN_INT"; + // Focus types /** @@ -539,7 +583,7 @@ public class AccessibilityNodeInfo implements Parcelable { // Housekeeping. private static final int MAX_POOL_SIZE = 50; private static final SynchronizedPool<AccessibilityNodeInfo> sPool = - new SynchronizedPool<AccessibilityNodeInfo>(MAX_POOL_SIZE); + new SynchronizedPool<>(MAX_POOL_SIZE); private boolean mSealed; @@ -970,7 +1014,7 @@ public class AccessibilityNodeInfo implements Parcelable { } if (mActions == null) { - mActions = new ArrayList<AccessibilityAction>(); + mActions = new ArrayList<>(); } mActions.remove(action); @@ -3411,9 +3455,24 @@ public class AccessibilityNodeInfo implements Parcelable { * @see View#requestRectangleOnScreen(Rect) */ public static final AccessibilityAction ACTION_SHOW_ON_SCREEN = - new AccessibilityAction(R.id.accessibility_action_show_on_screen, null); + new AccessibilityAction(R.id.accessibilityActionShowOnScreen, null); + + /** + * Action that scrolls the node to make the specified collection + * position visible on screen. + * <p> + * <strong>Arguments:</strong> + * <ul> + * <li>{@link AccessibilityNodeInfo#ACTION_ARGUMENT_ROW_INT}</li> + * <li>{@link AccessibilityNodeInfo#ACTION_ARGUMENT_COLUMN_INT}</li> + * <ul> + * + * @see AccessibilityNodeInfo#getCollectionInfo() + */ + public static final AccessibilityAction ACTION_SCROLL_TO_POSITION = + new AccessibilityAction(R.id.accessibilityActionScrollToPosition, null); - private static final ArraySet<AccessibilityAction> sStandardActions = new ArraySet<AccessibilityAction>(); + private static final ArraySet<AccessibilityAction> sStandardActions = new ArraySet<>(); static { sStandardActions.add(ACTION_FOCUS); sStandardActions.add(ACTION_CLEAR_FOCUS); @@ -3438,6 +3497,7 @@ public class AccessibilityNodeInfo implements Parcelable { sStandardActions.add(ACTION_DISMISS); sStandardActions.add(ACTION_SET_TEXT); sStandardActions.add(ACTION_SHOW_ON_SCREEN); + sStandardActions.add(ACTION_SCROLL_TO_POSITION); } private final int mActionId; @@ -3658,7 +3718,7 @@ public class AccessibilityNodeInfo implements Parcelable { private static final int MAX_POOL_SIZE = 20; private static final SynchronizedPool<CollectionInfo> sPool = - new SynchronizedPool<CollectionInfo>(MAX_POOL_SIZE); + new SynchronizedPool<>(MAX_POOL_SIZE); private int mRowCount; private int mColumnCount; @@ -3804,7 +3864,7 @@ public class AccessibilityNodeInfo implements Parcelable { private static final int MAX_POOL_SIZE = 20; private static final SynchronizedPool<CollectionItemInfo> sPool = - new SynchronizedPool<CollectionItemInfo>(MAX_POOL_SIZE); + new SynchronizedPool<>(MAX_POOL_SIZE); /** * Obtains a pooled instance that is a clone of another one. diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index aa77d5e..7ab5aaa 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -40,6 +40,7 @@ import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.view.ViewAssistStructure; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewTreeObserver; @@ -2424,6 +2425,11 @@ public class WebView extends AbsoluteLayout return WebView.class.getName(); } + @Override + public void onProvideVirtualAssistStructure(ViewAssistStructure structure) { + mProvider.getViewDelegate().onProvideVirtualAssistStructure(structure); + } + /** @hide */ @Override public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) { diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java index fa2ce1b..d5787de 100644 --- a/core/java/android/webkit/WebViewProvider.java +++ b/core/java/android/webkit/WebViewProvider.java @@ -32,6 +32,7 @@ import android.print.PrintDocumentAdapter; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.view.ViewAssistStructure; import android.view.ViewGroup.LayoutParams; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -298,6 +299,8 @@ public interface WebViewProvider { interface ViewDelegate { public boolean shouldDelayChildPressedState(); + public void onProvideVirtualAssistStructure(ViewAssistStructure structure); + public AccessibilityNodeProvider getAccessibilityNodeProvider(); public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info); diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 168066a..e7b6238 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -61,6 +61,7 @@ import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; @@ -1504,11 +1505,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te super.onInitializeAccessibilityNodeInfoInternal(info); if (isEnabled()) { if (canScrollUp()) { - info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); + info.addAction(AccessibilityAction.ACTION_SCROLL_BACKWARD); info.setScrollable(true); } if (canScrollDown()) { - info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + info.addAction(AccessibilityAction.ACTION_SCROLL_FORWARD); info.setScrollable(true); } } @@ -2502,18 +2503,18 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te if (position == getSelectedItemPosition()) { info.setSelected(true); - info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION); + info.addAction(AccessibilityAction.ACTION_CLEAR_SELECTION); } else { - info.addAction(AccessibilityNodeInfo.ACTION_SELECT); + info.addAction(AccessibilityAction.ACTION_SELECT); } if (isClickable()) { - info.addAction(AccessibilityNodeInfo.ACTION_CLICK); + info.addAction(AccessibilityAction.ACTION_CLICK); info.setClickable(true); } if (isLongClickable()) { - info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK); + info.addAction(AccessibilityAction.ACTION_LONG_CLICK); info.setLongClickable(true); } } diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index c6e3dc8..be0ca71 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; import android.graphics.Rect; +import android.os.Bundle; import android.os.Trace; import android.util.AttributeSet; import android.util.MathUtils; @@ -32,12 +33,15 @@ import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewRootImpl; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo; import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo; import android.view.animation.GridLayoutAnimationController; import android.widget.RemoteViews.RemoteView; +import com.android.internal.R; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -117,7 +121,7 @@ public class GridView extends AbsListView { } public GridView(Context context, AttributeSet attrs) { - this(context, attrs, com.android.internal.R.attr.gridViewStyle); + this(context, attrs, R.attr.gridViewStyle); } public GridView(Context context, AttributeSet attrs, int defStyleAttr) { @@ -128,30 +132,30 @@ public class GridView extends AbsListView { super(context, attrs, defStyleAttr, defStyleRes); final TypedArray a = context.obtainStyledAttributes( - attrs, com.android.internal.R.styleable.GridView, defStyleAttr, defStyleRes); + attrs, R.styleable.GridView, defStyleAttr, defStyleRes); int hSpacing = a.getDimensionPixelOffset( - com.android.internal.R.styleable.GridView_horizontalSpacing, 0); + R.styleable.GridView_horizontalSpacing, 0); setHorizontalSpacing(hSpacing); int vSpacing = a.getDimensionPixelOffset( - com.android.internal.R.styleable.GridView_verticalSpacing, 0); + R.styleable.GridView_verticalSpacing, 0); setVerticalSpacing(vSpacing); - int index = a.getInt(com.android.internal.R.styleable.GridView_stretchMode, STRETCH_COLUMN_WIDTH); + int index = a.getInt(R.styleable.GridView_stretchMode, STRETCH_COLUMN_WIDTH); if (index >= 0) { setStretchMode(index); } - int columnWidth = a.getDimensionPixelOffset(com.android.internal.R.styleable.GridView_columnWidth, -1); + int columnWidth = a.getDimensionPixelOffset(R.styleable.GridView_columnWidth, -1); if (columnWidth > 0) { setColumnWidth(columnWidth); } - int numColumns = a.getInt(com.android.internal.R.styleable.GridView_numColumns, 1); + int numColumns = a.getInt(R.styleable.GridView_numColumns, 1); setNumColumns(numColumns); - index = a.getInt(com.android.internal.R.styleable.GridView_gravity, -1); + index = a.getInt(R.styleable.GridView_gravity, -1); if (index >= 0) { setGravity(index); } @@ -2356,6 +2360,36 @@ public class GridView extends AbsListView { final CollectionInfo collectionInfo = CollectionInfo.obtain( rowsCount, columnsCount, false, selectionMode); info.setCollectionInfo(collectionInfo); + + if (columnsCount > 0 || rowsCount > 0) { + info.addAction(AccessibilityAction.ACTION_SCROLL_TO_POSITION); + } + } + + /** @hide */ + @Override + public boolean performAccessibilityActionInternal(int action, Bundle arguments) { + if (super.performAccessibilityActionInternal(action, arguments)) { + return true; + } + + switch (action) { + case R.id.accessibilityActionScrollToPosition: { + // GridView only supports scrolling in one direction, so we can + // ignore the column argument. + final int numColumns = getNumColumns(); + final int row = arguments.getInt(AccessibilityNodeInfo.ACTION_ARGUMENT_ROW_INT, -1); + final int position = Math.min(row * numColumns, getCount() - 1); + if (row >= 0) { + // The accessibility service gets data asynchronously, so + // we'll be a little lenient by clamping the last position. + smoothScrollToPosition(position); + return true; + } + } break; + } + + return false; } @Override diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index ee2c055..def5929 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -16,6 +16,7 @@ package android.widget; +import android.os.Bundle; import android.os.Trace; import com.android.internal.R; import com.android.internal.util.Predicate; @@ -42,6 +43,7 @@ import android.view.ViewGroup; import android.view.ViewParent; import android.view.ViewRootImpl; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo; import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo; import android.view.accessibility.AccessibilityNodeProvider; @@ -3893,6 +3895,33 @@ public class ListView extends AbsListView { final CollectionInfo collectionInfo = CollectionInfo.obtain( rowsCount, 1, false, selectionMode); info.setCollectionInfo(collectionInfo); + + if (rowsCount > 0) { + info.addAction(AccessibilityAction.ACTION_SCROLL_TO_POSITION); + } + } + + /** @hide */ + @Override + public boolean performAccessibilityActionInternal(int action, Bundle arguments) { + if (super.performAccessibilityActionInternal(action, arguments)) { + return true; + } + + switch (action) { + case R.id.accessibilityActionScrollToPosition: { + final int row = arguments.getInt(AccessibilityNodeInfo.ACTION_ARGUMENT_ROW_INT, -1); + final int position = Math.min(row, getCount() - 1); + if (row >= 0) { + // The accessibility service gets data asynchronously, so + // we'll be a little lenient by clamping the last position. + smoothScrollToPosition(position); + return true; + } + } break; + } + + return false; } @Override |
