Merge "Fix texture image internalformat/type validation."
diff --git a/api/current.txt b/api/current.txt
index 1c97c66..573e635 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -16582,7 +16582,7 @@
field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
}
- public static abstract class FingerprintManager.AuthenticationCallback {
+ public static abstract deprecated class FingerprintManager.AuthenticationCallback {
ctor public FingerprintManager.AuthenticationCallback();
method public void onAuthenticationError(int, java.lang.CharSequence);
method public void onAuthenticationFailed();
@@ -16590,11 +16590,11 @@
method public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintManager.AuthenticationResult);
}
- public static class FingerprintManager.AuthenticationResult {
+ public static deprecated class FingerprintManager.AuthenticationResult {
method public android.hardware.fingerprint.FingerprintManager.CryptoObject getCryptoObject();
}
- public static final class FingerprintManager.CryptoObject {
+ public static final deprecated class FingerprintManager.CryptoObject {
ctor public FingerprintManager.CryptoObject(java.security.Signature);
ctor public FingerprintManager.CryptoObject(javax.crypto.Cipher);
ctor public FingerprintManager.CryptoObject(javax.crypto.Mac);
@@ -34637,10 +34637,9 @@
field public static final java.lang.String DURATION = "duration";
field public static final java.lang.String EXTRA_CALL_TYPE_FILTER = "android.provider.extra.CALL_TYPE_FILTER";
field public static final java.lang.String FEATURES = "features";
- field public static final int FEATURES_ASSISTED_DIALING_USED = 16; // 0x10
field public static final int FEATURES_HD_CALL = 4; // 0x4
field public static final int FEATURES_PULLED_EXTERNALLY = 2; // 0x2
- field public static final int FEATURES_RTT = 32; // 0x20
+ field public static final int FEATURES_RTT = 16; // 0x10
field public static final int FEATURES_VIDEO = 1; // 0x1
field public static final int FEATURES_WIFI = 8; // 0x8
field public static final java.lang.String GEOCODED_LOCATION = "geocoded_location";
@@ -40630,7 +40629,6 @@
field public static final int CAPABILITY_SUPPORT_DEFLECT = 16777216; // 0x1000000
field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2
field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8
- field public static final int PROPERTY_ASSISTED_DIALING_USED = 512; // 0x200
field public static final int PROPERTY_CONFERENCE = 1; // 0x1
field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 4; // 0x4
field public static final int PROPERTY_ENTERPRISE_CALL = 32; // 0x20
@@ -40855,7 +40853,6 @@
field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS";
field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER";
- field public static final int PROPERTY_ASSISTED_DIALING_USED = 512; // 0x200
field public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 32; // 0x20
field public static final int PROPERTY_IS_EXTERNAL_CALL = 16; // 0x10
field public static final int PROPERTY_IS_RTT = 256; // 0x100
@@ -41272,14 +41269,12 @@
field public static final deprecated java.lang.String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL";
field public static final java.lang.String ACTION_PHONE_ACCOUNT_REGISTERED = "android.telecom.action.PHONE_ACCOUNT_REGISTERED";
field public static final java.lang.String ACTION_PHONE_ACCOUNT_UNREGISTERED = "android.telecom.action.PHONE_ACCOUNT_UNREGISTERED";
- field public static final java.lang.String ACTION_SHOW_ASSISTED_DIALING_SETTINGS = "android.telecom.action.SHOW_ASSISTED_DIALING_SETTINGS";
field public static final java.lang.String ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS = "android.telecom.action.SHOW_CALL_ACCESSIBILITY_SETTINGS";
field public static final java.lang.String ACTION_SHOW_CALL_SETTINGS = "android.telecom.action.SHOW_CALL_SETTINGS";
field public static final java.lang.String ACTION_SHOW_MISSED_CALLS_NOTIFICATION = "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION";
field public static final java.lang.String ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS = "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS";
field public static final char DTMF_CHARACTER_PAUSE = 44; // 0x002c ','
field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';'
- field public static final java.lang.String EXTRA_ASSISTED_DIALING_TRANSFORMATION_INFO = "android.telecom.extra.ASSISTED_DIALING_TRANSFORMATION_INFO";
field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE";
@@ -41295,7 +41290,6 @@
field public static final java.lang.String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
- field public static final java.lang.String EXTRA_USE_ASSISTED_DIALING = "android.telecom.extra.USE_ASSISTED_DIALING";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE";
field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS";
@@ -41308,18 +41302,6 @@
field public static final int PRESENTATION_UNKNOWN = 3; // 0x3
}
- public final class TransformationInfo implements android.os.Parcelable {
- ctor public TransformationInfo(java.lang.String, java.lang.String, java.lang.String, java.lang.String, int);
- method public int describeContents();
- method public java.lang.String getOriginalNumber();
- method public java.lang.String getTransformedNumber();
- method public int getTransformedNumberCountryCallingCode();
- method public java.lang.String getUserHomeCountryCode();
- method public java.lang.String getUserRoamingCountryCode();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telecom.TransformationInfo> CREATOR;
- }
-
public class VideoProfile implements android.os.Parcelable {
ctor public VideoProfile(int);
ctor public VideoProfile(int, int);
@@ -41486,7 +41468,6 @@
field public static final java.lang.String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL = "allow_non_emergency_calls_in_ecm_bool";
field public static final java.lang.String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL = "always_show_emergency_alert_onoff_bool";
field public static final java.lang.String KEY_APN_EXPAND_BOOL = "apn_expand_bool";
- field public static final java.lang.String KEY_ASSISTED_DIALING_ENABLED_BOOL = "assisted_dialing_enabled_bool";
field public static final java.lang.String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool";
field public static final java.lang.String KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY = "call_forwarding_blocks_while_roaming_string_array";
field public static final java.lang.String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL = "carrier_allow_turnoff_ims_bool";
diff --git a/api/system-current.txt b/api/system-current.txt
index 0932223..a581bab 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -4297,6 +4297,7 @@
public class RecoveryController {
method public android.security.keystore.recovery.RecoverySession createRecoverySession();
method public byte[] generateAndStoreKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method public java.security.Key generateKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
method public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public static android.security.keystore.recovery.RecoveryController getInstance(android.content.Context);
method public int[] getPendingRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
@@ -4326,7 +4327,6 @@
public final class WrappedApplicationKey implements android.os.Parcelable {
method public int describeContents();
- method public byte[] getAccount();
method public java.lang.String getAlias();
method public byte[] getEncryptedKeyMaterial();
method public void writeToParcel(android.os.Parcel, int);
@@ -4336,7 +4336,6 @@
public static class WrappedApplicationKey.Builder {
ctor public WrappedApplicationKey.Builder();
method public android.security.keystore.recovery.WrappedApplicationKey build();
- method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]);
method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAlias(java.lang.String);
method public android.security.keystore.recovery.WrappedApplicationKey.Builder setEncryptedKeyMaterial(byte[]);
}
diff --git a/api/system-removed.txt b/api/system-removed.txt
index cd56c46..58652a2 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -98,6 +98,7 @@
}
public class RecoveryController {
+ method public deprecated java.security.Key generateKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
method public deprecated java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
@@ -108,6 +109,14 @@
method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
}
+ public final class WrappedApplicationKey implements android.os.Parcelable {
+ method public deprecated byte[] getAccount();
+ }
+
+ public static class WrappedApplicationKey.Builder {
+ method public deprecated android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]);
+ }
+
}
package android.service.notification {
diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java
index 0a0d214..605dbd2 100644
--- a/core/java/android/bluetooth/BluetoothUuid.java
+++ b/core/java/android/bluetooth/BluetoothUuid.java
@@ -79,9 +79,8 @@
ParcelUuid.fromString("00001132-0000-1000-8000-00805F9B34FB");
public static final ParcelUuid SAP =
ParcelUuid.fromString("0000112D-0000-1000-8000-00805F9B34FB");
- /* TODO: b/69623109 update this value. It will change to 16bit UUID!! */
public static final ParcelUuid HearingAid =
- ParcelUuid.fromString("7312C48F-22CC-497F-85FD-A0616A3B9E05");
+ ParcelUuid.fromString("0000FDF0-0000-1000-8000-00805f9b34fb");
public static final ParcelUuid BASE_UUID =
ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB");
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index bd54522..8048099c 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -108,7 +108,9 @@
/**
* A wrapper class for the crypto objects supported by FingerprintManager. Currently the
* framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects.
+ * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.CryptoObject}
*/
+ @Deprecated
public static final class CryptoObject extends android.hardware.biometrics.CryptoObject {
public CryptoObject(@NonNull Signature signature) {
super(signature);
@@ -150,7 +152,9 @@
/**
* Container for callback data from {@link FingerprintManager#authenticate(CryptoObject,
* CancellationSignal, int, AuthenticationCallback, Handler)}.
+ * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.AuthenticationResult}
*/
+ @Deprecated
public static class AuthenticationResult {
private Fingerprint mFingerprint;
private CryptoObject mCryptoObject;
@@ -197,7 +201,9 @@
* FingerprintManager#authenticate(CryptoObject, CancellationSignal,
* int, AuthenticationCallback, Handler) } must provide an implementation of this for listening to
* fingerprint events.
+ * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.AuthenticationCallback}
*/
+ @Deprecated
public static abstract class AuthenticationCallback
extends BiometricAuthenticator.AuthenticationCallback {
/**
diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java
index c6c8d9d..60df467 100644
--- a/core/java/android/provider/CallLog.java
+++ b/core/java/android/provider/CallLog.java
@@ -223,13 +223,14 @@
/** Call was WIFI call. */
public static final int FEATURES_WIFI = 1 << 3;
+ /** Call was on RTT at some point */
+ public static final int FEATURES_RTT = 1 << 4;
+
/**
* Indicates the call underwent Assisted Dialing.
+ * @hide
*/
- public static final int FEATURES_ASSISTED_DIALING_USED = 1 << 4;
-
- /** Call was on RTT at some point */
- public static final int FEATURES_RTT = 1 << 5;
+ public static final Integer FEATURES_ASSISTED_DIALING_USED = 0x10;
/**
* The phone number as the user entered it.
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index 3389238..0d262c9 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -462,35 +462,38 @@
}
/**
- * Generates a AES256/GCM/NoPADDING key called {@code alias} and loads it into the recoverable
- * key store. Returns {@link javax.crypto.SecretKey}.
- *
- * @param alias The key alias.
- * @param account The account associated with the key.
- * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
- * service.
- * @throws LockScreenRequiredException if the user has not set a lock screen. This is required
- * to generate recoverable keys, as the snapshots are encrypted using a key derived from the
- * lock screen.
- * @hide
+ * @deprecated Use {@link #generateKey(String)}.
+ * @removed
*/
+ @Deprecated
public Key generateKey(@NonNull String alias, byte[] account)
throws InternalRecoveryServiceException, LockScreenRequiredException {
- // TODO: update RecoverySession.recoverKeys
+ return generateKey(alias);
+ }
+
+ /**
+ * Generates a recoverable key with the given {@code alias}.
+ *
+ * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
+ * service.
+ * @throws LockScreenRequiredException if the user does not have a lock screen set. A lock
+ * screen is required to generate recoverable keys.
+ */
+ public Key generateKey(@NonNull String alias) throws InternalRecoveryServiceException,
+ LockScreenRequiredException {
try {
- String grantAlias = mBinder.generateKey(alias, account);
+ String grantAlias = mBinder.generateKey(alias);
if (grantAlias == null) {
- return null;
+ throw new InternalRecoveryServiceException("null grant alias");
}
- Key result = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
+ return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
mKeyStore,
grantAlias,
KeyStore.UID_SELF);
- return result;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (UnrecoverableKeyException e) {
- throw new InternalRecoveryServiceException("Access to newly generated key failed for");
+ throw new InternalRecoveryServiceException("Failed to get key from keystore", e);
} catch (ServiceSpecificException e) {
if (e.errorCode == ERROR_INSECURE_USER) {
throw new LockScreenRequiredException(e.getMessage());
diff --git a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
index f360bbe9..df9766d 100644
--- a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
+++ b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -18,7 +18,6 @@
import android.annotation.NonNull;
import android.annotation.SystemApi;
-
import android.os.Parcel;
import android.os.Parcelable;
@@ -29,7 +28,6 @@
*
* <ul>
* <li>Alias - Keystore alias of the key.
- * <li>Account Recovery Agent specific account associated with the key.
* <li>Encrypted key material.
* </ul>
*
@@ -43,7 +41,6 @@
private String mAlias;
// The only supported format is AES-256 symmetric key.
private byte[] mEncryptedKeyMaterial;
- private byte[] mAccount;
/**
* Builder for creating {@link WrappedApplicationKey}.
@@ -63,13 +60,11 @@
}
/**
- * Sets Recovery agent specific account.
- *
- * @param account The account.
- * @return This builder.
+ * @deprecated AOSP does not associate keys with accounts. This may be done by system app.
+ * @removed
*/
+ @Deprecated
public Builder setAccount(@NonNull byte[] account) {
- mInstance.mAccount = account;
return this;
}
@@ -94,15 +89,11 @@
@NonNull public WrappedApplicationKey build() {
Preconditions.checkNotNull(mInstance.mAlias);
Preconditions.checkNotNull(mInstance.mEncryptedKeyMaterial);
- if (mInstance.mAccount == null) {
- mInstance.mAccount = new byte[]{};
- }
return mInstance;
}
}
- private WrappedApplicationKey() {
- }
+ private WrappedApplicationKey() { }
/**
* Deprecated - consider using Builder.
@@ -127,12 +118,13 @@
return mEncryptedKeyMaterial;
}
- /** Account, default value is empty array */
+ /**
+ * @deprecated AOSP does not associate keys with accounts. This may be done by system app.
+ * @removed
+ */
+ @Deprecated
public @NonNull byte[] getAccount() {
- if (mAccount == null) {
- return new byte[]{};
- }
- return mAccount;
+ return new byte[0];
}
public static final Parcelable.Creator<WrappedApplicationKey> CREATOR =
@@ -150,7 +142,6 @@
public void writeToParcel(Parcel out, int flags) {
out.writeString(mAlias);
out.writeByteArray(mEncryptedKeyMaterial);
- out.writeByteArray(mAccount);
}
/**
@@ -159,7 +150,6 @@
protected WrappedApplicationKey(Parcel in) {
mAlias = in.readString();
mEncryptedKeyMaterial = in.createByteArray();
- mAccount = in.createByteArray();
}
@Override
diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl
index 1fc2796..d3fc644 100644
--- a/core/java/com/android/internal/widget/ILockSettings.aidl
+++ b/core/java/com/android/internal/widget/ILockSettings.aidl
@@ -67,7 +67,7 @@
void initRecoveryService(in String rootCertificateAlias, in byte[] signedPublicKeyList);
KeyChainSnapshot getKeyChainSnapshot();
byte[] generateAndStoreKey(String alias);
- String generateKey(String alias, in byte[] account);
+ String generateKey(String alias);
String getKey(String alias);
void removeKey(String alias);
void setSnapshotCreatedPendingIntent(in PendingIntent intent);
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 2d31c5a..69abed3 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -36,6 +36,11 @@
optional ConstantsProto settings = 1;
+ optional int32 current_heartbeat = 14;
+ repeated int32 next_heartbeat = 15;
+ optional int64 last_heartbeat_time_millis = 16;
+ optional int64 next_heartbeat_time_millis = 17;
+
repeated int32 started_users = 2;
message RegisteredJob {
@@ -54,6 +59,8 @@
optional bool is_job_currently_active = 6;
optional bool is_uid_backing_up = 7;
optional bool is_component_present = 8;
+
+ optional int64 last_run_heartbeat = 9;
}
repeated RegisteredJob registered_jobs = 3;
diff --git a/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf
new file mode 100644
index 0000000..47ab623
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx
new file mode 100644
index 0000000..5540277
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="1em"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x10000"/>
+ <ascent value="10000"/>
+ <descent value="-10000"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="0"/>
+ <mtx name="1em" width="1000" lsb="0"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x000A" name="1em" /> <!-- LINE FEED -->
+ <map code="0x000D" name="1em" /> <!-- CARRIAGE RETURN -->
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="1em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java
new file mode 100644
index 0000000..15afbdd
--- /dev/null
+++ b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.keystore.recovery;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class WrappedApplicationKeyTest {
+
+ private static final String ALIAS = "karlin";
+ private static final byte[] KEY_MATERIAL = new byte[] { 0, 1, 2, 3, 4 };
+
+ private Parcel mParcel;
+
+ @Before
+ public void setUp() {
+ mParcel = Parcel.obtain();
+ }
+
+ @After
+ public void tearDown() {
+ mParcel.recycle();
+ }
+
+ @Test
+ public void build_setsAlias() {
+ assertEquals(ALIAS, buildTestKey().getAlias());
+ }
+
+ @Test
+ public void build_setsEncryptedKeyMaterial() {
+ assertArrayEquals(KEY_MATERIAL, buildTestKey().getEncryptedKeyMaterial());
+ }
+
+ @Test
+ public void writeToParcel_writesAliasToParcel() {
+ buildTestKey().writeToParcel(mParcel, /*flags=*/ 0);
+
+ mParcel.setDataPosition(0);
+ WrappedApplicationKey readFromParcel =
+ WrappedApplicationKey.CREATOR.createFromParcel(mParcel);
+ assertEquals(ALIAS, readFromParcel.getAlias());
+ }
+
+ @Test
+ public void writeToParcel_writesKeyMaterial() {
+ buildTestKey().writeToParcel(mParcel, /*flags=*/ 0);
+
+ mParcel.setDataPosition(0);
+ WrappedApplicationKey readFromParcel =
+ WrappedApplicationKey.CREATOR.createFromParcel(mParcel);
+ assertArrayEquals(KEY_MATERIAL, readFromParcel.getEncryptedKeyMaterial());
+ }
+
+ private WrappedApplicationKey buildTestKey() {
+ return new WrappedApplicationKey.Builder()
+ .setAlias(ALIAS)
+ .setEncryptedKeyMaterial(KEY_MATERIAL)
+ .build();
+ }
+}
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java
index d817278..2521712 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java
@@ -822,6 +822,9 @@
+ " <family>"
+ " <font weight='400' style='normal'>ascent3em-descent4em.ttf</font>"
+ " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>ascent10em-descent10em.ttf</font>"
+ + " </family>"
+ "</familyset>";
try (FontFallbackSetup setup =
@@ -833,7 +836,7 @@
assertEquals(2 * textSize, paint.descent(), 0.0f);
final int paraWidth = 5 * textSize;
- final String text = "aaaaa aabaa aaaaa"; // This should result in three lines.
+ final String text = "aaaaa\naabaa\naaaaa\n"; // This should result in three lines.
// Old line spacing. All lines should get their ascent and descents from the first font.
StaticLayout layout = StaticLayout.Builder
@@ -841,13 +844,17 @@
.setIncludePad(false)
.setUseLineSpacingFromFallbacks(false)
.build();
- assertEquals(3, layout.getLineCount());
+ assertEquals(4, layout.getLineCount());
assertEquals(-textSize, layout.getLineAscent(0));
assertEquals(2 * textSize, layout.getLineDescent(0));
assertEquals(-textSize, layout.getLineAscent(1));
assertEquals(2 * textSize, layout.getLineDescent(1));
assertEquals(-textSize, layout.getLineAscent(2));
assertEquals(2 * textSize, layout.getLineDescent(2));
+ // The last empty line spacing should be the default line spacing.
+ // Maybe good to be a previous line spacing?
+ assertEquals(-textSize, layout.getLineAscent(3));
+ assertEquals(2 * textSize, layout.getLineDescent(3));
// New line spacing. The second line has a 'b', so it needs more ascent and descent.
layout = StaticLayout.Builder
@@ -855,26 +862,52 @@
.setIncludePad(false)
.setUseLineSpacingFromFallbacks(true)
.build();
- assertEquals(3, layout.getLineCount());
+ assertEquals(4, layout.getLineCount());
assertEquals(-textSize, layout.getLineAscent(0));
assertEquals(2 * textSize, layout.getLineDescent(0));
assertEquals(-3 * textSize, layout.getLineAscent(1));
assertEquals(4 * textSize, layout.getLineDescent(1));
assertEquals(-textSize, layout.getLineAscent(2));
assertEquals(2 * textSize, layout.getLineDescent(2));
+ assertEquals(-textSize, layout.getLineAscent(3));
+ assertEquals(2 * textSize, layout.getLineDescent(3));
// The default is the old line spacing, for backward compatibility.
layout = StaticLayout.Builder
.obtain(text, 0, text.length(), paint, paraWidth)
.setIncludePad(false)
.build();
- assertEquals(3, layout.getLineCount());
+ assertEquals(4, layout.getLineCount());
assertEquals(-textSize, layout.getLineAscent(0));
assertEquals(2 * textSize, layout.getLineDescent(0));
assertEquals(-textSize, layout.getLineAscent(1));
assertEquals(2 * textSize, layout.getLineDescent(1));
assertEquals(-textSize, layout.getLineAscent(2));
assertEquals(2 * textSize, layout.getLineDescent(2));
+ assertEquals(-textSize, layout.getLineAscent(3));
+ assertEquals(2 * textSize, layout.getLineDescent(3));
+
+ layout = StaticLayout.Builder
+ .obtain("\n", 0, 1, paint, textSize)
+ .setIncludePad(false)
+ .setUseLineSpacingFromFallbacks(false)
+ .build();
+ assertEquals(2, layout.getLineCount());
+ assertEquals(-textSize, layout.getLineAscent(0));
+ assertEquals(2 * textSize, layout.getLineDescent(0));
+ assertEquals(-textSize, layout.getLineAscent(1));
+ assertEquals(2 * textSize, layout.getLineDescent(1));
+
+ layout = StaticLayout.Builder
+ .obtain("\n", 0, 1, paint, textSize)
+ .setIncludePad(false)
+ .setUseLineSpacingFromFallbacks(true)
+ .build();
+ assertEquals(2, layout.getLineCount());
+ assertEquals(-textSize, layout.getLineAscent(0));
+ assertEquals(2 * textSize, layout.getLineDescent(0));
+ assertEquals(-textSize, layout.getLineAscent(1));
+ assertEquals(2 * textSize, layout.getLineDescent(1));
}
}
diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp
index e3af655..0a90f85 100644
--- a/libs/input/PointerController.cpp
+++ b/libs/input/PointerController.cpp
@@ -24,15 +24,11 @@
#include <log/log.h>
-// ToDo: Fix code to be warning free
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
#include <SkBitmap.h>
#include <SkCanvas.h>
#include <SkColor.h>
#include <SkPaint.h>
#include <SkBlendMode.h>
-#pragma GCC diagnostic pop
namespace android {
diff --git a/media/java/android/media/MediaMetadata2.java b/media/java/android/media/MediaMetadata2.java
index fabf42b..1f856bc 100644
--- a/media/java/android/media/MediaMetadata2.java
+++ b/media/java/android/media/MediaMetadata2.java
@@ -220,13 +220,25 @@
/**
* A Uri formatted String representing the content. This value is specific to the
* service providing the content. It may be used with
- * {@link MediaController2#playFromUri(String, Bundle)}
+ * {@link MediaController2#playFromUri(Uri, Bundle)}
* to initiate playback when provided by a {@link MediaBrowser2} connected to
* the same app.
*/
public static final String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI";
/**
+ * The radio frequency in Float format if this metdata representing radio content.
+ */
+ public static final String METADATA_KEY_RADIO_FREQUENCY =
+ "android.media.metadata.RADIO_FREQUENCY";
+
+ /**
+ * The radio callsign in String format if this metdata representing radio content.
+ */
+ public static final String METADATA_KEY_RADIO_CALLSIGN =
+ "android.media.metadata.RADIO_CALLSIGN";
+
+ /**
* The bluetooth folder type of the media specified in the section 6.10.2.2 of the Bluetooth
* AVRCP 1.5. It should be one of the following:
* <ul>
@@ -327,9 +339,8 @@
/**
* A {@link Bundle} extra.
- * @hide
*/
- public static final String METADATA_KEY_EXTRA = "android.media.metadata.EXTRA";
+ public static final String METADATA_KEY_EXTRAS = "android.media.metadata.EXTRAS";
/**
* @hide
@@ -339,7 +350,7 @@
METADATA_KEY_DATE, METADATA_KEY_GENRE, METADATA_KEY_ALBUM_ARTIST, METADATA_KEY_ART_URI,
METADATA_KEY_ALBUM_ART_URI, METADATA_KEY_DISPLAY_TITLE, METADATA_KEY_DISPLAY_SUBTITLE,
METADATA_KEY_DISPLAY_DESCRIPTION, METADATA_KEY_DISPLAY_ICON_URI,
- METADATA_KEY_MEDIA_ID, METADATA_KEY_MEDIA_URI})
+ METADATA_KEY_MEDIA_ID, METADATA_KEY_MEDIA_URI, METADATA_KEY_RADIO_CALLSIGN})
@Retention(RetentionPolicy.SOURCE)
public @interface TextKey {}
@@ -366,6 +377,13 @@
@Retention(RetentionPolicy.SOURCE)
public @interface RatingKey {}
+ /**
+ * @hide
+ */
+ @StringDef({METADATA_KEY_RADIO_FREQUENCY})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface FloatKey {}
+
private final MediaMetadata2Provider mProvider;
/**
@@ -399,9 +417,9 @@
}
/**
- * Returns the value associated with the given key, or null if no mapping of
- * the desired type exists for the given key or a null value is explicitly
- * associated with the key.
+ * Returns the media id, or {@code null} if the id doesn't exist.
+ *<p>
+ * This is equivalent to the {@link #getString(String)} with the {@link #METADATA_KEY_MEDIA_ID}.
*
* @return media id. Can be {@code null}
* @see #METADATA_KEY_MEDIA_ID
@@ -459,12 +477,23 @@
}
/**
+ * Return the value associated with the given key, or 0.0f if no long exists
+ * for the given key.
+ *
+ * @param key The key the value is stored under
+ * @return a float value
+ */
+ public float getFloat(@NonNull @FloatKey String key) {
+ return mProvider.getFloat_impl(key);
+ }
+
+ /**
* Get the extra {@link Bundle} from the metadata object.
*
* @return A {@link Bundle} or {@code null}
*/
- public @Nullable Bundle getExtra() {
- return mProvider.getExtra_impl();
+ public @Nullable Bundle getExtras() {
+ return mProvider.getExtras_impl();
}
/**
@@ -594,6 +623,7 @@
* <li>{@link #METADATA_KEY_DISPLAY_SUBTITLE}</li>
* <li>{@link #METADATA_KEY_DISPLAY_DESCRIPTION}</li>
* <li>{@link #METADATA_KEY_DISPLAY_ICON_URI}</li>
+ * <li>{@link #METADATA_KEY_RADIO_CALLSIGN}</li>
* </ul>
*
* @param key The key for referencing this value
@@ -667,10 +697,29 @@
}
/**
- * Set an extra {@link Bundle} into the metadata.
+ * Put a float value into the metadata. Custom keys may be used, but if
+ * the METADATA_KEYs defined in this class are used they may only be one
+ * of the following:
+ * <ul>
+ * <li>{@link #METADATA_KEY_RADIO_FREQUENCY}</li>
+ * </ul>
+ *
+ * @param key The key for referencing this value
+ * @param value The float value to store
+ * @return The Builder to allow chaining
*/
- public @NonNull Builder setExtra(@Nullable Bundle bundle) {
- return mProvider.setExtra_impl(bundle);
+ public @NonNull Builder putFloat(@NonNull @LongKey String key, float value) {
+ return mProvider.putFloat_impl(key, value);
+ }
+
+ /**
+ * Set a bundle of extras.
+ *
+ * @param extras The extras to include with this description or null.
+ * @return The Builder to allow chaining
+ */
+ public Builder setExtras(@Nullable Bundle extras) {
+ return mProvider.setExtras_impl(extras);
}
/**
diff --git a/media/java/android/media/update/MediaMetadata2Provider.java b/media/java/android/media/update/MediaMetadata2Provider.java
index 55ac43d..b6e5c8a 100644
--- a/media/java/android/media/update/MediaMetadata2Provider.java
+++ b/media/java/android/media/update/MediaMetadata2Provider.java
@@ -23,7 +23,8 @@
Set<String> keySet_impl();
int size_impl();
Bitmap getBitmap_impl(String key);
- Bundle getExtra_impl();
+ float getFloat_impl(String key);
+ Bundle getExtras_impl();
interface BuilderProvider {
Builder putText_impl(String key, CharSequence value);
@@ -31,7 +32,8 @@
Builder putLong_impl(String key, long value);
Builder putRating_impl(String key, Rating2 value);
Builder putBitmap_impl(String key, Bitmap value);
- Builder setExtra_impl(Bundle bundle);
+ Builder putFloat_impl(String key, float value);
+ Builder setExtras_impl(Bundle bundle);
MediaMetadata2 build_impl();
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java b/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java
new file mode 100644
index 0000000..3d55c4f
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 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.settingslib.utils;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.util.ArrayMap;
+
+
+/**
+ * Icon cache to avoid multiple loads on the same icon.
+ */
+public class IconCache {
+ private final Context mContext;
+ @VisibleForTesting
+ final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>();
+
+ public IconCache(Context context) {
+ mContext = context;
+ }
+
+ public Drawable getIcon(Icon icon) {
+ if (icon == null) {
+ return null;
+ }
+ Drawable drawable = mMap.get(icon);
+ if (drawable == null) {
+ drawable = icon.loadDrawable(mContext);
+ updateIcon(icon, drawable);
+ }
+ return drawable;
+ }
+
+ public void updateIcon(Icon icon, Drawable drawable) {
+ mMap.put(icon, drawable);
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java
new file mode 100644
index 0000000..026ad47
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2018 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.settingslib.utils;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class IconCacheTest {
+ private Icon mIcon;
+ private Context mContext;
+ private IconCache mIconCache;
+
+ @Before
+ public void setUp() {
+ mContext = spy(RuntimeEnvironment.application);
+ mIcon = mock(Icon.class);
+ Drawable drawable = mock(Drawable.class);
+ doReturn(drawable).when(mIcon).loadDrawable(mContext);
+ mIconCache = new IconCache(mContext);
+ }
+
+ @Test
+ public void testGetIcon_iconisNull() {
+ assertThat(mIconCache.getIcon(null)).isNull();
+ }
+
+ @Test
+ public void testGetIcon_iconAlreadyLoaded() {
+ mIconCache.getIcon(mIcon);
+ verify(mIcon, times(1)).loadDrawable(mContext);
+ mIconCache.getIcon(mIcon);
+ verify(mIcon, times(1)).loadDrawable(mContext);
+ }
+
+ @Test
+ public void testGetIcon_iconLoadedFirstTime() {
+ mIconCache.getIcon(mIcon);
+ assertTrue(mIconCache.mMap.containsKey(mIcon));
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index e86d88d..840f55c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -167,6 +167,9 @@
@Override
public void onRecentsAnimationStarted() {
mNavigationBarView.setRecentsAnimationStarted(true);
+
+ // Use navbar dragging as a signal to hide the rotate button
+ setRotateSuggestionButtonState(false);
}
@Override
@@ -446,10 +449,11 @@
}
if (visible) { // Appear and change (cannot force)
- // Stop any currently running hide animations
+ // Stop and clear any currently running hide animations
if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) {
- mRotateHideAnimator.pause();
+ mRotateHideAnimator.cancel();
}
+ mRotateHideAnimator = null;
// Reset the alpha if any has changed due to hide animation
view.setAlpha(1f);
@@ -978,7 +982,10 @@
@Override
public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) {
- setRotateSuggestionButtonState(false);
+ // Only hide the icon if the top task changes its requestedOrientation
+ // Launcher can alter its requestedOrientation while it's not on top, don't hide on this
+ final boolean top = ActivityManagerWrapper.getInstance().getRunningTask().id == taskId;
+ if (top) setRotateSuggestionButtonState(false);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
index 7ab69b0..7e1aba5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
@@ -34,6 +34,7 @@
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.RemoteInputController;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -68,6 +69,11 @@
mView = RemoteInputView.inflate(mContext, null, row.getEntry(), mController);
}
+ @After
+ public void tearDown() {
+ mContext.unregisterReceiver(mReceiver);
+ }
+
@Test
public void testSendRemoteInput_intentContainsResultsAndSource() throws InterruptedException {
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
index fc043c5..a9b2c96 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
@@ -37,6 +37,7 @@
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -76,6 +77,11 @@
mSpacing = res.getDimensionPixelSize(R.dimen.smart_reply_button_spacing);
}
+ @After
+ public void tearDown() {
+ mContext.unregisterReceiver(mReceiver);
+ }
+
@Test
public void testSendSmartReply_intentContainsResultsAndSource() throws InterruptedException {
setRepliesFromRemoteInput(TEST_CHOICES);
diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java
index 39fc019..965714d 100644
--- a/services/core/java/com/android/server/TextServicesManagerService.java
+++ b/services/core/java/com/android/server/TextServicesManagerService.java
@@ -236,7 +236,7 @@
pw.println(" " + "mTsListener=" + req.mTsListener);
pw.println(" " + "mScListener=" + req.mScListener);
pw.println(
- " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUserId);
+ " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUid);
}
final int numOnGoingSessionRequests = grp.mOnGoingSessionRequests.size();
for (int j = 0; j < numOnGoingSessionRequests; j++) {
@@ -246,7 +246,7 @@
pw.println(" " + "mTsListener=" + req.mTsListener);
pw.println(" " + "mScListener=" + req.mScListener);
pw.println(
- " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUserId);
+ " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUid);
}
final int N = grp.mListeners.getRegisteredCallbackCount();
for (int j = 0; j < N; j++) {
@@ -738,8 +738,7 @@
}
private static final class SessionRequest {
- @UserIdInt
- public final int mUserId;
+ public final int mUid;
@Nullable
public final String mLocale;
@NonNull
@@ -749,10 +748,10 @@
@Nullable
public final Bundle mBundle;
- SessionRequest(@UserIdInt final int userId, @Nullable String locale,
+ SessionRequest(int uid, @Nullable String locale,
@NonNull ITextServicesSessionListener tsListener,
@NonNull ISpellCheckerSessionListener scListener, @Nullable Bundle bundle) {
- mUserId = userId;
+ mUid = uid;
mLocale = locale;
mTsListener = tsListener;
mScListener = scListener;
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 017fada..0e7e540 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -87,6 +87,7 @@
import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerServiceDumpProto.ActiveJob;
import com.android.server.job.JobSchedulerServiceDumpProto.PendingJob;
+import com.android.server.job.JobSchedulerServiceDumpProto.RegisteredJob;
import com.android.server.job.controllers.AppIdleController;
import com.android.server.job.controllers.BackgroundJobsController;
import com.android.server.job.controllers.BatteryController;
@@ -158,6 +159,10 @@
static final int MSG_CHECK_JOB = 1;
static final int MSG_STOP_JOB = 2;
static final int MSG_CHECK_JOB_GREEDY = 3;
+ static final int MSG_UID_STATE_CHANGED = 4;
+ static final int MSG_UID_GONE = 5;
+ static final int MSG_UID_ACTIVE = 6;
+ static final int MSG_UID_IDLE = 7;
/**
* Track Services that have currently active or pending jobs. The index is provided by
@@ -735,32 +740,19 @@
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
- updateUidState(uid, procState);
+ mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
}
@Override public void onUidGone(int uid, boolean disabled) {
- updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
- if (disabled) {
- cancelJobsForUid(uid, "uid gone");
- }
- synchronized (mLock) {
- mDeviceIdleJobsController.setUidActiveLocked(uid, false);
- }
+ mHandler.obtainMessage(MSG_UID_GONE, uid, disabled ? 1 : 0).sendToTarget();
}
@Override public void onUidActive(int uid) throws RemoteException {
- synchronized (mLock) {
- mDeviceIdleJobsController.setUidActiveLocked(uid, true);
- }
+ mHandler.obtainMessage(MSG_UID_ACTIVE, uid, 0).sendToTarget();
}
@Override public void onUidIdle(int uid, boolean disabled) {
- if (disabled) {
- cancelJobsForUid(uid, "app uid idle");
- }
- synchronized (mLock) {
- mDeviceIdleJobsController.setUidActiveLocked(uid, false);
- }
+ mHandler.obtainMessage(MSG_UID_IDLE, uid, disabled ? 1 : 0).sendToTarget();
}
@Override public void onUidCachedChanged(int uid, boolean cached) {
@@ -1557,6 +1549,44 @@
cancelJobImplLocked((JobStatus) message.obj, null,
"app no longer allowed to run");
break;
+
+ case MSG_UID_STATE_CHANGED: {
+ final int uid = message.arg1;
+ final int procState = message.arg2;
+ updateUidState(uid, procState);
+ break;
+ }
+ case MSG_UID_GONE: {
+ final int uid = message.arg1;
+ final boolean disabled = message.arg2 != 0;
+ updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ if (disabled) {
+ cancelJobsForUid(uid, "uid gone");
+ }
+ synchronized (mLock) {
+ mDeviceIdleJobsController.setUidActiveLocked(uid, false);
+ }
+ break;
+ }
+ case MSG_UID_ACTIVE: {
+ final int uid = message.arg1;
+ synchronized (mLock) {
+ mDeviceIdleJobsController.setUidActiveLocked(uid, true);
+ }
+ break;
+ }
+ case MSG_UID_IDLE: {
+ final int uid = message.arg1;
+ final boolean disabled = message.arg2 != 0;
+ if (disabled) {
+ cancelJobsForUid(uid, "app uid idle");
+ }
+ synchronized (mLock) {
+ mDeviceIdleJobsController.setUidActiveLocked(uid, false);
+ }
+ break;
+ }
+
}
maybeRunPendingJobsLocked();
// Don't remove JOB_EXPIRED in case one came along while processing the queue.
@@ -2908,6 +2938,23 @@
synchronized (mLock) {
mConstants.dump(pw);
pw.println();
+
+ pw.println(" Heartbeat:");
+ pw.print(" Current: "); pw.println(mHeartbeat);
+ pw.println(" Next");
+ pw.print(" ACTIVE: "); pw.println(mNextBucketHeartbeat[0]);
+ pw.print(" WORKING: "); pw.println(mNextBucketHeartbeat[1]);
+ pw.print(" FREQUENT: "); pw.println(mNextBucketHeartbeat[2]);
+ pw.print(" RARE: "); pw.println(mNextBucketHeartbeat[3]);
+ pw.print(" Last heartbeat: ");
+ TimeUtils.formatDuration(mLastHeartbeatTime, nowElapsed, pw);
+ pw.println();
+ pw.print(" Next heartbeat: ");
+ TimeUtils.formatDuration(mLastHeartbeatTime + mConstants.STANDBY_HEARTBEAT_TIME,
+ nowElapsed, pw);
+ pw.println();
+ pw.println();
+
pw.println("Started users: " + Arrays.toString(mStartedUsers));
pw.print("Registered ");
pw.print(mJobs.size());
@@ -2925,6 +2972,10 @@
}
job.dump(pw, " ", true, nowElapsed);
+ pw.print(" Last run heartbeat: ");
+ pw.print(heartbeatWhenJobsLastRun(job));
+ pw.println();
+
pw.print(" Ready: ");
pw.print(isReadyToBeExecutedLocked(job));
pw.print(" (job=");
@@ -3067,6 +3118,16 @@
synchronized (mLock) {
mConstants.dump(proto, JobSchedulerServiceDumpProto.SETTINGS);
+ proto.write(JobSchedulerServiceDumpProto.CURRENT_HEARTBEAT, mHeartbeat);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[0]);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[1]);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[2]);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[3]);
+ proto.write(JobSchedulerServiceDumpProto.LAST_HEARTBEAT_TIME_MILLIS,
+ mLastHeartbeatTime - nowUptime);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT_TIME_MILLIS,
+ mLastHeartbeatTime + mConstants.STANDBY_HEARTBEAT_TIME - nowUptime);
+
for (int u : mStartedUsers) {
proto.write(JobSchedulerServiceDumpProto.STARTED_USERS, u);
}
@@ -3105,6 +3166,7 @@
}
proto.write(JobSchedulerServiceDumpProto.RegisteredJob.IS_COMPONENT_PRESENT,
componentPresent);
+ proto.write(RegisteredJob.LAST_RUN_HEARTBEAT, heartbeatWhenJobsLastRun(job));
proto.end(rjToken);
}
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index d1c40cc..9e00819 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -2074,8 +2074,8 @@
}
@Override
- public String generateKey(@NonNull String alias, byte[] account) throws RemoteException {
- return mRecoverableKeyStoreManager.generateKey(alias, account);
+ public String generateKey(@NonNull String alias) throws RemoteException {
+ return mRecoverableKeyStoreManager.generateKey(alias);
}
@Override
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
index a462cfc..22e99c4 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
@@ -556,7 +556,7 @@
*
* @return grant alias, which caller can use to access the key.
*/
- public String generateKey(@NonNull String alias, byte[] account) throws RemoteException {
+ public String generateKey(@NonNull String alias) throws RemoteException {
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
@@ -576,8 +576,7 @@
byte[] secretKey =
mRecoverableKeyGenerator.generateAndStoreKey(encryptionKey, userId, uid, alias);
mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, secretKey);
- String grantAlias = mApplicationKeyStorage.getGrantAlias(userId, uid, alias);
- return grantAlias;
+ return mApplicationKeyStorage.getGrantAlias(userId, uid, alias);
} catch (KeyStoreException | InvalidKeyException | RecoverableKeyStorageException e) {
throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
}
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index e9efd4e..40f772a 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -367,15 +367,14 @@
if (wtoken.isHidden()) {
wtoken.waitingToShow = true;
}
-
- if (wtoken.isClientHidden()) {
- // In the case where we are making an app visible but holding off for a
- // transition, we still need to tell the client to make its windows visible
- // so they get drawn. Otherwise, we will wait on performing the transition
- // until all windows have been drawn, they never will be, and we are sad.
- wtoken.setClientHidden(false);
- }
}
+
+ // In the case where we are making an app visible but holding off for a transition,
+ // we still need to tell the client to make its windows visible so they get drawn.
+ // Otherwise, we will wait on performing the transition until all windows have been
+ // drawn, they never will be, and we are sad.
+ wtoken.setClientHidden(false);
+
wtoken.requestUpdateWallpaperIfNeeded();
if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "No longer Stopped: " + wtoken);
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 42d6ec0..277a04b 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -367,6 +367,8 @@
if (mClientHidden == hideClient || (hideClient && mDeferHidingClient)) {
return;
}
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "setClientHidden: " + this
+ + " clientHidden=" + hideClient + " Callers=" + Debug.getCallers(5));
mClientHidden = hideClient;
sendAppVisibilityToClients();
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 29d5d54..0a6ff6d 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -10419,7 +10419,8 @@
public CharSequence getPrintingDisabledReasonForUser(@UserIdInt int userId) {
synchronized (DevicePolicyManagerService.this) {
DevicePolicyData policy = getUserData(userId);
- if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING)) {
+ if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING,
+ UserHandle.of(userId))) {
Log.e(LOG_TAG, "printing is enabled");
return null;
}
diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java
index e8620ed..83a125d 100644
--- a/services/print/java/com/android/server/print/PrintManagerService.java
+++ b/services/print/java/com/android/server/print/PrintManagerService.java
@@ -718,7 +718,8 @@
}
private boolean isPrintingEnabled() {
- return !mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING);
+ return !mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING,
+ Binder.getCallingUserHandle());
}
private void dump(@NonNull DualDumpOutputStream dumpStream,
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
index 60704e7..8372778 100644
--- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
@@ -48,7 +48,6 @@
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupManager;
import android.app.backup.BackupTransport;
-import android.app.backup.FullBackupDataOutput;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
@@ -76,11 +75,11 @@
import com.android.server.testing.FrameworkRobolectricTestRunner;
import com.android.server.testing.SystemLoaderClasses;
import com.android.server.testing.SystemLoaderPackages;
-import com.android.server.testing.shadows.FrameworkShadowPackageManager;
import com.android.server.testing.shadows.ShadowBackupDataInput;
import com.android.server.testing.shadows.ShadowBackupDataOutput;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
@@ -90,7 +89,6 @@
import org.mockito.stubbing.Answer;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowLooper;
import org.robolectric.shadows.ShadowPackageManager;
import org.robolectric.shadows.ShadowQueuedWork;
@@ -106,7 +104,6 @@
manifest = Config.NONE,
sdk = 26,
shadows = {
- FrameworkShadowPackageManager.class,
ShadowBackupDataInput.class,
ShadowBackupDataOutput.class,
ShadowQueuedWork.class
@@ -151,7 +148,7 @@
assertThat(dataDir.mkdir()).isTrue();
PackageManager packageManager = application.getPackageManager();
- mShadowPackageManager = Shadow.extract(packageManager);
+ mShadowPackageManager = shadowOf(packageManager);
mWakeLock = createBackupWakeLock(application);
@@ -493,8 +490,9 @@
}
// TODO: Giving NPE at PerformBackupTask:524 because mCurrentPackage is null (PackageManager
- // rightfully threw NameNotFoundException). Uncomment @Test when fixed.
- // @Test
+ // rightfully threw NameNotFoundException). Remove @Ignore when fixed.
+ @Ignore
+ @Test
public void testRunTask_whenAgentUnknown() throws Exception {
// Not calling setUpAgent()
TransportMock transportMock = setUpTransport(mTransport);
diff --git a/services/robotests/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/src/com/android/server/backup/TransportManagerTest.java
index 32697bd..02514b8 100644
--- a/services/robotests/src/com/android/server/backup/TransportManagerTest.java
+++ b/services/robotests/src/com/android/server/backup/TransportManagerTest.java
@@ -30,7 +30,7 @@
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.robolectric.shadow.api.Shadow.extract;
+import static org.robolectric.Shadows.shadowOf;
import static org.testng.Assert.expectThrows;
import static java.util.Arrays.asList;
@@ -58,7 +58,6 @@
import com.android.server.testing.FrameworkRobolectricTestRunner;
import com.android.server.testing.SystemLoaderPackages;
import com.android.server.testing.shadows.FrameworkShadowContextImpl;
-import com.android.server.testing.shadows.FrameworkShadowPackageManager;
import org.junit.Before;
import org.junit.Test;
@@ -79,7 +78,7 @@
@Config(
manifest = Config.NONE,
sdk = 26,
- shadows = {FrameworkShadowPackageManager.class, FrameworkShadowContextImpl.class}
+ shadows = {FrameworkShadowContextImpl.class}
)
@SystemLoaderPackages({"com.android.server.backup"})
@Presubmit
@@ -107,8 +106,7 @@
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
- mShadowPackageManager =
- (FrameworkShadowPackageManager) extract(mContext.getPackageManager());
+ mShadowPackageManager = shadowOf(mContext.getPackageManager());
mTransportA1 = genericTransport(PACKAGE_A, "TransportFoo");
mTransportA2 = genericTransport(PACKAGE_A, "TransportBar");
diff --git a/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java b/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java
deleted file mode 100644
index 5cdbe7f..0000000
--- a/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2017 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.server.testing.shadows;
-
-import android.app.ApplicationPackageManager;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import java.util.List;
-import org.robolectric.annotation.Implements;
-import org.robolectric.shadows.ShadowApplicationPackageManager;
-
-/** Extension of ShadowApplicationPackageManager */
-@Implements(value = ApplicationPackageManager.class, inheritImplementationMethods = true)
-public class FrameworkShadowPackageManager extends ShadowApplicationPackageManager {
- @Override
- public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
- return queryIntentServices(intent, flags);
- }
-}
diff --git a/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java b/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
index 796d364..2433f05 100644
--- a/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
@@ -70,6 +70,7 @@
import com.android.server.AppStateTracker.Listener;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -660,6 +661,8 @@
areRestrictedWithExemption(instance, UID_2, PACKAGE_2, NONE);
}
+ @Ignore("b/73792882")
+ @Test
public void loadPersistedAppOps() throws Exception {
final AppStateTrackerTestable instance = newInstance();
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
index 8b21059..bfc3133 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
@@ -53,6 +53,7 @@
import org.junit.runner.RunWith;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
@@ -111,7 +112,8 @@
}
// TODO: b/71582913
- //@Test
+ @Ignore("b/71582913")
+ @Test
public void testPausingWhenVisibleFromStopped() throws Exception {
final MutableBoolean pauseFound = new MutableBoolean(false);
doAnswer((InvocationOnMock invocationOnMock) -> {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 43ac58a..69b2c63 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -99,6 +99,7 @@
static final int MSG_REPORT_EVENT = 0;
static final int MSG_FLUSH_TO_DISK = 1;
static final int MSG_REMOVE_USER = 2;
+ static final int MSG_UID_STATE_CHANGED = 3;
private final Object mLock = new Object();
Handler mHandler;
@@ -220,18 +221,7 @@
private final IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
public void onUidStateChanged(int uid, int procState, long procStateSeq) {
- final int newCounter = (procState <= ActivityManager.PROCESS_STATE_TOP) ? 0 : 1;
- synchronized (mUidToKernelCounter) {
- final int oldCounter = mUidToKernelCounter.get(uid, 0);
- if (newCounter != oldCounter) {
- mUidToKernelCounter.put(uid, newCounter);
- try {
- FileUtils.stringToFile(KERNEL_COUNTER_FILE, uid + " " + newCounter);
- } catch (IOException e) {
- Slog.w(TAG, "Failed to update counter set: " + e);
- }
- }
- }
+ mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
}
@Override
@@ -561,6 +551,25 @@
onUserRemoved(msg.arg1);
break;
+ case MSG_UID_STATE_CHANGED: {
+ final int uid = msg.arg1;
+ final int procState = msg.arg2;
+
+ final int newCounter = (procState <= ActivityManager.PROCESS_STATE_TOP) ? 0 : 1;
+ synchronized (mUidToKernelCounter) {
+ final int oldCounter = mUidToKernelCounter.get(uid, 0);
+ if (newCounter != oldCounter) {
+ mUidToKernelCounter.put(uid, newCounter);
+ try {
+ FileUtils.stringToFile(KERNEL_COUNTER_FILE, uid + " " + newCounter);
+ } catch (IOException e) {
+ Slog.w(TAG, "Failed to update counter set: " + e);
+ }
+ }
+ }
+ break;
+ }
+
default:
super.handleMessage(msg);
break;
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index a7fc470..ef0780a 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -1359,9 +1359,7 @@
UsbManager.USB_FUNCTION_NONE).equals(
getSystemProperty(USB_STATE_PROPERTY, UsbManager.USB_FUNCTION_NONE));
}
- // Mask out adb, since it is stored in mAdbEnabled
- mCurrentFunctions = UsbManager.usbFunctionsFromString(mCurrentFunctionsStr)
- & ~UsbManager.FUNCTION_ADB;
+ mCurrentFunctions = UsbManager.FUNCTION_NONE;
mCurrentUsbFunctionsReceived = true;
String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 0c92c20..a79f2c9 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -422,6 +422,7 @@
/**
* Indicates the call used Assisted Dialing.
* See also {@link Connection#PROPERTY_ASSISTED_DIALING_USED}
+ * @hide
*/
public static final int PROPERTY_ASSISTED_DIALING_USED = 0x00000200;
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 26a2f1c..36333e4 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -35,7 +35,6 @@
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
-import android.os.Parcelable;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.ArraySet;
@@ -407,6 +406,7 @@
/**
* Set by the framework to indicate that a connection is using assisted dialing.
+ * @hide
*/
public static final int PROPERTY_ASSISTED_DIALING_USED = 1 << 9;
@@ -2553,19 +2553,6 @@
}
/**
- * Adds a parcelable extra to this {@code Connection}.
- *
- * @param key The extra key.
- * @param value The value.
- * @hide
- */
- public final void putExtra(@NonNull String key, @NonNull Parcelable value) {
- Bundle newExtras = new Bundle();
- newExtras.putParcelable(key, value);
- putExtras(newExtras);
- }
-
- /**
* Removes extras from this {@code Connection}.
*
* @param keys The keys of the extras to remove.
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index a180da6..e456830 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -111,12 +111,6 @@
"android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS";
/**
- * The {@link android.content.Intent} action used to show the assisted dialing settings.
- */
- public static final String ACTION_SHOW_ASSISTED_DIALING_SETTINGS =
- "android.telecom.action.SHOW_ASSISTED_DIALING_SETTINGS";
-
- /**
* The {@link android.content.Intent} action used to show the settings page used to configure
* {@link PhoneAccount} preferences.
*/
@@ -619,17 +613,12 @@
/**
* The boolean indicated by this extra controls whether or not a call is eligible to undergo
* assisted dialing. This extra is stored under {@link #EXTRA_OUTGOING_CALL_EXTRAS}.
+ * @hide
*/
public static final String EXTRA_USE_ASSISTED_DIALING =
"android.telecom.extra.USE_ASSISTED_DIALING";
/**
- * The bundle indicated by this extra store information related to the assisted dialing action.
- */
- public static final String EXTRA_ASSISTED_DIALING_TRANSFORMATION_INFO =
- "android.telecom.extra.ASSISTED_DIALING_TRANSFORMATION_INFO";
-
- /**
* The following 4 constants define how properties such as phone numbers and names are
* displayed to the user.
*/
diff --git a/telecomm/java/android/telecom/TransformationInfo.java b/telecomm/java/android/telecom/TransformationInfo.java
deleted file mode 100755
index 3e848c6..0000000
--- a/telecomm/java/android/telecom/TransformationInfo.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.telecom;
-
-import android.os.Parcelable;
-import android.os.Parcel;
-
-/**
- * A container class to hold information related to the Assisted Dialing operation. All member
- * variables must be set when constructing a new instance of this class.
- */
-public final class TransformationInfo implements Parcelable {
- private String mOriginalNumber;
- private String mTransformedNumber;
- private String mUserHomeCountryCode;
- private String mUserRoamingCountryCode;
- private int mTransformedNumberCountryCallingCode;
-
- public TransformationInfo(String originalNumber,
- String transformedNumber,
- String userHomeCountryCode,
- String userRoamingCountryCode,
- int transformedNumberCountryCallingCode) {
- String missing = "";
- if (originalNumber == null) {
- missing += " mOriginalNumber";
- }
- if (transformedNumber == null) {
- missing += " mTransformedNumber";
- }
- if (userHomeCountryCode == null) {
- missing += " mUserHomeCountryCode";
- }
- if (userRoamingCountryCode == null) {
- missing += " mUserRoamingCountryCode";
- }
-
- if (!missing.isEmpty()) {
- throw new IllegalStateException("Missing required properties:" + missing);
- }
- this.mOriginalNumber = originalNumber;
- this.mTransformedNumber = transformedNumber;
- this.mUserHomeCountryCode = userHomeCountryCode;
- this.mUserRoamingCountryCode = userRoamingCountryCode;
- this.mTransformedNumberCountryCallingCode = transformedNumberCountryCallingCode;
- }
-
- public int describeContents() {
- return 0;
- }
-
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(mOriginalNumber);
- out.writeString(mTransformedNumber);
- out.writeString(mUserHomeCountryCode);
- out.writeString(mUserRoamingCountryCode);
- out.writeInt(mTransformedNumberCountryCallingCode);
- }
-
- public static final Parcelable.Creator<TransformationInfo> CREATOR
- = new Parcelable.Creator<TransformationInfo>() {
- public TransformationInfo createFromParcel(Parcel in) {
- return new TransformationInfo(in);
- }
-
- public TransformationInfo[] newArray(int size) {
- return new TransformationInfo[size];
- }
- };
-
- private TransformationInfo(Parcel in) {
- mOriginalNumber = in.readString();
- mTransformedNumber = in.readString();
- mUserHomeCountryCode = in.readString();
- mUserRoamingCountryCode = in.readString();
- mTransformedNumberCountryCallingCode = in.readInt();
- }
-
- /**
- * The original number that underwent Assisted Dialing.
- */
- public String getOriginalNumber() {
- return mOriginalNumber;
- }
-
- /**
- * The number after it underwent Assisted Dialing.
- */
- public String getTransformedNumber() {
- return mTransformedNumber;
- }
-
- /**
- * The user's home country code that was used when attempting to transform the number.
- */
- public String getUserHomeCountryCode() {
- return mUserHomeCountryCode;
- }
-
- /**
- * The users's roaming country code that was used when attempting to transform the number.
- */
- public String getUserRoamingCountryCode() {
- return mUserRoamingCountryCode;
- }
-
- /**
- * The country calling code that was used in the transformation.
- */
- public int getTransformedNumberCountryCallingCode() {
- return mTransformedNumberCountryCallingCode;
- }
-}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 2d3d49c..6798a83 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1704,13 +1704,6 @@
"roaming_operator_string_array";
/**
- * Controls whether Assisted Dialing is enabled and the preference is shown. This feature
- * transforms numbers when the user is roaming.
- */
- public static final String KEY_ASSISTED_DIALING_ENABLED_BOOL =
- "assisted_dialing_enabled_bool";
-
- /**
* URL from which the proto containing the public key of the Carrier used for
* IMSI encryption will be downloaded.
* @hide
@@ -2131,7 +2124,6 @@
false);
sDefaults.putStringArray(KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, null);
sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null);
- sDefaults.putBoolean(KEY_ASSISTED_DIALING_ENABLED_BOOL, true);
sDefaults.putBoolean(KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, false);
sDefaults.putBoolean(KEY_RTT_SUPPORTED_BOOL, false);
sDefaults.putBoolean(KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
diff --git a/tests/CoreTests/android/Android.mk b/tests/CoreTests/android/Android.mk
index 56d7918..04f6739 100644
--- a/tests/CoreTests/android/Android.mk
+++ b/tests/CoreTests/android/Android.mk
@@ -7,14 +7,14 @@
$(call all-subdir-java-files)
LOCAL_JAVA_LIBRARIES := \
- android.test.runner \
- bouncycastle \
- conscrypt \
+ android.test.runner.stubs \
org.apache.http.legacy \
- android.test.base \
+ android.test.base.stubs \
+
+LOCAL_SDK_VERSION := current
LOCAL_STATIC_JAVA_LIBRARIES := junit
-LOCAL_PACKAGE_NAME := CoreTests
+LOCAL_PACKAGE_NAME := LegacyCoreTests
include $(BUILD_PACKAGE)
diff --git a/tests/CoreTests/android/core/JniLibTest.java b/tests/CoreTests/android/core/JniLibTest.java
deleted file mode 100644
index d476072..0000000
--- a/tests/CoreTests/android/core/JniLibTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.core;
-
-import android.test.suitebuilder.annotation.Suppress;
-import android.util.Log;
-import junit.framework.TestCase;
-
-
-@Suppress
-public class JniLibTest extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- /*
- * This causes the native shared library to be loaded when the
- * class is first used. The library is only loaded once, even if
- * multiple classes include this line.
- *
- * The library must be in java.library.path, which is derived from
- * LD_LIBRARY_PATH. The actual library name searched for will be
- * "libjni_lib_test.so" under Linux, but may be different on other
- * platforms.
- */
- try {
- System.loadLibrary("jni_lib_test");
- } catch (UnsatisfiedLinkError ule) {
- Log.e("JniLibTest", "WARNING: Could not load jni_lib_test natives");
- }
- }
-
- private static native int nativeStaticThing(float f);
- private native void nativeThing(int val);
-
- public void testNativeCall() {
- Log.i("JniLibTest", "JNI search path is "
- + System.getProperty("java.library.path"));
- Log.i("JniLibTest", "'jni_lib_test' becomes '"
- + System.mapLibraryName("jni_lib_test") + "'");
-
- int result = nativeStaticThing(1234.5f);
- nativeThing(result);
- }
-}
diff --git a/tests/CoreTests/android/core/MiscRegressionTest.java b/tests/CoreTests/android/core/MiscRegressionTest.java
deleted file mode 100644
index 32995b5..0000000
--- a/tests/CoreTests/android/core/MiscRegressionTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.core;
-
-import android.test.suitebuilder.annotation.MediumTest;
-import java.util.logging.Logger;
-import junit.framework.TestCase;
-
-public class MiscRegressionTest extends TestCase {
-
- // Regression test for #951285: Suitable LogHandler should be chosen
- // depending on the environment.
- @MediumTest
- public void testAndroidLogHandler() throws Exception {
- Logger.global.severe("This has logging Level.SEVERE, should become ERROR");
- Logger.global.warning("This has logging Level.WARNING, should become WARN");
- Logger.global.info("This has logging Level.INFO, should become INFO");
- Logger.global.config("This has logging Level.CONFIG, should become DEBUG");
- Logger.global.fine("This has logging Level.FINE, should become VERBOSE");
- Logger.global.finer("This has logging Level.FINER, should become VERBOSE");
- Logger.global.finest("This has logging Level.FINEST, should become VERBOSE");
- }
-}
diff --git a/tests/CoreTests/android/core/RequestAPITest.java b/tests/CoreTests/android/core/RequestAPITest.java
index 94eb23e..206f228 100644
--- a/tests/CoreTests/android/core/RequestAPITest.java
+++ b/tests/CoreTests/android/core/RequestAPITest.java
@@ -22,7 +22,6 @@
import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
import android.webkit.CookieSyncManager;
-import com.google.android.collect.Maps;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
@@ -87,7 +86,7 @@
* header is attempted to be set
*/
Log.d(LOGTAG, "testRequestAddNullHeader start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put(null, null);
verifyFailure(headers);
Log.d(LOGTAG, "testRequestAddNullHeader - returning");
@@ -99,7 +98,7 @@
* value is attempted to be set
*/
Log.d(LOGTAG, "testRequestAddNullValue start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", null);
verifyFailure(headers);
Log.d(LOGTAG, "testRequestAddNullValue - returning");
@@ -111,7 +110,7 @@
* header is attempted to be set
*/
Log.d(LOGTAG, "testRequestAddEmptyValue start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", "");
verifyFailure(headers);
Log.d(LOGTAG, "testRequestAddEmptyValue - returning");
@@ -131,7 +130,7 @@
* generating and exception
*/
Log.d(LOGTAG, "testRequestAddHeader start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", "RequestAddHeader");
verifySuccess(headers);
Log.d(LOGTAG, "testRequestAddHeader - returning");
@@ -143,7 +142,7 @@
* can be set without generating and exception
*/
Log.d(LOGTAG, "testRequestAddMultiHeader start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", "RequestAddMultiHeader");
headers.put("TestHeader2", "RequestAddMultiHeader");
headers.put("TestHeader3", "RequestAddMultiHeader");
@@ -157,7 +156,7 @@
* and values can be set without generating and exception
*/
Log.d(LOGTAG, "testRequestAddSameHeader start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", "RequestAddSameHeader");
headers.put("TestHeader", "RequestAddSameHeader");
headers.put("TestHeader", "RequestAddSameHeader");
diff --git a/tests/CoreTests/android/core/Sha1Test.java b/tests/CoreTests/android/core/Sha1Test.java
deleted file mode 100644
index 8ed1205..0000000
--- a/tests/CoreTests/android/core/Sha1Test.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.core;
-
-import android.test.suitebuilder.annotation.SmallTest;
-import java.security.MessageDigest;
-import junit.framework.TestCase;
-
-/**
- * Tests SHA1 message digest algorithm.
- */
-public class Sha1Test extends TestCase {
- class TestData {
- private String input;
- private String result;
-
- public TestData(String i, String r) {
- input = i;
- result = r;
- }
- }
-
- TestData[] mTestData = new TestData[]{
- new TestData("abc", "a9993e364706816aba3e25717850c26c9cd0d89d"),
- new TestData("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- "84983e441c3bd26ebaae4aa1f95129e5e54670f1")
- };
-
- @SmallTest
- public void testSha1() throws Exception {
- MessageDigest digest = MessageDigest.getInstance("SHA-1");
-
- int numTests = mTestData.length;
- for (int i = 0; i < numTests; i++) {
- digest.update(mTestData[i].input.getBytes());
- byte[] hash = digest.digest();
- String encodedHash = encodeHex(hash);
- assertEquals(encodedHash, mTestData[i].result);
- }
- }
-
- private static String encodeHex(byte[] bytes) {
- StringBuffer hex = new StringBuffer(bytes.length * 2);
-
- for (int i = 0; i < bytes.length; i++) {
- if (((int) bytes[i] & 0xff) < 0x10) {
- hex.append("0");
- }
- hex.append(Integer.toString((int) bytes[i] & 0xff, 16));
- }
-
- return hex.toString();
- }
-}
-