Merge "Type-to-focus improvements." into nyc-dev
diff --git a/api/system-current.txt b/api/system-current.txt
index 87990e3..de251b0 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -9706,25 +9706,6 @@
field public int reqTouchScreen;
}
- public deprecated class ContainerEncryptionParams implements android.os.Parcelable {
- ctor public ContainerEncryptionParams(java.lang.String, java.security.spec.AlgorithmParameterSpec, javax.crypto.SecretKey) throws java.security.InvalidAlgorithmParameterException;
- ctor public ContainerEncryptionParams(java.lang.String, java.security.spec.AlgorithmParameterSpec, javax.crypto.SecretKey, java.lang.String, java.security.spec.AlgorithmParameterSpec, javax.crypto.SecretKey, byte[], long, long, long) throws java.security.InvalidAlgorithmParameterException;
- method public int describeContents();
- method public long getAuthenticatedDataStart();
- method public long getDataEnd();
- method public long getEncryptedDataStart();
- method public java.lang.String getEncryptionAlgorithm();
- method public javax.crypto.SecretKey getEncryptionKey();
- method public java.security.spec.AlgorithmParameterSpec getEncryptionSpec();
- method public java.lang.String getMacAlgorithm();
- method public javax.crypto.SecretKey getMacKey();
- method public java.security.spec.AlgorithmParameterSpec getMacSpec();
- method public byte[] getMacTag();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.content.pm.ContainerEncryptionParams> CREATOR;
- field protected static final java.lang.String TAG = "ContainerEncryptionParams";
- }
-
public final class EphemeralResolveInfo implements android.os.Parcelable {
ctor public EphemeralResolveInfo(android.net.Uri, java.lang.String, java.util.List<android.content.IntentFilter>);
method public int describeContents();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 02b94de..1aa4321 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4945,7 +4945,11 @@
* This is what ultimately throws {@link FileUriExposedException}.
*/
if (data.appInfo.targetSdkVersion >= Build.VERSION_CODES.N) {
- StrictMode.enableDeathOnFileUriExposure();
+ if ("com.android.qxdmlogger".equals(data.appInfo.packageName)) {
+ // STOPSHIP: Fix security on this logger tool
+ } else {
+ StrictMode.enableDeathOnFileUriExposure();
+ }
}
NetworkSecurityPolicy.getInstance().setCleartextTrafficPermitted(
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 91eabcc..1bd70b8 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -30,7 +30,6 @@
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
-import android.content.pm.ContainerEncryptionParams;
import android.content.pm.EphemeralApplicationInfo;
import android.content.pm.FeatureInfo;
import android.content.pm.IOnPermissionsChangeListener;
@@ -54,7 +53,6 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
-import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
@@ -1470,80 +1468,27 @@
@Override
public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
String installerPackageName) {
- final VerificationParams verificationParams = new VerificationParams(null, null,
- null, VerificationParams.NO_UID);
installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
- installerPackageName, verificationParams, null, mContext.getUserId());
- }
-
- @Override
- public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer,
- int flags, String installerPackageName, Uri verificationURI,
- ContainerEncryptionParams encryptionParams) {
- final VerificationParams verificationParams = new VerificationParams(verificationURI, null,
- null, VerificationParams.NO_UID);
- installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
- installerPackageName, verificationParams, encryptionParams, mContext.getUserId());
- }
-
- @Override
- public void installPackageWithVerificationAndEncryption(Uri packageURI,
- IPackageInstallObserver observer, int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
- installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
- installerPackageName, verificationParams, encryptionParams, mContext.getUserId());
+ installerPackageName, mContext.getUserId());
}
@Override
public void installPackage(Uri packageURI, PackageInstallObserver observer,
int flags, String installerPackageName) {
- installPackageAsUser(packageURI, observer, flags, installerPackageName,
- mContext.getUserId());
- }
-
- @Override
- public void installPackageAsUser(Uri packageURI, PackageInstallObserver observer, int flags,
- String installerPackageName, int userId) {
- final VerificationParams verificationParams = new VerificationParams(null, null,
- null, VerificationParams.NO_UID);
- installCommon(packageURI, observer, flags, installerPackageName, verificationParams, null,
- userId);
- }
-
- @Override
- public void installPackageWithVerification(Uri packageURI,
- PackageInstallObserver observer, int flags, String installerPackageName,
- Uri verificationURI,
- ContainerEncryptionParams encryptionParams) {
- final VerificationParams verificationParams = new VerificationParams(verificationURI, null,
- null, VerificationParams.NO_UID);
- installCommon(packageURI, observer, flags, installerPackageName, verificationParams,
- encryptionParams, mContext.getUserId());
- }
-
- @Override
- public void installPackageWithVerificationAndEncryption(Uri packageURI,
- PackageInstallObserver observer, int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
- installCommon(packageURI, observer, flags, installerPackageName, verificationParams,
- encryptionParams, mContext.getUserId());
+ installCommon(packageURI, observer, flags, installerPackageName, mContext.getUserId());
}
private void installCommon(Uri packageURI,
PackageInstallObserver observer, int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams,
int userId) {
if (!"file".equals(packageURI.getScheme())) {
throw new UnsupportedOperationException("Only file:// URIs are supported");
}
- if (encryptionParams != null) {
- throw new UnsupportedOperationException("ContainerEncryptionParams not supported");
- }
final String originPath = packageURI.getPath();
try {
mPM.installPackageAsUser(originPath, observer.getBinder(), flags, installerPackageName,
- verificationParams, null, userId);
+ userId);
} catch (RemoteException ignored) {
}
}
diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java
index 2268400..7fcca09 100644
--- a/core/java/android/app/backup/BackupManager.java
+++ b/core/java/android/app/backup/BackupManager.java
@@ -468,7 +468,7 @@
*
* @param packages List of package names to backup.
* @param observer The {@link BackupObserver} to receive callbacks during the backup
- * operation.
+ * operation. Could be {@code null}.
* @return {@link BackupManager#SUCCESS} on success; nonzero on error.
* @exception IllegalArgumentException on null or empty {@code packages} param.
*
@@ -479,8 +479,9 @@
checkServiceBinder();
if (sService != null) {
try {
- BackupObserverWrapper observerWrapper =
- new BackupObserverWrapper(mContext, observer);
+ BackupObserverWrapper observerWrapper = observer == null
+ ? null
+ : new BackupObserverWrapper(mContext, observer);
return sService.requestBackup(packages, observerWrapper);
} catch (RemoteException e) {
Log.e(TAG, "requestBackup() couldn't connect");
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index a9328bc..342c285 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -33,4 +33,5 @@
void setAppInactive(String packageName, boolean inactive, int userId);
boolean isAppInactive(String packageName, int userId);
void whitelistAppTemporarily(String packageName, long duration, int userId);
+ void onCarrierPrivilegedAppsChanged();
}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index c74b0f2..2aeecfa 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -267,4 +267,15 @@
} catch (RemoteException re) {
}
}
+
+ /**
+ * Inform usage stats that the carrier privileged apps access rules have changed.
+ * @hide
+ */
+ public void onCarrierPrivilegedAppsChanged() {
+ try {
+ mService.onCarrierPrivilegedAppsChanged();
+ } catch (RemoteException re) {
+ }
+ }
}
diff --git a/core/java/android/content/pm/ContainerEncryptionParams.java b/core/java/android/content/pm/ContainerEncryptionParams.java
deleted file mode 100644
index ab3aa27..0000000
--- a/core/java/android/content/pm/ContainerEncryptionParams.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.pm;
-
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Slog;
-
-import java.security.InvalidAlgorithmParameterException;
-import java.security.spec.AlgorithmParameterSpec;
-import java.util.Arrays;
-
-import javax.crypto.SecretKey;
-import javax.crypto.spec.IvParameterSpec;
-
-/**
- * Represents encryption parameters used to read a container.
- *
- * @deprecated encrypted containers are legacy.
- * @hide
- */
-@SystemApi
-@Deprecated
-public class ContainerEncryptionParams implements Parcelable {
- protected static final String TAG = "ContainerEncryptionParams";
-
- /** What we print out first when toString() is called. */
- private static final String TO_STRING_PREFIX = "ContainerEncryptionParams{";
-
- /**
- * Parameter type for parceling that indicates the next parameters are
- * IvParameters.
- */
- private static final int ENC_PARAMS_IV_PARAMETERS = 1;
-
- /** Parameter type for paceling that indicates there are no MAC parameters. */
- private static final int MAC_PARAMS_NONE = 1;
-
- /** The encryption algorithm used. */
- private final String mEncryptionAlgorithm;
-
- /** The parameter spec to be used for encryption. */
- private final IvParameterSpec mEncryptionSpec;
-
- /** Secret key to be used for decryption. */
- private final SecretKey mEncryptionKey;
-
- /** Algorithm name for the MAC to be used. */
- private final String mMacAlgorithm;
-
- /** The parameter spec to be used for the MAC tag authentication. */
- private final AlgorithmParameterSpec mMacSpec;
-
- /** Secret key to be used for MAC tag authentication. */
- private final SecretKey mMacKey;
-
- /** MAC tag authenticating the data in the container. */
- private final byte[] mMacTag;
-
- /** Offset into file where authenticated (e.g., MAC protected) data begins. */
- private final long mAuthenticatedDataStart;
-
- /** Offset into file where encrypted data begins. */
- private final long mEncryptedDataStart;
-
- /**
- * Offset into file for the end of encrypted data (and, by extension,
- * authenticated data) in file.
- */
- private final long mDataEnd;
-
- public ContainerEncryptionParams(String encryptionAlgorithm,
- AlgorithmParameterSpec encryptionSpec, SecretKey encryptionKey)
- throws InvalidAlgorithmParameterException {
- this(encryptionAlgorithm, encryptionSpec, encryptionKey, null, null, null, null, -1, -1,
- -1);
- }
-
- /**
- * Creates container encryption specifications for installing from encrypted
- * containers.
- *
- * @param encryptionAlgorithm encryption algorithm to use; format matches
- * JCE
- * @param encryptionSpec algorithm parameter specification
- * @param encryptionKey key used for decryption
- * @param macAlgorithm MAC algorithm to use; format matches JCE
- * @param macSpec algorithm parameters specification, may be {@code null}
- * @param macKey key used for authentication (i.e., for the MAC tag)
- * @param macTag message authentication code (MAC) tag for the authenticated
- * data
- * @param authenticatedDataStart offset of start of authenticated data in
- * stream
- * @param encryptedDataStart offset of start of encrypted data in stream
- * @param dataEnd offset of the end of both the authenticated and encrypted
- * data
- * @throws InvalidAlgorithmParameterException
- */
- public ContainerEncryptionParams(String encryptionAlgorithm,
- AlgorithmParameterSpec encryptionSpec, SecretKey encryptionKey, String macAlgorithm,
- AlgorithmParameterSpec macSpec, SecretKey macKey, byte[] macTag,
- long authenticatedDataStart, long encryptedDataStart, long dataEnd)
- throws InvalidAlgorithmParameterException {
- if (TextUtils.isEmpty(encryptionAlgorithm)) {
- throw new NullPointerException("algorithm == null");
- } else if (encryptionSpec == null) {
- throw new NullPointerException("encryptionSpec == null");
- } else if (encryptionKey == null) {
- throw new NullPointerException("encryptionKey == null");
- }
-
- if (!TextUtils.isEmpty(macAlgorithm)) {
- if (macKey == null) {
- throw new NullPointerException("macKey == null");
- }
- }
-
- if (!(encryptionSpec instanceof IvParameterSpec)) {
- throw new InvalidAlgorithmParameterException(
- "Unknown parameter spec class; must be IvParameters");
- }
-
- mEncryptionAlgorithm = encryptionAlgorithm;
- mEncryptionSpec = (IvParameterSpec) encryptionSpec;
- mEncryptionKey = encryptionKey;
-
- mMacAlgorithm = macAlgorithm;
- mMacSpec = macSpec;
- mMacKey = macKey;
- mMacTag = macTag;
-
- mAuthenticatedDataStart = authenticatedDataStart;
- mEncryptedDataStart = encryptedDataStart;
- mDataEnd = dataEnd;
- }
-
- public String getEncryptionAlgorithm() {
- return mEncryptionAlgorithm;
- }
-
- public AlgorithmParameterSpec getEncryptionSpec() {
- return mEncryptionSpec;
- }
-
- public SecretKey getEncryptionKey() {
- return mEncryptionKey;
- }
-
- public String getMacAlgorithm() {
- return mMacAlgorithm;
- }
-
- public AlgorithmParameterSpec getMacSpec() {
- return mMacSpec;
- }
-
- public SecretKey getMacKey() {
- return mMacKey;
- }
-
- public byte[] getMacTag() {
- return mMacTag;
- }
-
- public long getAuthenticatedDataStart() {
- return mAuthenticatedDataStart;
- }
-
- public long getEncryptedDataStart() {
- return mEncryptedDataStart;
- }
-
- public long getDataEnd() {
- return mDataEnd;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
-
- if (!(o instanceof ContainerEncryptionParams)) {
- return false;
- }
-
- final ContainerEncryptionParams other = (ContainerEncryptionParams) o;
-
- // Primitive comparison
- if ((mAuthenticatedDataStart != other.mAuthenticatedDataStart)
- || (mEncryptedDataStart != other.mEncryptedDataStart)
- || (mDataEnd != other.mDataEnd)) {
- return false;
- }
-
- // String comparison
- if (!mEncryptionAlgorithm.equals(other.mEncryptionAlgorithm)
- || !mMacAlgorithm.equals(other.mMacAlgorithm)) {
- return false;
- }
-
- // Object comparison
- if (!isSecretKeyEqual(mEncryptionKey, other.mEncryptionKey)
- || !isSecretKeyEqual(mMacKey, other.mMacKey)) {
- return false;
- }
-
- if (!Arrays.equals(mEncryptionSpec.getIV(), other.mEncryptionSpec.getIV())
- || !Arrays.equals(mMacTag, other.mMacTag) || (mMacSpec != other.mMacSpec)) {
- return false;
- }
-
- return true;
- }
-
- private static final boolean isSecretKeyEqual(SecretKey key1, SecretKey key2) {
- final String keyFormat = key1.getFormat();
- final String otherKeyFormat = key2.getFormat();
-
- if (keyFormat == null) {
- if (keyFormat != otherKeyFormat) {
- return false;
- }
-
- if (key1.getEncoded() != key2.getEncoded()) {
- return false;
- }
- } else {
- if (!keyFormat.equals(key2.getFormat())) {
- return false;
- }
-
- if (!Arrays.equals(key1.getEncoded(), key2.getEncoded())) {
- return false;
- }
- }
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int hash = 3;
-
- hash += 5 * mEncryptionAlgorithm.hashCode();
- hash += 7 * Arrays.hashCode(mEncryptionSpec.getIV());
- hash += 11 * mEncryptionKey.hashCode();
- hash += 13 * mMacAlgorithm.hashCode();
- hash += 17 * mMacKey.hashCode();
- hash += 19 * Arrays.hashCode(mMacTag);
- hash += 23 * mAuthenticatedDataStart;
- hash += 29 * mEncryptedDataStart;
- hash += 31 * mDataEnd;
-
- return hash;
- }
-
- @Override
- public String toString() {
- final StringBuilder sb = new StringBuilder(TO_STRING_PREFIX);
-
- sb.append("mEncryptionAlgorithm=\"");
- sb.append(mEncryptionAlgorithm);
- sb.append("\",");
- sb.append("mEncryptionSpec=");
- sb.append(mEncryptionSpec.toString());
- sb.append("mEncryptionKey=");
- sb.append(mEncryptionKey.toString());
-
- sb.append("mMacAlgorithm=\"");
- sb.append(mMacAlgorithm);
- sb.append("\",");
- sb.append("mMacSpec=");
- sb.append(mMacSpec.toString());
- sb.append("mMacKey=");
- sb.append(mMacKey.toString());
-
- sb.append(",mAuthenticatedDataStart=");
- sb.append(mAuthenticatedDataStart);
- sb.append(",mEncryptedDataStart=");
- sb.append(mEncryptedDataStart);
- sb.append(",mDataEnd=");
- sb.append(mDataEnd);
- sb.append('}');
-
- return sb.toString();
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mEncryptionAlgorithm);
- dest.writeInt(ENC_PARAMS_IV_PARAMETERS);
- dest.writeByteArray(mEncryptionSpec.getIV());
- dest.writeSerializable(mEncryptionKey);
-
- dest.writeString(mMacAlgorithm);
- dest.writeInt(MAC_PARAMS_NONE);
- dest.writeByteArray(new byte[0]);
- dest.writeSerializable(mMacKey);
-
- dest.writeByteArray(mMacTag);
-
- dest.writeLong(mAuthenticatedDataStart);
- dest.writeLong(mEncryptedDataStart);
- dest.writeLong(mDataEnd);
- }
-
- private ContainerEncryptionParams(Parcel source) throws InvalidAlgorithmParameterException {
- mEncryptionAlgorithm = source.readString();
- final int encParamType = source.readInt();
- final byte[] encParamsEncoded = source.createByteArray();
- mEncryptionKey = (SecretKey) source.readSerializable();
-
- mMacAlgorithm = source.readString();
- final int macParamType = source.readInt();
- source.createByteArray(); // byte[] macParamsEncoded
- mMacKey = (SecretKey) source.readSerializable();
-
- mMacTag = source.createByteArray();
-
- mAuthenticatedDataStart = source.readLong();
- mEncryptedDataStart = source.readLong();
- mDataEnd = source.readLong();
-
- switch (encParamType) {
- case ENC_PARAMS_IV_PARAMETERS:
- mEncryptionSpec = new IvParameterSpec(encParamsEncoded);
- break;
- default:
- throw new InvalidAlgorithmParameterException("Unknown parameter type "
- + encParamType);
- }
-
- switch (macParamType) {
- case MAC_PARAMS_NONE:
- mMacSpec = null;
- break;
- default:
- throw new InvalidAlgorithmParameterException("Unknown parameter type "
- + macParamType);
- }
-
- if (mEncryptionKey == null) {
- throw new NullPointerException("encryptionKey == null");
- }
- }
-
- public static final Parcelable.Creator<ContainerEncryptionParams> CREATOR =
- new Parcelable.Creator<ContainerEncryptionParams>() {
- public ContainerEncryptionParams createFromParcel(Parcel source) {
- try {
- return new ContainerEncryptionParams(source);
- } catch (InvalidAlgorithmParameterException e) {
- Slog.e(TAG, "Invalid algorithm parameters specified", e);
- return null;
- }
- }
-
- public ContainerEncryptionParams[] newArray(int size) {
- return new ContainerEncryptionParams[size];
- }
- };
-}
\ No newline at end of file
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index d6b674c..9959f27 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -46,7 +46,6 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
-import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
import android.graphics.Bitmap;
import android.net.Uri;
@@ -214,19 +213,11 @@
List<InstrumentationInfo> queryInstrumentation(
String targetPackage, int flags);
- void installPackage(in String originPath,
- in IPackageInstallObserver2 observer,
- int flags,
- in String installerPackageName,
- in VerificationParams verificationParams,
- in String packageAbiOverride);
-
+ /** @deprecated Use PackageInstaller instead */
void installPackageAsUser(in String originPath,
in IPackageInstallObserver2 observer,
int flags,
in String installerPackageName,
- in VerificationParams verificationParams,
- in String packageAbiOverride,
int userId);
void finishPackageInstall(int token);
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index b7f968c..588a89d 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -4597,60 +4597,20 @@
*/
@Deprecated
public abstract void installPackage(
- Uri packageURI, IPackageInstallObserver observer, @InstallFlags int flags,
+ Uri packageURI,
+ IPackageInstallObserver observer,
+ @InstallFlags int flags,
String installerPackageName);
-
/**
* @deprecated replaced by {@link PackageInstaller}
* @hide
*/
@Deprecated
- public abstract void installPackageWithVerification(Uri packageURI,
- IPackageInstallObserver observer, @InstallFlags int flags, String installerPackageName,
- Uri verificationURI, ContainerEncryptionParams encryptionParams);
-
- /**
- * @deprecated replaced by {@link PackageInstaller}
- * @hide
- */
- @Deprecated
- public abstract void installPackageWithVerificationAndEncryption(Uri packageURI,
- IPackageInstallObserver observer, @InstallFlags int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams);
-
- /**
- * @deprecated replaced by {@link PackageInstaller}
- * @hide
- */
- @Deprecated
- public abstract void installPackage(Uri packageURI, PackageInstallObserver observer,
- @InstallFlags int flags, String installerPackageName);
-
- /**
- * @deprecated replaced by {@link PackageInstaller}
- * @hide
- */
- @Deprecated
- public abstract void installPackageAsUser(Uri packageURI, PackageInstallObserver observer,
- @InstallFlags int flags, String installerPackageName, @UserIdInt int userId);
-
- /**
- * @deprecated replaced by {@link PackageInstaller}
- * @hide
- */
- @Deprecated
- public abstract void installPackageWithVerification(Uri packageURI,
- PackageInstallObserver observer, @InstallFlags int flags, String installerPackageName,
- Uri verificationURI, ContainerEncryptionParams encryptionParams);
-
- /**
- * @deprecated replaced by {@link PackageInstaller}
- * @hide
- */
- @Deprecated
- public abstract void installPackageWithVerificationAndEncryption(Uri packageURI,
- PackageInstallObserver observer, @InstallFlags int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams);
+ public abstract void installPackage(
+ Uri packageURI,
+ PackageInstallObserver observer,
+ @InstallFlags int flags,
+ String installerPackageName);
/**
* If there is already an application with the given package name installed
diff --git a/core/java/android/content/pm/VerificationParams.aidl b/core/java/android/content/pm/VerificationParams.aidl
deleted file mode 100644
index 5bb7f6962..0000000
--- a/core/java/android/content/pm/VerificationParams.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2012, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.pm;
-
-parcelable VerificationParams;
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 4ed175d..914ffdf 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -1973,13 +1973,13 @@
public SetRemoteInputsAction(Parcel parcel) {
viewId = parcel.readInt();
- remoteInputs = parcel.readParcelableArray(RemoteInput.class.getClassLoader());
+ remoteInputs = parcel.createTypedArray(RemoteInput.CREATOR);
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(TAG);
dest.writeInt(viewId);
- dest.writeParcelableArray(remoteInputs, flags);
+ dest.writeTypedArray(remoteInputs, flags);
}
@Override
diff --git a/core/res/res/values-ldrtl-television/config.xml b/core/res/res/values-ldrtl-television/config.xml
new file mode 100644
index 0000000..e237acc
--- /dev/null
+++ b/core/res/res/values-ldrtl-television/config.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2016, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+ for TV products. Do not translate. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Default bounds [left top right bottom] on screen for picture-in-picture windows. -->
+ <string translatable="false" name="config_defaultPictureInPictureBounds">"112 54 592 324"</string>
+
+</resources>
diff --git a/core/res/res/values-television/config.xml b/core/res/res/values-television/config.xml
index 0f98cfb..f24f67d 100644
--- a/core/res/res/values-television/config.xml
+++ b/core/res/res/values-television/config.xml
@@ -25,10 +25,10 @@
<bool name="config_defaultWindowFeatureOptionsPanel">false</bool>
<!-- Default bounds [left top right bottom] on screen for picture-in-picture windows. -->
- <string translatable="false" name="config_defaultPictureInPictureBounds">"1420 100 1820 325"</string>
+ <string translatable="false" name="config_defaultPictureInPictureBounds">"1328 54 1808 324"</string>
<!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, when the PIP
is located in center. -->
- <string translatable="false" name="config_centeredPictureInPictureBounds">"600 331 1320 749"</string>
+ <string translatable="false" name="config_centeredPictureInPictureBounds">"596 280 1324 690"</string>
</resources>
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index 397ab15..c08f4bf 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -153,6 +153,7 @@
mSurface = nativeGetSurface();
+ mIsReaderValid = true;
// Estimate the native buffer allocation size and register it so it gets accounted for
// during GC. Note that this doesn't include the buffers required by the buffer queue
// itself and the buffers requested by the producer.
@@ -326,7 +327,11 @@
*/
private int acquireNextSurfaceImage(SurfaceImage si) {
synchronized (mCloseLock) {
- int status = nativeImageSetup(si);
+ // A null image will eventually be returned if ImageReader is already closed.
+ int status = ACQUIRE_NO_BUFS;
+ if (mIsReaderValid) {
+ status = nativeImageSetup(si);
+ }
switch (status) {
case ACQUIRE_SUCCESS:
@@ -498,6 +503,7 @@
* acquire operations.
*/
synchronized (mCloseLock) {
+ mIsReaderValid = false;
for (Image image : mAcquiredImages) {
image.close();
}
@@ -613,6 +619,7 @@
private final Object mListenerLock = new Object();
private final Object mCloseLock = new Object();
+ private boolean mIsReaderValid = false;
private OnImageAvailableListener mListener;
private ListenerHandler mListenerHandler;
// Keep track of the successfully acquired Images. This need to be thread safe as the images
@@ -638,7 +645,14 @@
synchronized (mListenerLock) {
listener = mListener;
}
- if (listener != null) {
+
+ // It's dangerous to fire onImageAvailable() callback when the ImageReader is being
+ // closed, as application could acquire next image in the onImageAvailable() callback.
+ boolean isReaderValid = false;
+ synchronized (mCloseLock) {
+ isReaderValid = mIsReaderValid;
+ }
+ if (listener != null && isReaderValid) {
listener.onImageAvailable(ImageReader.this);
}
}
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index bc7913b..a332195 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -26,6 +26,7 @@
import android.net.Uri;
import android.os.IBinder;
import android.provider.BaseColumns;
+import android.text.TextUtils;
import android.util.ArraySet;
import java.util.ArrayList;
@@ -1376,6 +1377,10 @@
* {@link #COLUMN_BROADCAST_GENRE} or {@link #COLUMN_CANONICAL_GENRE} column.
*/
public static String encode(@NonNull String... genres) {
+ if (genres == null) {
+ // MNC and before will throw a NPE.
+ return null;
+ }
StringBuilder sb = new StringBuilder();
String separator = "";
for (String genre : genres) {
@@ -1411,7 +1416,8 @@
* @return genre strings.
*/
public static String[] decode(@NonNull String genres) {
- if (genres.isEmpty()) {
+ if (TextUtils.isEmpty(genres)) {
+ // MNC and before will throw a NPE for {@code null} genres.
return EMPTY_STRING_ARRAY;
}
if (genres.indexOf(COMMA) == -1 && genres.indexOf(DOUBLE_QUOTE) == -1) {
diff --git a/packages/DocumentsUI/res/layout/item_dir_grid.xml b/packages/DocumentsUI/res/layout/item_dir_grid.xml
index d866145..a4f06d1 100644
--- a/packages/DocumentsUI/res/layout/item_dir_grid.xml
+++ b/packages/DocumentsUI/res/layout/item_dir_grid.xml
@@ -62,7 +62,7 @@
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:ellipsize="middle"
+ android:ellipsize="end"
android:singleLine="true"
android:textAlignment="viewStart"
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
diff --git a/packages/DocumentsUI/res/layout/item_doc_grid.xml b/packages/DocumentsUI/res/layout/item_doc_grid.xml
index 1890f2f..af1703f 100644
--- a/packages/DocumentsUI/res/layout/item_doc_grid.xml
+++ b/packages/DocumentsUI/res/layout/item_doc_grid.xml
@@ -90,7 +90,7 @@
android:layout_alignParentTop="true"
android:layout_toEndOf="@id/icon_mime_sm"
android:singleLine="true"
- android:ellipsize="middle"
+ android:ellipsize="end"
android:textAlignment="viewStart"
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
android:textColor="@*android:color/primary_text_default_material_light" />
diff --git a/packages/DocumentsUI/res/layout/item_doc_list.xml b/packages/DocumentsUI/res/layout/item_doc_list.xml
index 8d98377..b169ec8 100644
--- a/packages/DocumentsUI/res/layout/item_doc_list.xml
+++ b/packages/DocumentsUI/res/layout/item_doc_list.xml
@@ -80,7 +80,7 @@
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
- android:ellipsize="middle"
+ android:ellipsize="end"
android:singleLine="true"
android:textAlignment="viewStart"
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
diff --git a/packages/DocumentsUI/res/layout/item_subdir.xml b/packages/DocumentsUI/res/layout/item_subdir.xml
index 821432d..b8251d1 100644
--- a/packages/DocumentsUI/res/layout/item_subdir.xml
+++ b/packages/DocumentsUI/res/layout/item_subdir.xml
@@ -40,7 +40,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
- android:ellipsize="middle"
+ android:ellipsize="end"
android:textAlignment="viewStart"
android:textAppearance="@android:style/TextAppearance.Material.Subhead"
android:textColor="?android:attr/textColorPrimary" />
diff --git a/packages/DocumentsUI/res/layout/item_subdir_title.xml b/packages/DocumentsUI/res/layout/item_subdir_title.xml
index 4c839d0..de6c523 100644
--- a/packages/DocumentsUI/res/layout/item_subdir_title.xml
+++ b/packages/DocumentsUI/res/layout/item_subdir_title.xml
@@ -26,7 +26,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
- android:ellipsize="middle"
+ android:ellipsize="end"
android:textAlignment="viewStart"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title" />
diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
index 845e32c..95c49ff 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java
@@ -33,7 +33,6 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
-import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
@@ -66,9 +65,6 @@
public abstract class BaseActivity extends Activity
implements SearchManagerListener, NavigationView.Environment {
- // See comments where this const is referenced for details.
- private static final int DRAWER_NO_FIDDLE_DELAY = 1500;
-
State mState;
RootsCache mRoots;
SearchViewManager mSearchManager;
@@ -80,10 +76,6 @@
@LayoutRes
private int mLayoutId;
- // Track the time we opened the drawer in response to back being pressed.
- // We use the time gap to figure out whether to close app or reopen the drawer.
- private long mDrawerLastFiddled;
-
private boolean mNavDrawerHasFocus;
public abstract void onDocumentPicked(DocumentInfo doc, Model model);
@@ -368,6 +360,11 @@
invalidateOptionsMenu();
}
+ final void loadRoot(final Uri uri) {
+ new LoadRootTask(this, uri).executeOnExecutor(
+ ProviderExecutor.forAuthority(uri.getAuthority()));
+ }
+
/**
* Called when search results changed.
* Refreshes the content of the directory. It doesn't refresh elements on the action bar.
@@ -543,36 +540,18 @@
return;
}
- int size = mState.stack.size();
-
- // Do some "do what a I want" drawer fiddling, but don't
- // do it if user already hit back recently and we recently
- // did some fiddling.
- if (mDrawer.isPresent()
- && (System.currentTimeMillis() - mDrawerLastFiddled) > DRAWER_NO_FIDDLE_DELAY) {
- // Close drawer if it is open.
- if (mDrawer.isOpen()) {
- mDrawer.setOpen(false);
- mDrawerLastFiddled = System.currentTimeMillis();
- return;
- }
-
- // Open the Close drawer if it is closed and we're at the top of a root.
- if (size == 1) {
- mDrawer.setOpen(true);
- // Remember so we don't just close it again if back is pressed again.
- mDrawerLastFiddled = System.currentTimeMillis();
- return;
- }
- }
-
- if (popDir()) {
+ if (onBeforePopDir() || popDir()) {
return;
}
super.onBackPressed();
}
+ boolean onBeforePopDir() {
+ // Files app overrides this with some fancy logic.
+ return false;
+ }
+
public void onStackPicked(DocumentStack stack) {
try {
// Update the restored stack to ensure we have freshest data
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index 6ecdc90..ed531a8 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -95,13 +95,27 @@
RootsFragment.show(getFragmentManager(), null);
}
- if (!mState.restored) {
- // In this case, we set the activity title in AsyncTask.onPostExecute(). To prevent
- // talkback from reading aloud the default title, we clear it here.
- setTitle("");
- new RestoreStackTask(this).execute();
- } else {
+ if (mState.restored) {
refreshCurrentRootAndDirectory(ANIM_NONE);
+ } else {
+ // We set the activity title in AsyncTask.onPostExecute().
+ // To prevent talkback from reading aloud the default title, we clear it here.
+ setTitle("");
+
+ // As a matter of policy we don't load the last used stack for the copy
+ // destination picker (user is already in Files app).
+ // Concensus was that the experice was too confusing.
+ // In all other cases, where the user is visiting us from another app
+ // we restore the stack as last used from that app.
+ if (mState.action == ACTION_PICK_COPY_DESTINATION) {
+ if (DEBUG) Log.d(TAG, "Launching directly into Home directory.");
+ Uri homeUri = DocumentsContract.buildHomeUri();
+ new LoadRootTask(this, homeUri).executeOnExecutor(
+ ProviderExecutor.forAuthority(homeUri.getAuthority()));
+ } else {
+ if (DEBUG) Log.d(TAG, "Attempting to load last used stack for calling package.");
+ new LoadLastUsedStackTask(this).execute();
+ }
}
}
@@ -443,16 +457,19 @@
}
/**
- * Restores the stack from Recents for the specified package.
+ * Loads the last used path (stack) from Recents (history).
+ * The path selected is based on the calling package name. So the last
+ * path for an app like Gmail can be different than the last path
+ * for an app like DropBox.
*/
- private static final class RestoreStackTask
+ private static final class LoadLastUsedStackTask
extends PairedTask<DocumentsActivity, Void, Void> {
private volatile boolean mRestoredStack;
private volatile boolean mExternal;
private State mState;
- public RestoreStackTask(DocumentsActivity activity) {
+ public LoadLastUsedStackTask(DocumentsActivity activity) {
super(activity);
mState = activity.mState;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DownloadsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DownloadsActivity.java
index 9609dee..536feeb 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DownloadsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DownloadsActivity.java
@@ -71,7 +71,7 @@
// talkback from reading aloud the default title, we clear it here.
setTitle("");
final Uri rootUri = getIntent().getData();
- new RestoreRootTask(this, rootUri).executeOnExecutor(getExecutorForCurrentDirectory());
+ new LoadRootTask(this, rootUri).executeOnExecutor(getExecutorForCurrentDirectory());
} else {
refreshCurrentRootAndDirectory(ANIM_NONE);
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
index 8b42ac5..a3378ad 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java
@@ -62,6 +62,12 @@
public static final String TAG = "FilesActivity";
+ // See comments where this const is referenced for details.
+ private static final int DRAWER_NO_FIDDLE_DELAY = 1500;
+
+ // Track the time we opened the drawer in response to back being pressed.
+ // We use the time gap to figure out whether to close app or reopen the drawer.
+ private long mDrawerLastFiddled;
private DocumentClipper mClipper;
public FilesActivity() {
@@ -102,14 +108,12 @@
if (DEBUG) Log.d(TAG, "Launching with root URI.");
// If we've got a specific root to display, restore that root using a dedicated
// authority. That way a misbehaving provider won't result in an ANR.
- new RestoreRootTask(this, uri).executeOnExecutor(
- ProviderExecutor.forAuthority(uri.getAuthority()));
+ loadRoot(uri);
} else {
if (DEBUG) Log.d(TAG, "Launching into Home directory.");
// If all else fails, try to load "Home" directory.
final Uri homeUri = DocumentsContract.buildHomeUri();
- new RestoreRootTask(this, homeUri).executeOnExecutor(
- ProviderExecutor.forAuthority(homeUri.getAuthority()));
+ loadRoot(homeUri);
}
final @DialogType int dialogType = intent.getIntExtra(
@@ -340,6 +344,34 @@
}
}
+ // Do some "do what a I want" drawer fiddling, but don't
+ // do it if user already hit back recently and we recently
+ // did some fiddling.
+ @Override
+ boolean onBeforePopDir() {
+ int size = mState.stack.size();
+
+ if (mDrawer.isPresent()
+ && (System.currentTimeMillis() - mDrawerLastFiddled) > DRAWER_NO_FIDDLE_DELAY) {
+ // Close drawer if it is open.
+ if (mDrawer.isOpen()) {
+ mDrawer.setOpen(false);
+ mDrawerLastFiddled = System.currentTimeMillis();
+ return true;
+ }
+
+ // Open the Close drawer if it is closed and we're at the top of a root.
+ if (size == 1) {
+ mDrawer.setOpen(true);
+ // Remember so we don't just close it again if back is pressed again.
+ mDrawerLastFiddled = System.currentTimeMillis();
+ return true;
+ }
+ }
+
+ return false;
+ }
+
// Turns out only DocumentsActivity was ever calling saveStackBlocking.
// There may be a case where we want to contribute entries from
// Behavior here in FilesActivity, but it isn't yet obvious.
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RestoreRootTask.java b/packages/DocumentsUI/src/com/android/documentsui/LoadRootTask.java
similarity index 90%
rename from packages/DocumentsUI/src/com/android/documentsui/RestoreRootTask.java
rename to packages/DocumentsUI/src/com/android/documentsui/LoadRootTask.java
index 9048b9d..c5d359b 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RestoreRootTask.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/LoadRootTask.java
@@ -22,12 +22,12 @@
import com.android.documentsui.model.RootInfo;
-final class RestoreRootTask extends PairedTask<BaseActivity, Void, RootInfo> {
+final class LoadRootTask extends PairedTask<BaseActivity, Void, RootInfo> {
private static final String TAG = "RestoreRootTask";
private final Uri mRootUri;
- public RestoreRootTask(BaseActivity activity, Uri rootUri) {
+ public LoadRootTask(BaseActivity activity, Uri rootUri) {
super(activity);
mRootUri = rootUri;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
index 92ffb93..e1b1c09 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
@@ -95,6 +95,7 @@
public static final String PACKAGE_NAME = "package_name";
public static final String STACK = "stack";
public static final String TIMESTAMP = "timestamp";
+ // Indicates handler was an external app, like photos.
public static final String EXTERNAL = "external";
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/State.java b/packages/DocumentsUI/src/com/android/documentsui/State.java
index 2ecbdf6..62f9ea7 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/State.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/State.java
@@ -157,11 +157,13 @@
mStackTouched = true;
}
+ // This will return true even when the initial location is set.
+ // To get a read on if the user has changed something, use #hasInitialLocationChanged.
public boolean hasLocationChanged() {
return mStackTouched;
}
- public boolean initialLocationHasChanged() {
+ public boolean hasInitialLocationChanged() {
return mInitialRootChanged || mInitialDocChanged;
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java
index 1ede082..ac05c05 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java
@@ -119,6 +119,11 @@
* Requests focus on the item that last had focus. Scrolls to that item if necessary.
*/
public void restoreLastFocus() {
+ if (mAdapter.getItemCount() == 0) {
+ // Nothing to focus.
+ return;
+ }
+
if (mLastFocusPosition != RecyclerView.NO_POSITION) {
// The system takes care of situations when a view is no longer on screen, etc,
focusItem(mLastFocusPosition);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java
index 59efed6..8ef8910 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java
@@ -16,7 +16,6 @@
package com.android.documentsui.dirlist;
-import static com.android.documentsui.Shared.DEBUG;
import static com.android.documentsui.State.ACTION_BROWSE;
import static com.android.documentsui.State.ACTION_CREATE;
import static com.android.documentsui.State.ACTION_GET_CONTENT;
@@ -27,12 +26,10 @@
import android.content.Context;
import android.provider.DocumentsContract.Document;
-import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
-import com.android.documentsui.DocumentsActivity;
-import com.android.documentsui.FilesActivity;
+import com.android.documentsui.BaseActivity;
import com.android.documentsui.Menus;
import com.android.documentsui.MimePredicate;
import com.android.documentsui.R;
@@ -155,11 +152,10 @@
@Override
void onModelLoaded(Model model, @ResultType int resultType, boolean isSearch) {
- // When launched into empty recents, show drawer
- if (resultType == DirectoryFragment.TYPE_RECENT_OPEN
- && model.isEmpty()
- && !mState.hasLocationChanged()) {
- ((DocumentsActivity) mContext).setRootsDrawerOpen(true);
+ // When launched into empty root, open drawer.
+ if (model.isEmpty() && !mState.hasInitialLocationChanged() && !isSearch) {
+ // This noops on layouts without drawer, so no need to guard.
+ ((BaseActivity) mContext).setRootsDrawerOpen(true);
}
}
}
@@ -204,8 +200,6 @@
*/
private static final class FilesTuner extends FragmentTuner {
- private static final String TAG = "FilesTuner";
-
public FilesTuner(Context context, State state) {
super(context, state);
}
@@ -234,20 +228,15 @@
@Override
void onModelLoaded(Model model, @ResultType int resultType, boolean isSearch) {
- if (DEBUG) Log.d(TAG, "Handling model loaded. Has Location shcnage: " + mState.initialLocationHasChanged());
// When launched into empty root, open drawer.
- if (model.isEmpty() && !mState.initialLocationHasChanged() && !isSearch) {
- if (DEBUG) Log.d(TAG, "Showing roots drawer cuz stuffs empty.");
-
+ if (model.isEmpty() && !mState.hasInitialLocationChanged() && !isSearch) {
// This noops on layouts without drawer, so no need to guard.
- ((FilesActivity) mContext).setRootsDrawerOpen(true);
+ ((BaseActivity) mContext).setRootsDrawerOpen(true);
}
- if (DEBUG) Log.d(TAG, "Donezo.");
}
}
private static boolean isDirectory(String mimeType) {
return Document.MIME_TYPE_DIR.equals(mimeType);
}
-
}
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index b8f10db..3ee2475 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -18,7 +18,9 @@
android:id="@+id/quick_settings_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/qs_background_primary">
+ android:background="@drawable/qs_background_primary"
+ android:clipToPadding="false"
+ android:clipChildren="false">
<com.android.systemui.qs.QSPanel
android:id="@+id/quick_settings_panel"
diff --git a/packages/SystemUI/res/layout/remote_input.xml b/packages/SystemUI/res/layout/remote_input.xml
index cce07bd..818df3b 100644
--- a/packages/SystemUI/res/layout/remote_input.xml
+++ b/packages/SystemUI/res/layout/remote_input.xml
@@ -42,6 +42,7 @@
android:background="@null"
android:singleLine="true"
android:ellipsize="start"
+ android:inputType="textShortMessage|textAutoCorrect|textCapSentences"
android:imeOptions="actionSend" />
<FrameLayout
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index 19bc755..189eb3b 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -91,6 +91,7 @@
<declare-styleable name="TunerSwitch">
<attr name="defValue" format="boolean" />
+ <attr name="metricsAction" format="integer" />
</declare-styleable>
</resources>
diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml
index ea9fbfb..f4a0cc9 100644
--- a/packages/SystemUI/res/xml/tuner_prefs.xml
+++ b/packages/SystemUI/res/xml/tuner_prefs.xml
@@ -109,14 +109,20 @@
android:key="volume_and_do_not_disturb"
android:title="@string/volume_and_do_not_disturb">
+ <!-- Action for this is
+ MetricsConstants.ACTION_TUNER_DO_NOT_DISTURB_VOLUME_PANEL -->
<com.android.systemui.tuner.TunerSwitch
android:key="sysui_show_full_zen"
- android:title="@string/tuner_full_zen_title" />
+ android:title="@string/tuner_full_zen_title"
+ sysui:metricsAction="314" />
+ <!-- Action for this is
+ MetricsConstants.ACTION_TUNER_DO_NOT_DISTURB_VOLUME_SHORTCUT -->
<com.android.systemui.tuner.TunerSwitch
android:key="sysui_volume_down_silent,sysui_volume_up_silent"
android:title="@string/volume_dnd_silent"
- sysui:defValue="true" />
+ sysui:defValue="true"
+ sysui:metricsAction="315" />
</PreferenceScreen>
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index 4cfa042..dc64591 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -39,6 +39,7 @@
public static final float EXPANDED_TILE_DELAY = .7f;
private final ArrayList<View> mAllViews = new ArrayList<>();
+ private final ArrayList<View> mTopFiveQs = new ArrayList<>();
private final QuickQSPanel mQuickQsPanel;
private final QSPanel mQsPanel;
private final QSContainer mQsContainer;
@@ -86,7 +87,10 @@
firstPageDelayedBuilder.setStartDelay(EXPANDED_TILE_DELAY);
firstPageBuilder.setListener(this);
translationYBuilder.setInterpolator(TRANSLATION_Y_INTERPOLATOR);
+ // Fade in the tiles/labels as we reach the final position.
+ firstPageDelayedBuilder.addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1);
mAllViews.clear();
+ mTopFiveQs.clear();
for (QSTile<?> tile : tiles) {
QSTileBaseView tileView = mQsPanel.getTileView(tile);
final TextView label = ((QSTileView) tileView).getLabel();
@@ -104,21 +108,17 @@
translationYBuilder.addFloat(quickTileView, "translationY", 0, yDiff);
// Counteract the parent translation on the tile. So we have a static base to
- // animate off from.
+ // animate the label position off from.
firstPageBuilder.addFloat(tileView, "translationY", mQsPanel.getHeight(), 0);
- // Move the real tile's icon and label from the quick tile position to its final
+ // Move the real tile's label from the quick tile position to its final
// location.
- firstPageBuilder.addFloat(tileIcon, "translationX", -xDiff, 0);
- translationYBuilder.addFloat(tileIcon, "translationY", -yDiff, 0);
firstPageBuilder.addFloat(label, "translationX", -xDiff, 0);
translationYBuilder.addFloat(label, "translationY", -yDiff, 0);
- // Fade in the label as we reach the final position.
- firstPageDelayedBuilder.addFloat(label, "alpha", 0, 1);
+ mTopFiveQs.add(tileIcon);
+ mAllViews.add(tileIcon);
mAllViews.add(quickTileView);
- } else {
- firstPageDelayedBuilder.addFloat(tileView, "alpha", 0, 1);
}
mAllViews.add(tileView);
mAllViews.add(label);
@@ -159,17 +159,26 @@
@Override
public void onAnimationAtStart() {
-
}
@Override
public void onAnimationAtEnd() {
mQuickQsPanel.setVisibility(View.INVISIBLE);
+ final int N = mTopFiveQs.size();
+ for (int i = 0; i < N; i++) {
+ mTopFiveQs.get(i).setVisibility(View.VISIBLE);
+ }
}
@Override
public void onAnimationStarted() {
mQuickQsPanel.setVisibility(View.VISIBLE);
+ if (mOnFirstPage) {
+ final int N = mTopFiveQs.size();
+ for (int i = 0; i < N; i++) {
+ mTopFiveQs.get(i).setVisibility(View.INVISIBLE);
+ }
+ }
}
private void clearAnimationState() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
index b33d31d..94d8524 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
@@ -14,8 +14,6 @@
package com.android.systemui.qs;
-import android.animation.Keyframe;
-import android.util.Log;
import android.util.MathUtils;
import android.util.Property;
import android.view.View;
@@ -34,7 +32,6 @@
public class TouchAnimator {
private final Object[] mTargets;
- private final Property[] mProperties;
private final KeyframeSet[] mKeyframeSets;
private final float mStartDelay;
private final float mEndDelay;
@@ -43,10 +40,9 @@
private final Listener mListener;
private float mLastT;
- private TouchAnimator(Object[] targets, Property[] properties, KeyframeSet[] keyframeSets,
+ private TouchAnimator(Object[] targets, KeyframeSet[] keyframeSets,
float startDelay, float endDelay, Interpolator interpolator, Listener listener) {
mTargets = targets;
- mProperties = properties;
mKeyframeSets = keyframeSets;
mStartDelay = startDelay;
mEndDelay = endDelay;
@@ -73,8 +69,7 @@
mLastT = t;
}
for (int i = 0; i < mTargets.length; i++) {
- Object value = mKeyframeSets[i].getValue(t);
- mProperties[i].set(mTargets[i], value);
+ mKeyframeSets[i].setValue(t, mTargets[i]);
}
}
@@ -111,7 +106,6 @@
public static class Builder {
private List<Object> mTargets = new ArrayList<>();
- private List<Property> mProperties = new ArrayList<>();
private List<KeyframeSet> mValues = new ArrayList<>();
private float mStartDelay;
@@ -120,18 +114,17 @@
private Listener mListener;
public Builder addFloat(Object target, String property, float... values) {
- add(target, property, KeyframeSet.ofFloat(values));
+ add(target, KeyframeSet.ofFloat(getProperty(target, property), values));
return this;
}
public Builder addInt(Object target, String property, int... values) {
- add(target, property, KeyframeSet.ofInt(values));
+ add(target, KeyframeSet.ofInt(getProperty(target, property), values));
return this;
}
- private void add(Object target, String property, KeyframeSet keyframeSet) {
+ private void add(Object target, KeyframeSet keyframeSet) {
mTargets.add(target);
- mProperties.add(getProperty(target, property));
mValues.add(keyframeSet);
}
@@ -183,7 +176,6 @@
public TouchAnimator build() {
return new TouchAnimator(mTargets.toArray(new Object[mTargets.size()]),
- mProperties.toArray(new Property[mProperties.size()]),
mValues.toArray(new KeyframeSet[mValues.size()]),
mStartDelay, mEndDelay, mInterpolator, mListener);
}
@@ -199,54 +191,57 @@
mFrameWidth = 1 / (float) (size - 1);
}
- Object getValue(float fraction) {
+ void setValue(float fraction, Object target) {
int i;
for (i = 1; i < mSize - 1 && fraction > mFrameWidth; i++);
float amount = fraction / mFrameWidth;
- return interpolate(i, amount);
+ interpolate(i, amount, target);
}
- protected abstract Object interpolate(int index, float amount);
+ protected abstract void interpolate(int index, float amount, Object target);
- public static KeyframeSet ofInt(int... values) {
- return new IntKeyframeSet(values);
+ public static KeyframeSet ofInt(Property property, int... values) {
+ return new IntKeyframeSet((Property<?, Integer>) property, values);
}
- public static KeyframeSet ofFloat(float... values) {
- return new FloatKeyframeSet(values);
+ public static KeyframeSet ofFloat(Property property, float... values) {
+ return new FloatKeyframeSet((Property<?, Float>) property, values);
}
}
- private static class FloatKeyframeSet extends KeyframeSet {
+ private static class FloatKeyframeSet<T> extends KeyframeSet {
private final float[] mValues;
+ private final Property<T, Float> mProperty;
- public FloatKeyframeSet(float[] values) {
+ public FloatKeyframeSet(Property<T, Float> property, float[] values) {
super(values.length);
+ mProperty = property;
mValues = values;
}
@Override
- protected Object interpolate(int index, float amount) {
+ protected void interpolate(int index, float amount, Object target) {
float firstFloat = mValues[index - 1];
float secondFloat = mValues[index];
- return firstFloat + (secondFloat - firstFloat) * amount;
+ mProperty.set((T) target, firstFloat + (secondFloat - firstFloat) * amount);
}
}
- private static class IntKeyframeSet extends KeyframeSet {
-
+ private static class IntKeyframeSet<T> extends KeyframeSet {
private final int[] mValues;
+ private final Property<T, Integer> mProperty;
- public IntKeyframeSet(int[] values) {
+ public IntKeyframeSet(Property<T, Integer> property, int[] values) {
super(values.length);
+ mProperty = property;
mValues = values;
}
@Override
- protected Object interpolate(int index, float amount) {
+ protected void interpolate(int index, float amount, Object target) {
int firstFloat = mValues[index - 1];
int secondFloat = mValues[index];
- return (int) (firstFloat + (secondFloat - firstFloat) * amount);
+ mProperty.set((T) target, (int) (firstFloat + (secondFloat - firstFloat) * amount));
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ExpandableIndicator.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ExpandableIndicator.java
index 8c7c71f..04095e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ExpandableIndicator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ExpandableIndicator.java
@@ -45,6 +45,7 @@
final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) getContext()
.getDrawable(res).getConstantState().newDrawable();
setImageDrawable(avd);
+ avd.forceAnimationOnUI();
avd.start();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
index 4f3c61e..5b4a3f0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
@@ -28,10 +28,13 @@
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.UserHandle;
import android.util.Log;
import libcore.io.IoUtils;
+import java.util.Objects;
+
/**
* Manages the lockscreen wallpaper.
*/
@@ -42,11 +45,15 @@
private final Context mContext;
private final PhoneStatusBar mBar;
private final IWallpaperManager mService;
+ private final WallpaperManager mWallpaperManager;
private final Handler mH;
private boolean mCached;
private Bitmap mCache;
- private int mUserId;
+ private int mCurrentUserId;
+ // The user selected in the UI, or null if no user is selected or UI doesn't support selecting
+ // users.
+ private UserHandle mSelectedUser;
public LockscreenWallpaper(Context ctx, PhoneStatusBar bar, Handler h) {
mContext = ctx;
@@ -54,7 +61,8 @@
mH = h;
mService = IWallpaperManager.Stub.asInterface(
ServiceManager.getService(Context.WALLPAPER_SERVICE));
- mUserId = ActivityManager.getCurrentUser();
+ mWallpaperManager = (WallpaperManager) ctx.getSystemService(Context.WALLPAPER_SERVICE);
+ mCurrentUserId = ActivityManager.getCurrentUser();
try {
mService.setLockWallpaperCallback(this);
@@ -73,8 +81,12 @@
mCache = null;
return null;
}
+ // Prefer the selected user (when specified) over the current user for the FLAG_SET_LOCK
+ // wallpaper.
+ final int lockWallpaperUserId =
+ mSelectedUser != null ? mSelectedUser.getIdentifier() : mCurrentUserId;
ParcelFileDescriptor fd = mService.getWallpaper(null, WallpaperManager.FLAG_SET_LOCK,
- new Bundle(), mUserId);
+ new Bundle(), lockWallpaperUserId);
if (fd != null) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
@@ -90,8 +102,17 @@
}
} else {
mCached = true;
- mCache = null;
- return null;
+ if (mSelectedUser != null && mSelectedUser.getIdentifier() != mCurrentUserId) {
+ // When selected user is different from the current user, show the selected
+ // user's static wallpaper.
+ mWallpaperManager.forgetLoadedWallpaper();
+ mCache = mWallpaperManager.getBitmapAsUser(mSelectedUser.getIdentifier());
+ } else {
+ // When there is no selected user, or it's same as the current user, show the
+ // system (possibly dynamic) wallpaper for the selected user.
+ mCache = null;
+ }
+ return mCache;
}
} catch (RemoteException e) {
Log.e(TAG, "System dead?" + e);
@@ -99,13 +120,23 @@
}
}
- public void setUser(int user) {
- if (user != mUserId) {
+ public void setCurrentUser(int user) {
+ if (user != mCurrentUserId) {
mCached = false;
- mUserId = user;
+ mCurrentUserId = user;
}
}
+ public void setSelectedUser(UserHandle selectedUser) {
+ if (Objects.equals(selectedUser, mSelectedUser)) {
+ return;
+ }
+ mSelectedUser = selectedUser;
+
+ mH.removeCallbacks(this);
+ mH.post(this);
+ }
+
@Override
public void onWallpaperChanged() {
// Called on Binder thread.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index e344df2..d25e99b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -27,7 +27,6 @@
import android.app.Notification;
import android.app.PendingIntent;
import android.app.StatusBarManager;
-import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
import android.content.ComponentCallbacks2;
import android.content.ComponentName;
@@ -69,7 +68,6 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.Vibrator;
@@ -296,7 +294,7 @@
AccessibilityController mAccessibilityController;
FingerprintUnlockController mFingerprintUnlockController;
LightStatusBarController mLightStatusBarController;
- private LockscreenWallpaper mLockscreenWallpaper;
+ protected LockscreenWallpaper mLockscreenWallpaper;
int mNaturalBarHeight = -1;
@@ -3171,7 +3169,7 @@
resetUserSetupObserver();
setControllerUsers();
clearCurrentMediaNotification();
- mLockscreenWallpaper.setUser(newUserId);
+ mLockscreenWallpaper.setCurrentUser(newUserId);
updateMediaMetaData(true, false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
index ab8067d..cf5531f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
@@ -21,7 +21,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
-import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
import android.util.AttributeSet;
@@ -129,14 +128,6 @@
((RippleDrawable) getBackground()).setForceSoftware(true);
((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true);
- addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
- @Override
- public void onLayoutChange(View v, int left, int top, int right,
- int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
- setClipBounds(new Rect(getPaddingLeft(), 0, getWidth() - getPaddingRight(),
- getHeight()));
- }
- });
updateResources();
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/ColorAndAppearanceFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/ColorAndAppearanceFragment.java
index 9f11325..af95cf9 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/ColorAndAppearanceFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/ColorAndAppearanceFragment.java
@@ -28,6 +28,8 @@
import android.view.View;
import android.widget.SeekBar;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NightModeController;
@@ -54,6 +56,7 @@
@Override
public void onResume() {
super.onResume();
+ MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_COLOR_AND_APPEARANCE, true);
// TODO: Figure out better title model for Tuner, to avoid any more of this.
getActivity().setTitle(R.string.color_and_appearance);
@@ -63,6 +66,12 @@
}
@Override
+ public void onPause() {
+ super.onPause();
+ MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_COLOR_AND_APPEARANCE, false);
+ }
+
+ @Override
public void onDisplayPreferenceDialog(Preference preference) {
if (preference instanceof CalibratePreference) {
CalibrateDialog.show(this);
@@ -76,6 +85,7 @@
}
private void onApply() {
+ MetricsLogger.action(getContext(), MetricsEvent.ACTION_TUNER_CALIBRATE_DISPLAY_CHANGED);
mNightModeController.setCustomValues(Settings.Secure.getString(
getContext().getContentResolver(), Secure.ACCESSIBILITY_DISPLAY_COLOR_MATRIX));
getView().removeCallbacks(mResetColorMatrix);
@@ -125,6 +135,7 @@
bindView(v.findViewById(R.id.r_group), 0);
bindView(v.findViewById(R.id.g_group), 5);
bindView(v.findViewById(R.id.b_group), 10);
+ MetricsLogger.visible(getContext(), MetricsEvent.TUNER_CALIBRATE_DISPLAY);
return new AlertDialog.Builder(getContext())
.setTitle(R.string.calibrate_display)
.setView(v)
@@ -133,6 +144,12 @@
.create();
}
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ super.onDismiss(dialog);
+ MetricsLogger.hidden(getContext(), MetricsEvent.TUNER_CALIBRATE_DISPLAY);
+ }
+
private void bindView(View view, final int index) {
SeekBar seekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar);
seekBar.setMax(1000);
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/NightModeFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/NightModeFragment.java
index e9650ea..8c945f9 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/NightModeFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/NightModeFragment.java
@@ -17,23 +17,20 @@
import android.annotation.Nullable;
import android.app.UiModeManager;
-import android.content.ContentResolver;
import android.content.Context;
import android.os.Bundle;
-import android.provider.Settings;
import android.provider.Settings.Secure;
import android.support.v14.preference.PreferenceFragment;
import android.support.v14.preference.SwitchPreference;
-import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Switch;
-
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R;
-import com.android.systemui.statusbar.phone.QSTileHost;
import com.android.systemui.statusbar.policy.NightModeController;
import com.android.systemui.statusbar.policy.NightModeController.Listener;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -100,6 +97,7 @@
@Override
public void onClick(View v) {
boolean newState = !mNightModeController.isEnabled();
+ MetricsLogger.action(getContext(), MetricsEvent.ACTION_TUNER_NIGHT_MODE, newState);
mNightModeController.setNightMode(newState);
mSwitch.setChecked(newState);
}
@@ -109,6 +107,7 @@
@Override
public void onResume() {
super.onResume();
+ MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_NIGHT_MODE, true);
mNightModeController.addListener(this);
TunerService.get(getContext()).addTunable(this, Secure.BRIGHTNESS_USE_TWILIGHT,
NightModeController.NIGHT_MODE_ADJUST_TINT);
@@ -119,24 +118,33 @@
@Override
public void onPause() {
super.onPause();
+ MetricsLogger.visibility(getContext(), MetricsEvent.TUNER_NIGHT_MODE, false);
mNightModeController.removeListener(this);
TunerService.get(getContext()).removeTunable(this);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final Boolean value = (Boolean) newValue;
if (mAutoSwitch == preference) {
- mNightModeController.setAuto((Boolean) newValue);
+ MetricsLogger.action(getContext(), MetricsEvent.ACTION_TUNER_NIGHT_MODE_AUTO, value);
+ mNightModeController.setAuto(value);
} else if (mDarkTheme == preference) {
- mUiModeManager.setNightMode(((Boolean) newValue) ? UiModeManager.MODE_NIGHT_AUTO
+ MetricsLogger.action(getContext(),
+ MetricsEvent.ACTION_TUNER_NIGHT_MODE_ADJUST_DARK_THEME, value);
+ mUiModeManager.setNightMode(value ? UiModeManager.MODE_NIGHT_AUTO
: UiModeManager.MODE_NIGHT_NO);
postCalculateDisabled();
} else if (mAdjustTint == preference) {
- mNightModeController.setAdjustTint((Boolean) newValue);
+ MetricsLogger.action(getContext(),
+ MetricsEvent.ACTION_TUNER_NIGHT_MODE_ADJUST_TINT, value);
+ mNightModeController.setAdjustTint(value);
postCalculateDisabled();
} else if (mAdjustBrightness == preference) {
+ MetricsLogger.action(getContext(),
+ MetricsEvent.ACTION_TUNER_NIGHT_MODE_ADJUST_BRIGHTNESS, value);
TunerService.get(getContext()).setValue(Secure.BRIGHTNESS_USE_TWILIGHT,
- ((Boolean) newValue) ? 1 : 0);
+ value ? 1 : 0);
postCalculateDisabled();
} else {
return false;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
index def597d..748ee97 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
@@ -45,6 +45,13 @@
}
@Override
+ public void onBackPressed() {
+ if (!getFragmentManager().popBackStackImmediate()) {
+ super.onBackPressed();
+ }
+ }
+
+ @Override
public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
try {
Class<?> cls = Class.forName(pref.getFragment());
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
index b738136..5b9ebd7 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
@@ -6,18 +6,21 @@
import android.support.v14.preference.SwitchPreference;
import android.util.AttributeSet;
+import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
import com.android.systemui.tuner.TunerService.Tunable;
public class TunerSwitch extends SwitchPreference implements Tunable {
private final boolean mDefault;
+ private final int mAction;
public TunerSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TunerSwitch);
mDefault = a.getBoolean(R.styleable.TunerSwitch_defValue, false);
+ mAction = a.getInt(R.styleable.TunerSwitch_metricsAction, -1);
}
@Override
@@ -38,6 +41,14 @@
}
@Override
+ protected void onClick() {
+ super.onClick();
+ if (mAction != -1) {
+ MetricsLogger.action(getContext(), mAction, isChecked());
+ }
+ }
+
+ @Override
protected boolean persistBoolean(boolean value) {
for (String key : getKey().split(",")) {
Settings.Secure.putString(getContext().getContentResolver(), key, value ? "1" : "0");
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index cd31b17..cd026a8 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -408,5 +408,38 @@
// Changes made on bug report details screen were canceled by user.
ACTION_BUGREPORT_DETAILS_CANCELED = 304;
+
+ // Tuner: Open/close calibrate dialog.
+ TUNER_CALIBRATE_DISPLAY = 305;
+
+ // Tuner: Open/close color and appearance.
+ TUNER_COLOR_AND_APPEARANCE = 306;
+
+ // Tuner: Apply calibrate dialog.
+ ACTION_TUNER_CALIBRATE_DISPLAY_CHANGED = 307;
+
+ // Tuner: Open/close night mode.
+ TUNER_NIGHT_MODE = 308;
+
+ // Tuner: Change night mode.
+ ACTION_TUNER_NIGHT_MODE = 309;
+
+ // Tuner: Change night mode auto.
+ ACTION_TUNER_NIGHT_MODE_AUTO = 310;
+
+ // Tuner: Change night mode adjust dark theme.
+ ACTION_TUNER_NIGHT_MODE_ADJUST_DARK_THEME = 311;
+
+ // Tuner: Change night mode adjust tint.
+ ACTION_TUNER_NIGHT_MODE_ADJUST_TINT = 312;
+
+ // Tuner: Change night mode adjust brightness.
+ ACTION_TUNER_NIGHT_MODE_ADJUST_BRIGHTNESS = 313;
+
+ // Tuner: Change do not disturb in volume panel.
+ ACTION_TUNER_DO_NOT_DISTURB_VOLUME_PANEL = 314;
+
+ // Tuner: Change do not disturb volume buttons shortcut.
+ ACTION_TUNER_DO_NOT_DISTURB_VOLUME_SHORTCUT = 315;
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 2394842..0f0a6c5 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2226,6 +2226,11 @@
return;
}
+ if (stackId == FREEFORM_WORKSPACE_STACK_ID && !mService.mSupportsFreeformWindowManagement) {
+ throw new IllegalArgumentException("moveTaskToStack:"
+ + "Attempt to move task " + taskId + " to unsupported freeform stack");
+ }
+
final ActivityRecord topActivity = task.getTopActivity();
final int sourceStackId = task.stack != null ? task.stack.mStackId : INVALID_STACK_ID;
final boolean mightReplaceWindow =
@@ -2260,10 +2265,13 @@
// Make sure the task has the appropriate bounds/size for the stack it is in.
if (stackId == FULLSCREEN_WORKSPACE_STACK_ID && task.mBounds != null) {
kept = resizeTaskLocked(task, stack.mBounds, RESIZE_MODE_SYSTEM, !mightReplaceWindow);
- } else if (stackId == FREEFORM_WORKSPACE_STACK_ID
- && task.mBounds == null && task.mLastNonFullscreenBounds != null) {
- kept = resizeTaskLocked(task, task.mLastNonFullscreenBounds,
- RESIZE_MODE_SYSTEM, !mightReplaceWindow);
+ } else if (stackId == FREEFORM_WORKSPACE_STACK_ID) {
+ Rect bounds = task.getLaunchBounds();
+ if (bounds == null) {
+ stack.layoutTaskInStack(task, null);
+ bounds = task.mBounds;
+ }
+ kept = resizeTaskLocked(task, bounds, RESIZE_MODE_FORCED, !mightReplaceWindow);
} else if (stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID) {
kept = resizeTaskLocked(task, stack.mBounds, RESIZE_MODE_SYSTEM, !mightReplaceWindow);
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index b638dc5..f1d7b36 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -86,6 +86,8 @@
/** The number of concurrent jobs we run at one time. */
private static final int MAX_JOB_CONTEXTS_COUNT
= ActivityManager.isLowRamDeviceStatic() ? 3 : 6;
+ /** Enforce a per-app limit on scheduled jobs? */
+ private static final boolean ENFORCE_MAX_JOBS = false;
/** The maximum number of jobs that we allow an unprivileged app to schedule */
private static final int MAX_JOBS_PER_APP = 100;
@@ -263,7 +265,7 @@
JobStatus toCancel;
synchronized (mLock) {
// Jobs on behalf of others don't apply to the per-app job cap
- if (packageName == null) {
+ if (ENFORCE_MAX_JOBS && packageName == null) {
if (mJobs.countJobsForUid(uId) > MAX_JOBS_PER_APP) {
Slog.w(TAG, "Too many jobs for uid " + uId);
throw new IllegalStateException("Apps may not schedule more than "
diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java
index 7c5e336..4239248 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -369,6 +369,13 @@
}
break;
case MSG_CANCEL:
+ if (mVerb == VERB_FINISHED) {
+ if (DEBUG) {
+ Slog.d(TAG,
+ "Trying to process cancel for torn-down context, ignoring.");
+ }
+ return;
+ }
mParams.setStopReason(message.arg1);
if (message.arg1 == JobParameters.REASON_PREEMPT) {
mPreferredUid = mRunningJob != null ? mRunningJob.getUid() :
@@ -478,12 +485,6 @@
* _ENDING -> No point in doing anything here, so we ignore.
*/
private void handleCancelH() {
- if (mRunningJob == null) {
- if (DEBUG) {
- Slog.d(TAG, "Trying to process cancel for torn-down context, ignoring.");
- }
- return;
- }
if (JobSchedulerService.DEBUG) {
Slog.d(TAG, "Handling cancel for: " + mRunningJob.getJobId() + " "
+ VERB_STRINGS[mVerb]);
@@ -511,7 +512,6 @@
/** Process MSG_TIMEOUT here. */
private void handleOpTimeoutH() {
- mParams.setStopReason(JobParameters.REASON_TIMEOUT);
switch (mVerb) {
case VERB_BINDING:
Slog.e(TAG, "Time-out while trying to bind " + mRunningJob.toShortString() +
@@ -536,6 +536,7 @@
// Not an error - client ran out of time.
Slog.i(TAG, "Client timed out while executing (no jobFinished received)." +
" sending onStop. " + mRunningJob.toShortString());
+ mParams.setStopReason(JobParameters.REASON_TIMEOUT);
sendStopMessageH();
break;
default:
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 41077d0..b218f0f 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -153,7 +153,6 @@
import android.content.pm.ServiceInfo;
import android.content.pm.Signature;
import android.content.pm.UserInfo;
-import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
import android.content.pm.VerifierInfo;
import android.content.res.Resources;
@@ -173,6 +172,7 @@
import android.os.Message;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
+import android.os.Parcelable;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -5001,8 +5001,9 @@
// cross-profile app linking works only towards the parent.
final UserInfo parent = getProfileParent(sourceUserId);
synchronized(mPackages) {
+ int flags = updateFlagsForResolve(0, parent.id, intent);
CrossProfileDomainInfo xpDomainInfo = getCrossProfileDomainPreferredLpr(
- intent, resolvedType, 0, sourceUserId, parent.id);
+ intent, resolvedType, flags, sourceUserId, parent.id);
return xpDomainInfo != null;
}
}
@@ -10402,17 +10403,8 @@
}
@Override
- public void installPackage(String originPath, IPackageInstallObserver2 observer,
- int installFlags, String installerPackageName, VerificationParams verificationParams,
- String packageAbiOverride) {
- installPackageAsUser(originPath, observer, installFlags, installerPackageName,
- verificationParams, packageAbiOverride, UserHandle.getCallingUserId());
- }
-
- @Override
public void installPackageAsUser(String originPath, IPackageInstallObserver2 observer,
- int installFlags, String installerPackageName, VerificationParams verificationParams,
- String packageAbiOverride, int userId) {
+ int installFlags, String installerPackageName, int userId) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null);
final int callingUid = Binder.getCallingUid();
@@ -10455,14 +10447,15 @@
+ "to use the PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS flag");
}
- verificationParams.setInstallerUid(callingUid);
-
final File originFile = new File(originPath);
final OriginInfo origin = OriginInfo.fromUntrustedFile(originFile);
final Message msg = mHandler.obtainMessage(INIT_COPY);
- final InstallParams params = new InstallParams(origin, null, observer, installFlags,
- installerPackageName, null, verificationParams, user, packageAbiOverride, null);
+ final VerificationInfo verificationInfo = new VerificationInfo(
+ null /*originatingUri*/, null /*referrer*/, -1 /*originatingUid*/, callingUid);
+ final InstallParams params = new InstallParams(origin, null /*moveInfo*/, observer,
+ installFlags, installerPackageName, null /*volumeUuid*/, verificationInfo, user,
+ null /*packageAbiOverride*/, null /*grantedPermissions*/);
params.setTraceMethod("installAsUser").setTraceCookie(System.identityHashCode(params));
msg.obj = params;
@@ -10482,10 +10475,9 @@
Slog.d(TAG, "Ephemeral install of " + packageName);
}
}
- final VerificationParams verifParams = new VerificationParams(
- null, sessionParams.originatingUri, sessionParams.referrerUri,
- sessionParams.originatingUid);
- verifParams.setInstallerUid(installerUid);
+ final VerificationInfo verificationInfo = new VerificationInfo(
+ sessionParams.originatingUri, sessionParams.referrerUri,
+ sessionParams.originatingUid, installerUid);
final OriginInfo origin;
if (stagedDir != null) {
@@ -10497,7 +10489,7 @@
final Message msg = mHandler.obtainMessage(INIT_COPY);
final InstallParams params = new InstallParams(origin, null, observer,
sessionParams.installFlags, installerPackageName, sessionParams.volumeUuid,
- verifParams, user, sessionParams.abiOverride,
+ verificationInfo, user, sessionParams.abiOverride,
sessionParams.grantedRuntimePermissions);
params.setTraceMethod("installStage").setTraceCookie(System.identityHashCode(params));
msg.obj = params;
@@ -11525,6 +11517,30 @@
}
}
+ static class VerificationInfo {
+ /** A constant used to indicate that a uid value is not present. */
+ public static final int NO_UID = -1;
+
+ /** URI referencing where the package was downloaded from. */
+ final Uri originatingUri;
+
+ /** HTTP referrer URI associated with the originatingURI. */
+ final Uri referrer;
+
+ /** UID of the application that the install request originated from. */
+ final int originatingUid;
+
+ /** UID of application requesting the install */
+ final int installerUid;
+
+ VerificationInfo(Uri originatingUri, Uri referrer, int originatingUid, int installerUid) {
+ this.originatingUri = originatingUri;
+ this.referrer = referrer;
+ this.originatingUid = originatingUid;
+ this.installerUid = installerUid;
+ }
+ }
+
class InstallParams extends HandlerParams {
final OriginInfo origin;
final MoveInfo move;
@@ -11532,15 +11548,15 @@
int installFlags;
final String installerPackageName;
final String volumeUuid;
- final VerificationParams verificationParams;
private InstallArgs mArgs;
private int mRet;
final String packageAbiOverride;
final String[] grantedRuntimePermissions;
+ final VerificationInfo verificationInfo;
InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
int installFlags, String installerPackageName, String volumeUuid,
- VerificationParams verificationParams, UserHandle user, String packageAbiOverride,
+ VerificationInfo verificationInfo, UserHandle user, String packageAbiOverride,
String[] grantedPermissions) {
super(user);
this.origin = origin;
@@ -11549,7 +11565,7 @@
this.installFlags = installFlags;
this.installerPackageName = installerPackageName;
this.volumeUuid = volumeUuid;
- this.verificationParams = verificationParams;
+ this.verificationInfo = verificationInfo;
this.packageAbiOverride = packageAbiOverride;
this.grantedRuntimePermissions = grantedPermissions;
}
@@ -11792,26 +11808,22 @@
verification.putExtra(PackageManager.EXTRA_VERIFICATION_VERSION_CODE,
pkgLite.versionCode);
- if (verificationParams != null) {
- if (verificationParams.getVerificationURI() != null) {
- verification.putExtra(PackageManager.EXTRA_VERIFICATION_URI,
- verificationParams.getVerificationURI());
- }
- if (verificationParams.getOriginatingURI() != null) {
+ if (verificationInfo != null) {
+ if (verificationInfo.originatingUri != null) {
verification.putExtra(Intent.EXTRA_ORIGINATING_URI,
- verificationParams.getOriginatingURI());
+ verificationInfo.originatingUri);
}
- if (verificationParams.getReferrer() != null) {
+ if (verificationInfo.referrer != null) {
verification.putExtra(Intent.EXTRA_REFERRER,
- verificationParams.getReferrer());
+ verificationInfo.referrer);
}
- if (verificationParams.getOriginatingUid() >= 0) {
+ if (verificationInfo.originatingUid >= 0) {
verification.putExtra(Intent.EXTRA_ORIGINATING_UID,
- verificationParams.getOriginatingUid());
+ verificationInfo.originatingUid);
}
- if (verificationParams.getInstallerUid() >= 0) {
+ if (verificationInfo.installerUid >= 0) {
verification.putExtra(PackageManager.EXTRA_VERIFICATION_INSTALLER_UID,
- verificationParams.getInstallerUid());
+ verificationInfo.installerUid);
}
}
@@ -18357,7 +18369,8 @@
final Message msg = mHandler.obtainMessage(INIT_COPY);
final OriginInfo origin = OriginInfo.fromExistingFile(codeFile);
final InstallParams params = new InstallParams(origin, move, installObserver, installFlags,
- installerPackageName, volumeUuid, null, user, packageAbiOverride, null);
+ installerPackageName, volumeUuid, null /*verificationInfo*/, user,
+ packageAbiOverride, null);
params.setTraceMethod("movePackage").setTraceCookie(System.identityHashCode(params));
msg.obj = params;
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 8e891bf..8b250f4 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -151,6 +151,8 @@
private ArrayList<UsageStatsManagerInternal.AppIdleStateChangeListener>
mPackageAccessListeners = new ArrayList<>();
+ private List<String> mCarrierPrivilegedApps;
+
public UsageStatsService(Context context) {
super(context);
}
@@ -170,10 +172,18 @@
+ mUsageStatsDir.getAbsolutePath());
}
- IntentFilter userActions = new IntentFilter(Intent.ACTION_USER_REMOVED);
- userActions.addAction(Intent.ACTION_USER_STARTED);
- getContext().registerReceiverAsUser(new UserActionsReceiver(), UserHandle.ALL, userActions,
- null, null);
+ IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
+ filter.addAction(Intent.ACTION_USER_STARTED);
+ getContext().registerReceiverAsUser(new UserActionsReceiver(), UserHandle.ALL, filter,
+ null, mHandler);
+
+ IntentFilter packageFilter = new IntentFilter();
+ packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+ packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+ packageFilter.addDataScheme("package");
+
+ getContext().registerReceiverAsUser(new PackageReceiver(), UserHandle.ALL, packageFilter,
+ null, mHandler);
mAppIdleEnabled = getContext().getResources().getBoolean(
com.android.internal.R.bool.config_enableAutoPowerModes);
@@ -232,15 +242,15 @@
}
private class UserActionsReceiver extends BroadcastReceiver {
-
@Override
public void onReceive(Context context, Intent intent) {
final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
- if (Intent.ACTION_USER_REMOVED.equals(intent.getAction())) {
+ final String action = intent.getAction();
+ if (Intent.ACTION_USER_REMOVED.equals(action)) {
if (userId >= 0) {
mHandler.obtainMessage(MSG_REMOVE_USER, userId, 0).sendToTarget();
}
- } else if (Intent.ACTION_USER_STARTED.equals(intent.getAction())) {
+ } else if (Intent.ACTION_USER_STARTED.equals(action)) {
if (userId >=0) {
postCheckIdleStates(userId);
}
@@ -248,6 +258,17 @@
}
}
+ private class PackageReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (Intent.ACTION_PACKAGE_ADDED.equals(action)
+ || Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
+ clearCarrierPrivilegedApps();
+ }
+ }
+ }
+
private class DeviceStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@@ -890,9 +911,30 @@
}
private boolean isCarrierApp(String packageName) {
- TelephonyManager telephonyManager = getContext().getSystemService(TelephonyManager.class);
- return telephonyManager.checkCarrierPrivilegesForPackageAnyPhone(packageName)
- == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
+ synchronized (mLock) {
+ if (mCarrierPrivilegedApps == null) {
+ fetchCarrierPrivilegedAppsLocked();
+ }
+ }
+ return mCarrierPrivilegedApps.contains(packageName);
+ }
+
+ void clearCarrierPrivilegedApps() {
+ if (DEBUG) {
+ Slog.i(TAG, "Clearing carrier privileged apps list");
+ }
+ synchronized (mLock) {
+ mCarrierPrivilegedApps = null; // Need to be refetched.
+ }
+ }
+
+ private void fetchCarrierPrivilegedAppsLocked() {
+ TelephonyManager telephonyManager =
+ getContext().getSystemService(TelephonyManager.class);
+ mCarrierPrivilegedApps = telephonyManager.getPackagesWithCarrierPrivileges();
+ if (DEBUG) {
+ Slog.d(TAG, "apps with carrier privilege " + mCarrierPrivilegedApps);
+ }
}
private boolean isActiveNetworkScorer(String packageName) {
@@ -963,6 +1005,9 @@
}
pw.println();
+ pw.println("Carrier privileged apps: " + mCarrierPrivilegedApps);
+
+ pw.println();
pw.println("Settings:");
pw.print(" mAppIdleDurationMillis=");
@@ -1257,6 +1302,17 @@
}
@Override
+ public void onCarrierPrivilegedAppsChanged() {
+ if (DEBUG) {
+ Slog.i(TAG, "Carrier privileged apps changed");
+ }
+ getContext().enforceCallingOrSelfPermission(
+ android.Manifest.permission.BIND_CARRIER_SERVICES,
+ "onCarrierPrivilegedAppsChanged can only be called by privileged apps.");
+ UsageStatsService.this.clearCarrierPrivilegedApps();
+ }
+
+ @Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
!= PackageManager.PERMISSION_GRANTED) {
diff --git a/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java b/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java
index a790914..6a8c1cb 100644
--- a/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java
+++ b/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java
@@ -240,8 +240,8 @@
} finally {
args.recycle();
}
+ break;
}
-
case MSG_ON_CONNECTION_EVENT: {
SomeArgs args = (SomeArgs) msg.obj;
try {
@@ -249,6 +249,7 @@
} finally {
args.recycle();
}
+ break;
}
}
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index dc9b6e5..e90be91 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -47,6 +47,7 @@
import java.io.FileInputStream;
import java.io.IOException;
+import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -4060,6 +4061,21 @@
}
/** @hide */
+ public List<String> getPackagesWithCarrierPrivileges() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.getPackagesWithCarrierPrivileges();
+ }
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "getPackagesWithCarrierPrivileges RemoteException", ex);
+ } catch (NullPointerException ex) {
+ Rlog.e(TAG, "getPackagesWithCarrierPrivileges NPE", ex);
+ }
+ return Collections.EMPTY_LIST;
+ }
+
+ /** @hide */
@SystemApi
public void dial(String number) {
try {
diff --git a/telephony/java/com/android/ims/ImsReasonInfo.java b/telephony/java/com/android/ims/ImsReasonInfo.java
index c909c6d..4aa5b98 100644
--- a/telephony/java/com/android/ims/ImsReasonInfo.java
+++ b/telephony/java/com/android/ims/ImsReasonInfo.java
@@ -249,12 +249,33 @@
public static final int CODE_SUPP_SVC_REINVITE_COLLISION = 1203;
/**
+ * DPD Procedure received no response or send failed
+ */
+ public static final int CODE_IWLAN_DPD_FAILURE = 1300;
+
+ /**
+ * Establishment of the ePDG Tunnel Failed
+ */
+ public static final int CODE_EPDG_TUNNEL_ESTABLISH_FAILURE = 1400;
+
+ /**
+ * Re-keying of the ePDG Tunnel Failed; may not always result in teardown
+ */
+ public static final int CODE_EPDG_TUNNEL_REKEY_FAILURE = 1401;
+
+ /**
+ * Connection to the packet gateway is lost
+ */
+ public static final int CODE_EPDG_TUNNEL_LOST_CONNECTION = 1402;
+
+ /**
* Network string error messages.
* mExtraMessage may have these values.
*/
public static final String EXTRA_MSG_SERVICE_NOT_AUTHORIZED
= "Forbidden. Not Authorized for Service";
+
// For main reason code
public int mCode;
// For the extra code value; it depends on the code value.
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 99b5ff1..2727319 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1037,4 +1037,9 @@
* @return {@code true} if the vibration is set for this PhoneAccount, {@code false} otherwise.
*/
boolean isVoicemailVibrationEnabled(in PhoneAccountHandle accountHandle);
+
+ /**
+ * Returns a list of packages that have carrier privileges.
+ */
+ List<String> getPackagesWithCarrierPrivileges();
}
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index da43460..c34d4a9 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -25,7 +25,6 @@
import android.content.IntentSender;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
-import android.content.pm.ContainerEncryptionParams;
import android.content.pm.EphemeralApplicationInfo;
import android.content.pm.FeatureInfo;
import android.content.pm.IPackageDataObserver;
@@ -44,7 +43,6 @@
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
@@ -602,14 +600,6 @@
throw new UnsupportedOperationException();
}
- /** @hide */
- @Override
- public void installPackageAsUser(Uri packageURI, PackageInstallObserver observer,
- int flags, String installerPackageName, int userId) {
- throw new UnsupportedOperationException();
- }
-
-
@Override
public void setInstallerPackageName(String targetPackage,
String installerPackageName) {
@@ -873,26 +863,6 @@
* @hide
*/
@Override
- public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer,
- int flags, String installerPackageName, Uri verificationURI,
- ContainerEncryptionParams encryptionParams) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * @hide
- */
- @Override
- public void installPackageWithVerificationAndEncryption(Uri packageURI,
- IPackageInstallObserver observer, int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * @hide
- */
- @Override
public boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden,
UserHandle user) {
return false;
@@ -1024,27 +994,6 @@
* @hide
*/
@Override
- public void installPackageWithVerification(Uri packageURI,
- PackageInstallObserver observer, int flags, String installerPackageName,
- Uri verificationURI,
- ContainerEncryptionParams encryptionParams) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * @hide
- */
- @Override
- public void installPackageWithVerificationAndEncryption(Uri packageURI,
- PackageInstallObserver observer, int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * @hide
- */
- @Override
public void addCrossProfileIntentFilter(IntentFilter filter, int sourceUserId, int targetUserId,
int flags) {
throw new UnsupportedOperationException();
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java
index fcfbad2..85e2610 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java
@@ -24,7 +24,6 @@
import android.content.IntentSender;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
-import android.content.pm.ContainerEncryptionParams;
import android.content.pm.EphemeralApplicationInfo;
import android.content.pm.FeatureInfo;
import android.content.pm.IPackageDataObserver;
@@ -43,7 +42,6 @@
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
@@ -555,40 +553,11 @@
}
@Override
- public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer,
- int flags, String installerPackageName, Uri verificationURI,
- ContainerEncryptionParams encryptionParams) {
- }
-
- @Override
- public void installPackageWithVerificationAndEncryption(Uri packageURI,
- IPackageInstallObserver observer, int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
- }
-
- @Override
public void installPackage(Uri packageURI, PackageInstallObserver observer, int flags,
String installerPackageName) {
}
@Override
- public void installPackageAsUser(Uri packageURI, PackageInstallObserver observer,int flags,
- String installerPackageName, int userId) {
- }
-
- @Override
- public void installPackageWithVerification(Uri packageURI, PackageInstallObserver observer,
- int flags, String installerPackageName, Uri verificationURI,
- ContainerEncryptionParams encryptionParams) {
- }
-
- @Override
- public void installPackageWithVerificationAndEncryption(Uri packageURI,
- PackageInstallObserver observer, int flags, String installerPackageName,
- VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
- }
-
- @Override
public int installExistingPackage(String packageName) throws NameNotFoundException {
return 0;
}