diff options
Diffstat (limited to 'core/java/android')
18 files changed, 374 insertions, 160 deletions
diff --git a/core/java/android/animation/AnimatorInflater.java b/core/java/android/animation/AnimatorInflater.java index 435d5ab..d8d2737 100644 --- a/core/java/android/animation/AnimatorInflater.java +++ b/core/java/android/animation/AnimatorInflater.java @@ -441,8 +441,12 @@ public class AnimatorInflater { long startDelay = arrayAnimator.getInt(R.styleable.Animator_startOffset, 0); - int valueType = arrayAnimator.getInt(R.styleable.Animator_valueType, VALUE_TYPE_FLOAT); + int valueType = arrayAnimator.getInt(R.styleable.Animator_valueType, VALUE_TYPE_UNDEFINED); + if (valueType == VALUE_TYPE_UNDEFINED) { + valueType = inferValueTypeFromValues(arrayAnimator, R.styleable.Animator_valueFrom, + R.styleable.Animator_valueTo); + } PropertyValuesHolder pvh = getPVH(arrayAnimator, valueType, R.styleable.Animator_valueFrom, R.styleable.Animator_valueTo, ""); if (pvh != null) { @@ -520,8 +524,14 @@ public class AnimatorInflater { ObjectAnimator oa = (ObjectAnimator) anim; String pathData = arrayObjectAnimator.getString(R.styleable.PropertyAnimator_pathData); - // Note that if there is a pathData defined in the Object Animator, - // valueFrom / valueTo will be ignored. + // Path can be involved in an ObjectAnimator in the following 3 ways: + // 1) Path morphing: the property to be animated is pathData, and valueFrom and valueTo + // are both of pathType. valueType = pathType needs to be explicitly defined. + // 2) A property in X or Y dimension can be animated along a path: the property needs to be + // defined in propertyXName or propertyYName attribute, the path will be defined in the + // pathData attribute. valueFrom and valueTo will not be necessary for this animation. + // 3) PathInterpolator can also define a path (in pathData) for its interpolation curve. + // Here we are dealing with case 2: if (pathData != null) { String propertyXName = arrayObjectAnimator.getString(R.styleable.PropertyAnimator_propertyXName); @@ -805,6 +815,25 @@ public class AnimatorInflater { return valueType; } + private static int inferValueTypeFromValues(TypedArray styledAttributes, int valueFromId, + int valueToId) { + TypedValue tvFrom = styledAttributes.peekValue(valueFromId); + boolean hasFrom = (tvFrom != null); + int fromType = hasFrom ? tvFrom.type : 0; + TypedValue tvTo = styledAttributes.peekValue(valueToId); + boolean hasTo = (tvTo != null); + int toType = hasTo ? tvTo.type : 0; + + int valueType; + // Check whether it's color type. If not, fall back to default type (i.e. float type) + if ((hasFrom && isColorType(fromType)) || (hasTo && isColorType(toType))) { + valueType = VALUE_TYPE_COLOR; + } else { + valueType = VALUE_TYPE_FLOAT; + } + return valueType; + } + private static void dumpKeyframes(Object[] keyframes, String header) { if (keyframes == null || keyframes.length == 0) { return; diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index bb553e4..dabcc50c 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2534,15 +2534,6 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } - case UPDATE_PREFERRED_SETUP_ACTIVITY_TRANSACTION: { - data.enforceInterface(IActivityManager.descriptor); - ComponentName preferredActivity = ComponentName.readFromParcel(data); - int userId = data.readInt(); - updatePreferredSetupActivity(preferredActivity, userId); - reply.writeNoException(); - return true; - } - case GET_PACKAGE_PROCESS_STATE_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); String pkg = data.readString(); @@ -5868,20 +5859,6 @@ class ActivityManagerProxy implements IActivityManager } @Override - public void updatePreferredSetupActivity(ComponentName preferredActivity, int userId) - throws RemoteException { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IActivityManager.descriptor); - ComponentName.writeToParcel(preferredActivity, data); - data.writeInt(userId); - mRemote.transact(UPDATE_PREFERRED_SETUP_ACTIVITY_TRANSACTION, data, reply, 0); - reply.readException(); - data.recycle(); - reply.recycle(); - } - - @Override public int getPackageProcessState(String packageName) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index e87eabe..0d5e1c7 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -502,8 +502,6 @@ public interface IActivityManager extends IInterface { throws RemoteException; public void updateLockTaskPackages(int userId, String[] packages) throws RemoteException; public void updateDeviceOwner(String packageName) throws RemoteException; - public void updatePreferredSetupActivity(ComponentName preferredActivity, int userId) - throws RemoteException; public int getPackageProcessState(String packageName) throws RemoteException; @@ -850,8 +848,7 @@ public interface IActivityManager extends IInterface { int GET_PACKAGE_PROCESS_STATE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+293; int SHOW_LOCK_TASK_ESCAPE_MESSAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+294; int UPDATE_DEVICE_OWNER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+295; - int UPDATE_PREFERRED_SETUP_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+296; - int KEYGUARD_GOING_AWAY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+297; - int REGISTER_UID_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+298; - int UNREGISTER_UID_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+299; + int KEYGUARD_GOING_AWAY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+296; + int REGISTER_UID_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+297; + int UNREGISTER_UID_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+298; } diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java index 9ba6a8e..39cd3bc 100644 --- a/core/java/android/app/UiAutomationConnection.java +++ b/core/java/android/app/UiAutomationConnection.java @@ -239,9 +239,10 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { public void run() { InputStream in = null; OutputStream out = null; + java.lang.Process process = null; try { - java.lang.Process process = Runtime.getRuntime().exec(command); + process = Runtime.getRuntime().exec(command); in = process.getInputStream(); out = new FileOutputStream(sink.getFileDescriptor()); @@ -257,7 +258,9 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { } catch (IOException ioe) { throw new RuntimeException("Error running shell command", ioe); } finally { - IoUtils.closeQuietly(in); + if (process != null) { + process.destroy(); + } IoUtils.closeQuietly(out); IoUtils.closeQuietly(sink); } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 55eaf27..3ab0e01 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -4404,24 +4404,6 @@ public class DevicePolicyManager { } /** - * Called by a device initializer to set the activity to be launched on device boot or after a - * user switch during user setup. This activity will be started regardless of the priority of - * other 'home' activities. Once user setup is complete, the preferred setup activity will be - * ignored. - * - * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param activity The Activity to be started by default during user setup. - */ - public void setPreferredSetupActivity(@NonNull ComponentName admin, - @NonNull ComponentName activity) { - try { - mService.setPreferredSetupActivity(admin, activity); - } catch (RemoteException re) { - Log.w(TAG, "Failed talking with device policy service", re); - } - } - - /** * Called by profile or device owners to set the default response for future runtime permission * requests by applications. The policy can allow for normal operation which prompts the * user to grant a permission, or can allow automatic granting or denying of runtime diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 477a338..8c7b20a 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -218,8 +218,6 @@ interface IDevicePolicyManager { String getDeviceInitializer(); ComponentName getDeviceInitializerComponent(); - void setPreferredSetupActivity(in ComponentName admin, in ComponentName activity); - void setUserIcon(in ComponentName admin, in Bitmap icon); void sendDeviceInitializerStatus(int statusCode, String description); diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index caf21d5..e61813c 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -18,32 +18,30 @@ package android.hardware.fingerprint; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.app.ActivityManagerNative; -import android.content.ContentResolver; import android.content.Context; import android.os.Binder; import android.os.CancellationSignal; import android.os.CancellationSignal.OnCancelListener; import android.os.Handler; import android.os.IBinder; -import android.os.Parcel; -import android.os.Parcelable; +import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; -import android.provider.Settings; -import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback; import android.security.keystore.AndroidKeyStoreProvider; import android.util.Log; import android.util.Slog; import java.security.Signature; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import javax.crypto.Cipher; import javax.crypto.Mac; +import static android.Manifest.permission.USE_FINGERPRINT; +import static android.Manifest.permission.MANAGE_FINGERPRINT; + /** * A class that coordinates access to the fingerprint hardware. * <p> @@ -57,9 +55,10 @@ public class FingerprintManager { private static final boolean DEBUG = true; private static final int MSG_ENROLL_RESULT = 100; private static final int MSG_ACQUIRED = 101; - private static final int MSG_AUTHENTICATED = 102; - private static final int MSG_ERROR = 103; - private static final int MSG_REMOVED = 104; + private static final int MSG_AUTHENTICATION_SUCCEEDED = 102; + private static final int MSG_AUTHENTICATION_FAILED = 103; + private static final int MSG_ERROR = 104; + private static final int MSG_REMOVED = 105; // // Error messages from fingerprint hardware during initilization, enrollment, authentication or @@ -112,6 +111,7 @@ public class FingerprintManager { /** * Hardware vendors may extend this list if there are conditions that do not fall under one of * the above categories. Vendors are responsible for providing error strings for these errors. + * @hide */ public static final int FINGERPRINT_ERROR_VENDOR_BASE = 1000; @@ -162,6 +162,7 @@ public class FingerprintManager { /** * Hardware vendors may extend this list if there are conditions that do not fall under one of * the above categories. Vendors are responsible for providing error strings for these errors. + * @hide */ public static final int FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000; @@ -173,6 +174,7 @@ public class FingerprintManager { private RemovalCallback mRemovalCallback; private CryptoObject mCryptoObject; private Fingerprint mRemovalFingerprint; + private Handler mHandler; private class OnEnrollCancelListener implements OnCancelListener { @Override @@ -198,72 +200,71 @@ public class FingerprintManager { * A wrapper class for the crypto objects supported by FingerprintManager. Currently the * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects. */ - public static class CryptoObject { + public static final class CryptoObject { public CryptoObject(@NonNull Signature signature) { - mSignature = signature; - mCipher = null; - mMac = null; + mCrypto = signature; } public CryptoObject(@NonNull Cipher cipher) { - mCipher = cipher; - mSignature = null; - mMac = null; + mCrypto = cipher; } public CryptoObject(@NonNull Mac mac) { - mMac = mac; - mCipher = null; - mSignature = null; + mCrypto = mac; } /** * Get {@link Signature} object. * @return {@link Signature} object or null if this doesn't contain one. */ - public Signature getSignature() { return mSignature; } + public Signature getSignature() { + return mCrypto instanceof Signature ? (Signature) mCrypto : null; + } /** * Get {@link Cipher} object. * @return {@link Cipher} object or null if this doesn't contain one. */ - public Cipher getCipher() { return mCipher; } + public Cipher getCipher() { + return mCrypto instanceof Cipher ? (Cipher) mCrypto : null; + } /** * Get {@link Mac} object. * @return {@link Mac} object or null if this doesn't contain one. */ - public Mac getMac() { return mMac; } + public Mac getMac() { + return mCrypto instanceof Mac ? (Mac) mCrypto : null; + } /** * @hide * @return the opId associated with this object or 0 if none */ public long getOpId() { - if (mSignature != null) { - return AndroidKeyStoreProvider.getKeyStoreOperationHandle(mSignature); - } else if (mCipher != null) { - return AndroidKeyStoreProvider.getKeyStoreOperationHandle(mCipher); - } else if (mMac != null) { - return AndroidKeyStoreProvider.getKeyStoreOperationHandle(mMac); - } - return 0; + return mCrypto != null ? + AndroidKeyStoreProvider.getKeyStoreOperationHandle(mCrypto) : 0; } - private final Signature mSignature; - private final Cipher mCipher; - private final Mac mMac; + private final Object mCrypto; }; /** * Container for callback data from {@link FingerprintManager#authenticate(CryptoObject, - * CancellationSignal, AuthenticationCallback, int)}. + * CancellationSignal, int, AuthenticationCallback, Handler)}. */ public static final class AuthenticationResult { private Fingerprint mFingerprint; private CryptoObject mCryptoObject; + /** + * Authentication result + * + * @param crypto the crypto object + * @param fingerprint the recognized fingerprint data, if allowed. + * @hide + */ public AuthenticationResult(CryptoObject crypto, Fingerprint fingerprint) { mCryptoObject = crypto; mFingerprint = fingerprint; @@ -272,7 +273,7 @@ public class FingerprintManager { /** * Obtain the crypto object associated with this transaction * @return crypto object provided to {@link FingerprintManager#authenticate(CryptoObject, - * CancellationSignal, AuthenticationCallback, int)}. + * CancellationSignal, int, AuthenticationCallback, Handler)}. */ public CryptoObject getCryptoObject() { return mCryptoObject; } @@ -287,28 +288,28 @@ public class FingerprintManager { /** * Callback structure provided to {@link FingerprintManager#authenticate(CryptoObject, - * CancellationSignal, AuthenticationCallback, int)}. Users of {@link + * CancellationSignal, int, AuthenticationCallback, Handler)}. Users of {@link * FingerprintManager#authenticate(CryptoObject, CancellationSignal, - * AuthenticationCallback, int) } must provide an implementation of this for listening to + * int, AuthenticationCallback, Handler) } must provide an implementation of this for listening to * fingerprint events. */ public static abstract class AuthenticationCallback { /** * Called when an unrecoverable error has been encountered and the operation is complete. * No further callbacks will be made on this object. - * @param errMsgId An integer identifying the error message + * @param errorCode An integer identifying the error message * @param errString A human-readable error string that can be shown in UI */ - public void onAuthenticationError(int errMsgId, CharSequence errString) { } + public void onAuthenticationError(int errorCode, CharSequence errString) { } /** * Called when a recoverable error has been encountered during authentication. The help * string is provided to give the user guidance for what went wrong, such as * "Sensor dirty, please clean it." - * @param helpMsgId An integer identifying the error message + * @param helpCode An integer identifying the error message * @param helpString A human-readable string that can be shown in UI */ - public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { } + public void onAuthenticationHelp(int helpCode, CharSequence helpString) { } /** * Called when a fingerprint is recognized. @@ -326,7 +327,7 @@ public class FingerprintManager { * Callback structure provided to {@link FingerprintManager#enroll(long, EnrollmentCallback, * CancellationSignal, int). Users of {@link #FingerprintManager()} * must provide an implementation of this to {@link FingerprintManager#enroll(long, - * CancellationSignal, EnrollmentCallback, int) for listening to fingerprint events. + * CancellationSignal, int, EnrollmentCallback) for listening to fingerprint events. * * @hide */ @@ -392,31 +393,35 @@ public class FingerprintManager { * * @param crypto object associated with the call or null if none required. * @param cancel an object that can be used to cancel authentication - * @param callback an object to receive authentication events * @param flags optional flags; should be 0 + * @param callback an object to receive authentication events + * @param handler an optional handler to handle callback events */ + @RequiresPermission(USE_FINGERPRINT) public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, - @NonNull AuthenticationCallback callback, int flags) { - authenticate(crypto, cancel, callback, flags, UserHandle.myUserId()); + int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler) { + authenticate(crypto, cancel, flags, callback, handler, UserHandle.myUserId()); } /** - * Request authentication of a crypto object. This call warms up the fingerprint hardware - * and starts scanning for a fingerprint. It terminates when - * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)} or - * {@link AuthenticationCallback#onAuthenticationSucceeded(AuthenticationResult) is called, at - * which point the object is no longer valid. The operation can be canceled by using the - * provided cancel object. - * - * @param crypto object associated with the call or null if none required. - * @param cancel an object that can be used to cancel authentication - * @param callback an object to receive authentication events - * @param flags optional flags; should be 0 - * @param userId the userId the fingerprint belongs to + * Use the provided handler thread for events. + * @param handler + */ + private void useHandler(Handler handler) { + if (handler != null) { + mHandler = new MyHandler(handler.getLooper()); + } else if (mHandler.getLooper() != mContext.getMainLooper()){ + mHandler = new MyHandler(mContext.getMainLooper()); + } + } + + /** + * Per-user version * @hide */ + @RequiresPermission(USE_FINGERPRINT) public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, - @NonNull AuthenticationCallback callback, int flags, int userId) { + int flags, @NonNull AuthenticationCallback callback, Handler handler, int userId) { if (callback == null) { throw new IllegalArgumentException("Must supply an authentication callback"); } @@ -431,6 +436,7 @@ public class FingerprintManager { } if (mService != null) try { + useHandler(handler); mAuthenticationCallback = callback; mCryptoObject = crypto; long sessionId = crypto != null ? crypto.getOpId() : 0; @@ -458,12 +464,13 @@ public class FingerprintManager { * @param token a unique token provided by a recent creation or verification of device * credentials (e.g. pin, pattern or password). * @param cancel an object that can be used to cancel enrollment - * @param callback an object to receive enrollment events * @param flags optional flags + * @param callback an object to receive enrollment events * @hide */ - public void enroll(byte [] token, CancellationSignal cancel, EnrollmentCallback callback, - int flags) { + @RequiresPermission(MANAGE_FINGERPRINT) + public void enroll(byte [] token, CancellationSignal cancel, int flags, + EnrollmentCallback callback) { if (callback == null) { throw new IllegalArgumentException("Must supply an enrollment callback"); } @@ -496,6 +503,7 @@ public class FingerprintManager { * existing device credentials (e.g. pin/pattern/password). * @hide */ + @RequiresPermission(MANAGE_FINGERPRINT) public long preEnroll() { long result = 0; if (mService != null) try { @@ -514,6 +522,7 @@ public class FingerprintManager { * * @hide */ + @RequiresPermission(MANAGE_FINGERPRINT) public void remove(Fingerprint fp, RemovalCallback callback) { if (mService != null) try { mRemovalCallback = callback; @@ -535,6 +544,7 @@ public class FingerprintManager { * * @hide */ + @RequiresPermission(MANAGE_FINGERPRINT) public void rename(int fpId, String newName) { // Renames the given fpId if (mService != null) { @@ -554,6 +564,7 @@ public class FingerprintManager { * * @hide */ + @RequiresPermission(USE_FINGERPRINT) public List<Fingerprint> getEnrolledFingerprints(int userId) { if (mService != null) try { return mService.getEnrolledFingerprints(userId, mContext.getOpPackageName()); @@ -569,6 +580,7 @@ public class FingerprintManager { * * @hide */ + @RequiresPermission(USE_FINGERPRINT) public List<Fingerprint> getEnrolledFingerprints() { return getEnrolledFingerprints(UserHandle.myUserId()); } @@ -578,6 +590,7 @@ public class FingerprintManager { * * @return true if at least one fingerprint is enrolled, false otherwise */ + @RequiresPermission(USE_FINGERPRINT) public boolean hasEnrolledFingerprints() { if (mService != null) try { return mService.hasEnrolledFingerprints(UserHandle.myUserId(), @@ -593,6 +606,7 @@ public class FingerprintManager { * * @return true if hardware is present and functional, false otherwise. */ + @RequiresPermission(USE_FINGERPRINT) public boolean isHardwareDetected() { if (mService != null) { try { @@ -626,13 +640,15 @@ public class FingerprintManager { return 0; } - private Handler mHandler; - private class MyHandler extends Handler { private MyHandler(Context context) { super(context.getMainLooper()); } + private MyHandler(Looper looper) { + super(looper); + } + public void handleMessage(android.os.Message msg) { switch(msg.what) { case MSG_ENROLL_RESULT: @@ -641,8 +657,11 @@ public class FingerprintManager { case MSG_ACQUIRED: sendAcquiredResult((Long) msg.obj /* deviceId */, msg.arg1 /* acquire info */); break; - case MSG_AUTHENTICATED: - sendAuthenticatedResult((Fingerprint) msg.obj); + case MSG_AUTHENTICATION_SUCCEEDED: + sendAuthenticatedSucceeded((Fingerprint) msg.obj); + break; + case MSG_AUTHENTICATION_FAILED: + sendAuthenticatedFailed(); break; case MSG_ERROR: sendErrorResult((Long) msg.obj /* deviceId */, msg.arg1 /* errMsgId */); @@ -684,15 +703,16 @@ public class FingerprintManager { } } - private void sendAuthenticatedResult(Fingerprint fp) { + private void sendAuthenticatedSucceeded(Fingerprint fp) { if (mAuthenticationCallback != null) { - if (fp.getFingerId() == 0) { - // Fingerprint template valid but doesn't match one in database - mAuthenticationCallback.onAuthenticationFailed(); - } else { - final AuthenticationResult result = new AuthenticationResult(mCryptoObject, fp); - mAuthenticationCallback.onAuthenticationSucceeded(result); - } + final AuthenticationResult result = new AuthenticationResult(mCryptoObject, fp); + mAuthenticationCallback.onAuthenticationSucceeded(result); + } + } + + private void sendAuthenticatedFailed() { + if (mAuthenticationCallback != null) { + mAuthenticationCallback.onAuthenticationFailed(); } } @@ -809,24 +829,33 @@ public class FingerprintManager { private IFingerprintServiceReceiver mServiceReceiver = new IFingerprintServiceReceiver.Stub() { + @Override // binder call public void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining) { mHandler.obtainMessage(MSG_ENROLL_RESULT, remaining, 0, new Fingerprint(null, groupId, fingerId, deviceId)).sendToTarget(); } + @Override // binder call public void onAcquired(long deviceId, int acquireInfo) { mHandler.obtainMessage(MSG_ACQUIRED, acquireInfo, 0, deviceId).sendToTarget(); } - public void onAuthenticated(long deviceId, int fingerId, int groupId) { - mHandler.obtainMessage(MSG_AUTHENTICATED, - new Fingerprint(null, groupId, fingerId, deviceId)).sendToTarget(); + @Override // binder call + public void onAuthenticationSucceeded(long deviceId, Fingerprint fp) { + mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, fp).sendToTarget(); + } + + @Override // binder call + public void onAuthenticationFailed(long deviceId) { + mHandler.obtainMessage(MSG_AUTHENTICATION_FAILED).sendToTarget();; } + @Override // binder call public void onError(long deviceId, int error) { mHandler.obtainMessage(MSG_ERROR, error, 0, deviceId).sendToTarget(); } + @Override // binder call public void onRemoved(long deviceId, int fingerId, int groupId) { mHandler.obtainMessage(MSG_REMOVED, fingerId, groupId, deviceId).sendToTarget(); } diff --git a/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl b/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl index a2d74b8..57a429f 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl @@ -15,6 +15,7 @@ */ package android.hardware.fingerprint; +import android.hardware.fingerprint.Fingerprint; import android.os.Bundle; import android.os.UserHandle; @@ -25,7 +26,8 @@ import android.os.UserHandle; oneway interface IFingerprintServiceReceiver { void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining); void onAcquired(long deviceId, int acquiredInfo); - void onAuthenticated(long deviceId, int fingerId, int groupId); + void onAuthenticationSucceeded(long deviceId, in Fingerprint fp); + void onAuthenticationFailed(long deviceId); void onError(long deviceId, int error); void onRemoved(long deviceId, int fingerId, int groupId); } diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java index 754c6b3..9628bae 100644 --- a/core/java/android/net/Network.java +++ b/core/java/android/net/Network.java @@ -19,6 +19,8 @@ package android.net; import android.os.Parcelable; import android.os.Parcel; import android.system.ErrnoException; +import android.system.Os; +import android.system.OsConstants; import java.io.FileDescriptor; import java.io.IOException; @@ -64,7 +66,7 @@ public class Network implements Parcelable { // maybeInitHttpClient() must be called prior to reading either variable. private volatile ConnectionPool mConnectionPool = null; private volatile com.android.okhttp.internal.Network mNetwork = null; - private Object mLock = new Object(); + private final Object mLock = new Object(); // Default connection pool values. These are evaluated at startup, just // like the OkHttp code. Also like the OkHttp code, we will throw parse @@ -300,14 +302,10 @@ public class Network implements Parcelable { * connected. */ public void bindSocket(DatagramSocket socket) throws IOException { - // Apparently, the kernel doesn't update a connected UDP socket's routing upon mark changes. - if (socket.isConnected()) { - throw new SocketException("Socket is connected"); - } // Query a property of the underlying socket to ensure that the socket's file descriptor // exists, is available to bind to a network and is not closed. socket.getReuseAddress(); - bindSocketFd(socket.getFileDescriptor$()); + bindSocket(socket.getFileDescriptor$()); } /** @@ -316,18 +314,38 @@ public class Network implements Parcelable { * {@link ConnectivityManager#bindProcessToNetwork}. The socket must not be connected. */ public void bindSocket(Socket socket) throws IOException { - // Apparently, the kernel doesn't update a connected TCP socket's routing upon mark changes. - if (socket.isConnected()) { - throw new SocketException("Socket is connected"); - } // Query a property of the underlying socket to ensure that the socket's file descriptor // exists, is available to bind to a network and is not closed. socket.getReuseAddress(); - bindSocketFd(socket.getFileDescriptor$()); + bindSocket(socket.getFileDescriptor$()); } - private void bindSocketFd(FileDescriptor fd) throws IOException { - int err = NetworkUtils.bindSocketToNetwork(fd.getInt$(), netId); + /** + * Binds the specified {@link FileDescriptor} to this {@code Network}. All data traffic on the + * socket represented by this file descriptor will be sent on this {@code Network}, + * irrespective of any process-wide network binding set by + * {@link ConnectivityManager#bindProcessToNetwork}. The socket must not be connected. + */ + public void bindSocket(FileDescriptor fd) throws IOException { + try { + final SocketAddress peer = Os.getpeername(fd); + final InetAddress inetPeer = ((InetSocketAddress) peer).getAddress(); + if (!inetPeer.isAnyLocalAddress()) { + // Apparently, the kernel doesn't update a connected UDP socket's + // routing upon mark changes. + throw new SocketException("Socket is connected"); + } + } catch (ErrnoException e) { + // getpeername() failed. + if (e.errno != OsConstants.ENOTCONN) { + throw e.rethrowAsSocketException(); + } + } catch (ClassCastException e) { + // Wasn't an InetSocketAddress. + throw new SocketException("Only AF_INET/AF_INET6 sockets supported"); + } + + final int err = NetworkUtils.bindSocketToNetwork(fd.getInt$(), netId); if (err != 0) { // bindSocketToNetwork returns negative errno. throw new ErrnoException("Binding socket to network " + netId, -err) diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 19c8fa9..87e8c5e 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -34,6 +34,7 @@ import java.lang.annotation.Target; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.HashMap; import java.util.Map; import org.apache.harmony.dalvik.ddmc.Chunk; @@ -389,6 +390,132 @@ public final class Debug } } + /** + * Returns the value of a particular memory statistic or {@code null} if no + * such memory statistic exists. + * + * <p>The following table lists the memory statistics that are supported. + * Note that memory statistics may be added or removed in a future API level.</p> + * + * <table> + * <thead> + * <tr> + * <th>Memory statistic name</th> + * <th>Meaning</th> + * <th>Example</th> + * <th>Supported (API Levels)</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td>summary.java-heap</td> + * <td>The private Java Heap usage in kB. This corresponds to the Java Heap field + * in the App Summary section output by dumpsys meminfo.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * <tr> + * <td>summary.native-heap</td> + * <td>The private Native Heap usage in kB. This corresponds to the Native Heap + * field in the App Summary section output by dumpsys meminfo.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * <tr> + * <td>summary.code</td> + * <td>The memory usage for static code and resources in kB. This corresponds to + * the Code field in the App Summary section output by dumpsys meminfo.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * <tr> + * <td>summary.stack</td> + * <td>The stack usage in kB. This corresponds to the Stack field in the + * App Summary section output by dumpsys meminfo.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * <tr> + * <td>summary.graphics</td> + * <td>The graphics usage in kB. This corresponds to the Graphics field in the + * App Summary section output by dumpsys meminfo.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * <tr> + * <td>summary.private-other</td> + * <td>Other private memory usage in kB. This corresponds to the Private Other + * field output in the App Summary section by dumpsys meminfo.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * <tr> + * <td>summary.system</td> + * <td>Shared and system memory usage in kB. This corresponds to the System + * field output in the App Summary section by dumpsys meminfo.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * <tr> + * <td>summary.total-pss</td> + * <td>Total PPS memory usage in kB.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * <tr> + * <td>summary.total-swap</td> + * <td>Total swap usage in kB.</td> + * <td>{@code 1442}</td> + * <td>23</td> + * </tr> + * </tbody> + * </table> + */ + public String getMemoryStat(String statName) { + switch(statName) { + case "summary.java-heap": + return Integer.toString(getSummaryJavaHeap()); + case "summary.native-heap": + return Integer.toString(getSummaryNativeHeap()); + case "summary.code": + return Integer.toString(getSummaryCode()); + case "summary.stack": + return Integer.toString(getSummaryStack()); + case "summary.graphics": + return Integer.toString(getSummaryGraphics()); + case "summary.private-other": + return Integer.toString(getSummaryPrivateOther()); + case "summary.system": + return Integer.toString(getSummarySystem()); + case "summary.total-pss": + return Integer.toString(getSummaryTotalPss()); + case "summary.total-swap": + return Integer.toString(getSummaryTotalSwap()); + default: + return null; + } + } + + /** + * Returns a map of the names/values of the memory statistics + * that {@link #getMemoryStat(String)} supports. + * + * @return a map of the names/values of the supported memory statistics. + */ + public Map<String, String> getMemoryStats() { + Map<String, String> stats = new HashMap<String, String>(); + stats.put("summary.java-heap", Integer.toString(getSummaryJavaHeap())); + stats.put("summary.native-heap", Integer.toString(getSummaryNativeHeap())); + stats.put("summary.code", Integer.toString(getSummaryCode())); + stats.put("summary.stack", Integer.toString(getSummaryStack())); + stats.put("summary.graphics", Integer.toString(getSummaryGraphics())); + stats.put("summary.private-other", Integer.toString(getSummaryPrivateOther())); + stats.put("summary.system", Integer.toString(getSummarySystem())); + stats.put("summary.total-pss", Integer.toString(getSummaryTotalPss())); + stats.put("summary.total-swap", Integer.toString(getSummaryTotalSwap())); + return stats; + } + /** * Pss of Java Heap bytes in KB due to the application. * Notes: diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 009649f..dbb5146 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -21,6 +21,7 @@ import android.net.LocalSocketAddress; import android.system.Os; import android.util.Log; import com.android.internal.os.Zygote; +import dalvik.system.VMRuntime; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.IOException; @@ -744,7 +745,14 @@ public class Process { * @return Returns the number of milliseconds this process has return. */ public static final native long getElapsedCpuTime(); - + + /** + * Returns true if the current process is a 64-bit runtime. + */ + public static final boolean is64Bit() { + return VMRuntime.getRuntime().is64Bit(); + } + /** * Returns the identifier of this process, which can be used with * {@link #killProcess} and {@link #sendSignal}. diff --git a/core/java/android/service/carrier/CarrierService.java b/core/java/android/service/carrier/CarrierService.java index 4a4a375..5f83452 100644 --- a/core/java/android/service/carrier/CarrierService.java +++ b/core/java/android/service/carrier/CarrierService.java @@ -59,16 +59,16 @@ public abstract class CarrierService extends Service { * <ol> * <li>The carrier app package is updated, or</li> * <li>The carrier app requests a reload with - * {@link android.telephony.CarrierConfigManager#reloadCarrierConfigForSubId - * reloadCarrierConfigForSubId}.</li> + * {@link android.telephony.CarrierConfigManager#notifyConfigChangedForSubId + * notifyConfigChangedForSubId}.</li> * </ol> * This method can be called after a SIM card loads, which may be before or after boot. * </p> * <p> * This method should not block for a long time. If expensive operations (e.g. network access) * are required, this method can schedule the work and return null. Then, use - * {@link android.telephony.CarrierConfigManager#reloadCarrierConfigForSubId - * reloadCarrierConfigForSubId} to trigger a reload when the config is ready. + * {@link android.telephony.CarrierConfigManager#notifyConfigChangedForSubId + * notifyConfigChangedForSubId} to trigger a reload when the config is ready. * </p> * <p> * Implementations should use the keys defined in {@link android.telephony.CarrierConfigManager diff --git a/core/java/android/util/LayoutDirection.java b/core/java/android/util/LayoutDirection.java index 20af20b..03077e4 100644 --- a/core/java/android/util/LayoutDirection.java +++ b/core/java/android/util/LayoutDirection.java @@ -27,6 +27,12 @@ public final class LayoutDirection { private LayoutDirection() {} /** + * An undefined layout direction. + * @hide + */ + public static final int UNDEFINED = -1; + + /** * Horizontal layout direction is from Left to Right. */ public static final int LTR = 0; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 342315b..5dd5ab8 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1872,6 +1872,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public @interface ResolvedLayoutDir {} /** + * A flag to indicate that the layout direction of this view has not been defined yet. + * @hide + */ + public static final int LAYOUT_DIRECTION_UNDEFINED = LayoutDirection.UNDEFINED; + + /** * Horizontal layout direction of this view is from Left to Right. * Use with {@link #setLayoutDirection}. */ diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java index c0395cf..76c8fbd 100644 --- a/core/java/android/view/inputmethod/EditorInfo.java +++ b/core/java/android/view/inputmethod/EditorInfo.java @@ -298,6 +298,17 @@ public class EditorInfo implements InputType, Parcelable { /** * Name of the package that owns this editor. + * + * <p><strong>IME authors:</strong> In API level 22 + * {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1} and prior, do not trust this package + * name. The system had not verified the consistency between the package name here and + * application's uid. Consider to use {@link InputBinding#getUid()}, which is trustworthy. + * Starting from Android MNC, the system verifies the consistency between this package name + * and application uid before {@link EditorInfo} is passed to the input method.</p> + * + * <p><strong>Editor authors:</strong> Starting from Android MNC, the application is no longer + * able to establish input connections if the package name provided here is inconsistent with + * application's uid.</p> */ public String packageName; diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 5080fcc..aa72eb3 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -611,41 +611,45 @@ public class WebView extends AbsoluteLayout /** * Specifies whether the horizontal scrollbar has overlay style. * + * @deprecated This method has no effect. * @param overlay true if horizontal scrollbar should have overlay style */ + @Deprecated public void setHorizontalScrollbarOverlay(boolean overlay) { - checkThread(); - mProvider.setHorizontalScrollbarOverlay(overlay); } /** * Specifies whether the vertical scrollbar has overlay style. * + * @deprecated This method has no effect. * @param overlay true if vertical scrollbar should have overlay style */ + @Deprecated public void setVerticalScrollbarOverlay(boolean overlay) { - checkThread(); - mProvider.setVerticalScrollbarOverlay(overlay); } /** * Gets whether horizontal scrollbar has overlay style. * - * @return true if horizontal scrollbar has overlay style + * @deprecated This method is now obsolete. + * @return true */ + @Deprecated public boolean overlayHorizontalScrollbar() { - checkThread(); - return mProvider.overlayHorizontalScrollbar(); + // The old implementation defaulted to true, so return true for consistency + return true; } /** * Gets whether vertical scrollbar has overlay style. * - * @return true if vertical scrollbar has overlay style + * @deprecated This method is now obsolete. + * @return false */ + @Deprecated public boolean overlayVerticalScrollbar() { - checkThread(); - return mProvider.overlayVerticalScrollbar(); + // The old implementation defaulted to false, so return false for consistency + return false; } /** diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java index 09afcf1..27033ad 100644 --- a/core/java/android/webkit/WebViewProvider.java +++ b/core/java/android/webkit/WebViewProvider.java @@ -70,12 +70,16 @@ public interface WebViewProvider { public void init(Map<String, Object> javaScriptInterfaces, boolean privateBrowsing); + // Deprecated - should never be called public void setHorizontalScrollbarOverlay(boolean overlay); + // Deprecated - should never be called public void setVerticalScrollbarOverlay(boolean overlay); + // Deprecated - should never be called public boolean overlayHorizontalScrollbar(); + // Deprecated - should never be called public boolean overlayVerticalScrollbar(); public int getVisibleTitleHeight(); diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index f153ce5..9d14254 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -185,6 +185,8 @@ public class LinearLayout extends ViewGroup { private int mShowDividers; private int mDividerPadding; + private int mLayoutDirection = View.LAYOUT_DIRECTION_UNDEFINED; + public LinearLayout(Context context) { this(context, null); } @@ -1567,6 +1569,17 @@ public class LinearLayout extends ViewGroup { } } + @Override + public void onRtlPropertiesChanged(@ResolvedLayoutDir int layoutDirection) { + super.onRtlPropertiesChanged(layoutDirection); + if (layoutDirection != mLayoutDirection) { + mLayoutDirection = layoutDirection; + if (mOrientation == HORIZONTAL) { + requestLayout(); + } + } + } + /** * Position the children during a layout pass if the orientation of this * LinearLayout is set to {@link #HORIZONTAL}. |