Merge "Fix the heap-after-use in DurationAnomalyTracker" into pi-dev
diff --git a/Android.bp b/Android.bp
index 037c29c..be83210 100644
--- a/Android.bp
+++ b/Android.bp
@@ -169,8 +169,6 @@
"core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl",
"core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl",
"core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl",
- "core/java/android/hardware/location/IFusedLocationHardware.aidl",
- "core/java/android/hardware/location/IFusedLocationHardwareSink.aidl",
"core/java/android/hardware/location/IGeofenceHardware.aidl",
"core/java/android/hardware/location/IGeofenceHardwareCallback.aidl",
"core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl",
@@ -409,7 +407,6 @@
"location/java/android/location/IBatchedLocationCallback.aidl",
"location/java/android/location/ICountryDetector.aidl",
"location/java/android/location/ICountryListener.aidl",
- "location/java/android/location/IFusedProvider.aidl",
"location/java/android/location/IGeocodeProvider.aidl",
"location/java/android/location/IGeofenceProvider.aidl",
"location/java/android/location/IGnssStatusListener.aidl",
diff --git a/Android.mk b/Android.mk
index ee8fbe0..e2f88e8 100644
--- a/Android.mk
+++ b/Android.mk
@@ -861,42 +861,39 @@
# ==== hiddenapi lists =======================================
-# Copy light and dark greylist over into the build folder.
+# Copy blacklist and light greylist over into the build folder.
# This is for ART buildbots which need to mock these lists and have alternative
# rules for building them. Other rules in the build system should depend on the
# files in the build folder.
+$(eval $(call copy-one-file,frameworks/base/config/hiddenapi-blacklist.txt,\
+ $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST)))
+
# Temporarily merge light greylist from two files. Vendor list will become dark
# grey once we remove the UI toast.
$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): frameworks/base/config/hiddenapi-light-greylist.txt \
frameworks/base/config/hiddenapi-vendor-list.txt
sort $^ > $@
-$(eval $(call copy-one-file,frameworks/base/config/hiddenapi-dark-greylist.txt,\
- $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST)))
-
# Generate dark greylist as private API minus (blacklist plus light greylist).
-$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): PRIVATE_API := $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE)
-$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): LIGHT_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST)
-$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): DARK_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST)
-$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) \
- $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) \
- $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST)
- if [ ! -z "`comm -12 <(sort $(LIGHT_GREYLIST)) <(sort $(DARK_GREYLIST))`" ]; then \
- echo "There should be no overlap between $(LIGHT_GREYLIST) and $(DARK_GREYLIST)" 1>&2; \
- comm -12 <(sort $(LIGHT_GREYLIST)) <(sort $(DARK_GREYLIST)) 1>&2; \
+$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST): PRIVATE_API := $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE)
+$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST): BLACKLIST := $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST)
+$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST): LIGHT_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST)
+$(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST): $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) \
+ $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST) \
+ $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST)
+ if [ ! -z "`comm -12 <(sort $(BLACKLIST)) <(sort $(LIGHT_GREYLIST))`" ]; then \
+ echo "There should be no overlap between $(BLACKLIST) and $(LIGHT_GREYLIST)" 1>&2; \
exit 1; \
+ elif [ ! -z "`comm -13 <(sort $(PRIVATE_API)) <(sort $(BLACKLIST))`" ]; then \
+ echo "$(BLACKLIST) must be a subset of $(PRIVATE_API)" 1>&2; \
+ exit 2; \
elif [ ! -z "`comm -13 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST))`" ]; then \
echo "$(LIGHT_GREYLIST) must be a subset of $(PRIVATE_API)" 1>&2; \
- comm -13 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST)) 1>&2; \
- exit 2; \
- elif [ ! -z "`comm -13 <(sort $(PRIVATE_API)) <(sort $(DARK_GREYLIST))`" ]; then \
- echo "$(DARK_GREYLIST) must be a subset of $(PRIVATE_API)" 1>&2; \
- comm -13 <(sort $(PRIVATE_API)) <(sort $(DARK_GREYLIST)) 1>&2; \
exit 3; \
fi
- comm -23 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST) $(DARK_GREYLIST)) > $@
+ comm -23 <(sort $(PRIVATE_API)) <(sort $(BLACKLIST) $(LIGHT_GREYLIST)) > $@
# Include subdirectory makefiles
# ============================================================
diff --git a/api/current.txt b/api/current.txt
index 6a9f00e..999a6fb 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -21818,7 +21818,6 @@
method public void unregisterGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback);
method public void unregisterGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback);
method public void unregisterGnssStatusCallback(android.location.GnssStatus.Callback);
- field public static final java.lang.String GNSS_HARDWARE_MODEL_NAME_UNKNOWN = "Model Name Unknown";
field public static final java.lang.String GPS_PROVIDER = "gps";
field public static final java.lang.String KEY_LOCATION_CHANGED = "location";
field public static final java.lang.String KEY_PROVIDER_ENABLED = "providerEnabled";
@@ -41422,7 +41421,7 @@
method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
field public static final int HANDOVER_FAILURE_DEST_APP_REJECTED = 1; // 0x1
field public static final int HANDOVER_FAILURE_NOT_SUPPORTED = 2; // 0x2
- field public static final int HANDOVER_FAILURE_ONGOING_EMERG_CALL = 4; // 0x4
+ field public static final int HANDOVER_FAILURE_ONGOING_EMERGENCY_CALL = 4; // 0x4
field public static final int HANDOVER_FAILURE_UNKNOWN = 5; // 0x5
field public static final int HANDOVER_FAILURE_USER_REJECTED = 3; // 0x3
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 6d43d27..04d78a1 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -283,6 +283,7 @@
field public static final java.lang.String OPSTR_GET_ACCOUNTS = "android:get_accounts";
field public static final java.lang.String OPSTR_GPS = "android:gps";
field public static final java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
+ field public static final java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
field public static final java.lang.String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
field public static final java.lang.String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
field public static final java.lang.String OPSTR_PLAY_AUDIO = "android:play_audio";
@@ -4236,7 +4237,7 @@
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean);
method public static void resetToDefaults(android.content.ContentResolver, java.lang.String);
- field public static final java.lang.String AUTOFILL_COMPAT_ALLOWED_PACKAGES = "autofill_compat_allowed_packages";
+ field public static final java.lang.String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
field public static final java.lang.String CARRIER_APP_NAMES = "carrier_app_names";
field public static final java.lang.String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
field public static final java.lang.String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus";
@@ -4371,6 +4372,7 @@
method public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public int getRecoveryStatus(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public java.util.Map<java.lang.String, java.security.cert.X509Certificate> getRootCertificates();
method public java.security.Key importKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
method public deprecated void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method public void initRecoveryService(java.lang.String, byte[], byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
@@ -4388,9 +4390,11 @@
public class RecoverySession implements java.lang.AutoCloseable {
method public void close();
- method public java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
+ method public java.util.Map<java.lang.String, java.security.Key> recoverKeyChainSnapshot(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
+ method public deprecated java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
- method public byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public byte[] start(java.lang.String, java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
}
public class SessionExpiredException extends java.security.GeneralSecurityException {
diff --git a/api/test-current.txt b/api/test-current.txt
index 70e3cf3..852bebf 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -79,6 +79,7 @@
field public static final java.lang.String OPSTR_GET_ACCOUNTS = "android:get_accounts";
field public static final java.lang.String OPSTR_GPS = "android:gps";
field public static final java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
+ field public static final java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
field public static final java.lang.String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
field public static final java.lang.String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
field public static final java.lang.String OPSTR_PLAY_AUDIO = "android:play_audio";
@@ -570,7 +571,7 @@
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
- field public static final java.lang.String AUTOFILL_COMPAT_ALLOWED_PACKAGES = "autofill_compat_allowed_packages";
+ field public static final java.lang.String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
field public static final java.lang.String HIDDEN_API_BLACKLIST_EXEMPTIONS = "hidden_api_blacklist_exemptions";
field public static final java.lang.String LOCATION_GLOBAL_KILL_SWITCH = "location_global_kill_switch";
field public static final java.lang.String LOW_POWER_MODE = "low_power";
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index 525ddb3..79c0d71 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -138,7 +138,7 @@
# Enable sanitizer on eng builds
ifeq ($(TARGET_BUILD_VARIANT),eng)
LOCAL_CLANG := true
- LOCAL_SANITIZE := address unsigned-integer-overflow signed-integer-overflow
+ LOCAL_SANITIZE := address
endif
LOCAL_INIT_RC := statsd.rc
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 40eff4c..99611f4 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -23,6 +23,7 @@
import "frameworks/base/cmds/statsd/src/atom_field_options.proto";
import "frameworks/base/core/proto/android/app/enums.proto";
+import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/enums.proto";
import "frameworks/base/core/proto/android/os/enums.proto";
import "frameworks/base/core/proto/android/server/enums.proto";
@@ -362,7 +363,10 @@
}
optional State state = 3;
- // TODO: Consider adding the stopReason (int)
+ // The reason a job has stopped.
+ // This is only applicable when the state is FINISHED.
+ // The default value is CANCELED.
+ optional android.app.job.StopReasonEnum stop_reason = 4;
}
/**
diff --git a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
index 335ec4c..c9547cf 100644
--- a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
+++ b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
@@ -205,11 +205,12 @@
bool hasPendingEvent =
false; // has either a kStarted or kPaused event across bucket boundaries
// meaning we need to carry them over to the new bucket.
- for (auto it = mInfos.begin(); it != mInfos.end(); ++it) {
+ for (auto it = mInfos.begin(); it != mInfos.end();) {
if (it->second.state == DurationState::kStopped) {
// No need to keep buckets for events that were stopped before.
- mInfos.erase(it);
+ it = mInfos.erase(it);
} else {
+ ++it;
hasPendingEvent = true;
}
}
diff --git a/cmds/statsd/src/packages/UidMap.cpp b/cmds/statsd/src/packages/UidMap.cpp
index 3ba4b7a..1cb20bc 100644
--- a/cmds/statsd/src/packages/UidMap.cpp
+++ b/cmds/statsd/src/packages/UidMap.cpp
@@ -365,7 +365,8 @@
count++;
proto->write(FIELD_TYPE_INT64 | FIELD_ID_SNAPSHOT_TIMESTAMP,
(long long)record.timestampNs);
- proto->write(FIELD_TYPE_MESSAGE | FIELD_ID_SNAPSHOT_PACKAGE_INFO, record.bytes.data());
+ proto->write(FIELD_TYPE_MESSAGE | FIELD_ID_SNAPSHOT_PACKAGE_INFO, record.bytes.data(),
+ record.bytes.size());
proto->end(snapshotsToken);
}
}
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 40b266f..87fb998 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -3375,8 +3375,6 @@
HPLandroid/location/ICountryListener$Stub;->asBinder()Landroid/os/IBinder;
HPLandroid/location/ICountryListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ICountryListener;
HPLandroid/location/ICountryListener;->onCountryDetected(Landroid/location/Country;)V
-HPLandroid/location/IFusedProvider$Stub;-><init>()V
-HPLandroid/location/IFusedProvider;->onFusedLocationHardwareChange(Landroid/hardware/location/IFusedLocationHardware;)V
HPLandroid/location/IGeocodeProvider$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
HPLandroid/location/IGeocodeProvider$Stub$Proxy;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
HPLandroid/location/IGeocodeProvider$Stub;-><init>()V
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index e238f06..e4df85b 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -823,7 +823,6 @@
Landroid/location/Country;->getSource()I
Landroid/location/GeocoderParams;->getClientPackage()Ljava/lang/String;
Landroid/location/GeocoderParams;->getLocale()Ljava/util/Locale;
-Landroid/location/IFusedProvider$Stub;-><init>()V
Landroid/location/IGeocodeProvider$Stub;-><init>()V
Landroid/location/IGeofenceProvider$Stub;-><init>()V
Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager;
diff --git a/config/hiddenapi-vendor-list.txt b/config/hiddenapi-vendor-list.txt
index fe9a5db..0230ad9 100644
--- a/config/hiddenapi-vendor-list.txt
+++ b/config/hiddenapi-vendor-list.txt
@@ -113,7 +113,6 @@
Landroid/hardware/display/DisplayManagerGlobal;->getRealDisplay(I)Landroid/view/Display;
Landroid/hardware/location/GeofenceHardware;-><init>(Landroid/hardware/location/IGeofenceHardware;)V
Landroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
-Landroid/location/IFusedProvider;->onFusedLocationHardwareChange(Landroid/hardware/location/IFusedLocationHardware;)V
Landroid/location/IGeocodeProvider;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
Landroid/location/IGeocodeProvider;->getFromLocationName(Ljava/lang/String;DDDDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
Landroid/location/IGeofenceProvider;->setGeofenceHardware(Landroid/hardware/location/IGeofenceHardware;)V
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 4690211..ea8c71c 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -270,8 +270,10 @@
public static final int OP_BIND_ACCESSIBILITY_SERVICE = 73;
/** @hide Continue handover of a call from another app */
public static final int OP_ACCEPT_HANDOVER = 74;
+ /** @hide Create and Manage IPsec Tunnels */
+ public static final int OP_MANAGE_IPSEC_TUNNELS = 75;
/** @hide */
- public static final int _NUM_OP = 75;
+ public static final int _NUM_OP = 76;
/** Access to coarse location information. */
public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -507,6 +509,9 @@
@SystemApi @TestApi
public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE =
"android:bind_accessibility_service";
+ /** @hide */
+ @SystemApi @TestApi
+ public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
// Warning: If an permission is added here it also has to be added to
// com.android.packageinstaller.permission.utils.EventLogger
@@ -641,6 +646,7 @@
OP_REQUEST_DELETE_PACKAGES,
OP_BIND_ACCESSIBILITY_SERVICE,
OP_ACCEPT_HANDOVER,
+ OP_MANAGE_IPSEC_TUNNELS,
};
/**
@@ -722,6 +728,7 @@
OPSTR_REQUEST_DELETE_PACKAGES,
OPSTR_BIND_ACCESSIBILITY_SERVICE,
OPSTR_ACCEPT_HANDOVER,
+ OPSTR_MANAGE_IPSEC_TUNNELS,
};
/**
@@ -804,6 +811,7 @@
"REQUEST_DELETE_PACKAGES",
"BIND_ACCESSIBILITY_SERVICE",
"ACCEPT_HANDOVER",
+ "MANAGE_IPSEC_TUNNELS",
};
/**
@@ -886,6 +894,7 @@
Manifest.permission.REQUEST_DELETE_PACKAGES,
Manifest.permission.BIND_ACCESSIBILITY_SERVICE,
Manifest.permission.ACCEPT_HANDOVER,
+ null, // no permission for OP_MANAGE_IPSEC_TUNNELS
};
/**
@@ -969,6 +978,7 @@
null, // REQUEST_DELETE_PACKAGES
null, // OP_BIND_ACCESSIBILITY_SERVICE
null, // ACCEPT_HANDOVER
+ null, // MANAGE_IPSEC_TUNNELS
};
/**
@@ -1051,6 +1061,7 @@
false, // OP_REQUEST_DELETE_PACKAGES
false, // OP_BIND_ACCESSIBILITY_SERVICE
false, // ACCEPT_HANDOVER
+ false, // MANAGE_IPSEC_HANDOVERS
};
/**
@@ -1132,6 +1143,7 @@
AppOpsManager.MODE_ALLOWED, // REQUEST_DELETE_PACKAGES
AppOpsManager.MODE_ALLOWED, // OP_BIND_ACCESSIBILITY_SERVICE
AppOpsManager.MODE_ALLOWED, // ACCEPT_HANDOVER
+ AppOpsManager.MODE_ERRORED, // MANAGE_IPSEC_TUNNELS
};
/**
@@ -1217,6 +1229,7 @@
false, // OP_REQUEST_DELETE_PACKAGES
false, // OP_BIND_ACCESSIBILITY_SERVICE
false, // ACCEPT_HANDOVER
+ false, // MANAGE_IPSEC_TUNNELS
};
/**
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index c6568e1..5d21be5 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -2631,8 +2631,8 @@
if (!Objects.equals(firstRs[j].getLabel(), secondRs[j].getLabel())) {
return true;
}
- CharSequence[] firstCs = firstRs[i].getChoices();
- CharSequence[] secondCs = secondRs[i].getChoices();
+ CharSequence[] firstCs = firstRs[j].getChoices();
+ CharSequence[] secondCs = secondRs[j].getChoices();
if (firstCs == null) {
firstCs = new CharSequence[0];
}
diff --git a/core/java/android/app/job/JobParameters.java b/core/java/android/app/job/JobParameters.java
index c71bf2e..d67f11b 100644
--- a/core/java/android/app/job/JobParameters.java
+++ b/core/java/android/app/job/JobParameters.java
@@ -36,15 +36,16 @@
public class JobParameters implements Parcelable {
/** @hide */
- public static final int REASON_CANCELED = 0;
+ public static final int REASON_CANCELED = JobProtoEnums.STOP_REASON_CANCELLED; // 0.
/** @hide */
- public static final int REASON_CONSTRAINTS_NOT_SATISFIED = 1;
+ public static final int REASON_CONSTRAINTS_NOT_SATISFIED =
+ JobProtoEnums.STOP_REASON_CONSTRAINTS_NOT_SATISFIED; //1.
/** @hide */
- public static final int REASON_PREEMPT = 2;
+ public static final int REASON_PREEMPT = JobProtoEnums.STOP_REASON_PREEMPT; // 2.
/** @hide */
- public static final int REASON_TIMEOUT = 3;
+ public static final int REASON_TIMEOUT = JobProtoEnums.STOP_REASON_TIMEOUT; // 3.
/** @hide */
- public static final int REASON_DEVICE_IDLE = 4;
+ public static final int REASON_DEVICE_IDLE = JobProtoEnums.STOP_REASON_DEVICE_IDLE; // 4.
/** @hide */
public static String getReasonName(int reason) {
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index ce7d3af..440103a 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -2464,8 +2464,9 @@
* @param account the account to specify in the sync
* @param authority the provider to specify in the sync request
* @param extras extra parameters to go along with the sync request
- * @param pollFrequency how frequently the sync should be performed, in seconds. A minimum value
- * of 1 hour is enforced.
+ * @param pollFrequency how frequently the sync should be performed, in seconds.
+ * On Android API level 24 and above, a minmam interval of 15 minutes is enforced.
+ * On previous versions, the minimum interval is 1 hour.
* @throws IllegalArgumentException if an illegal extra was set or if any of the parameters
* are null.
*/
diff --git a/core/java/android/hardware/location/IFusedLocationHardware.aidl b/core/java/android/hardware/location/IFusedLocationHardware.aidl
deleted file mode 100644
index 2ea4d23..0000000
--- a/core/java/android/hardware/location/IFusedLocationHardware.aidl
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2013, 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/license/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.hardware.location;
-
-import android.hardware.location.IFusedLocationHardwareSink;
-import android.location.FusedBatchOptions;
-
-/**
- * Fused Location hardware interface.
- * This interface is the basic set of supported functionality by Fused Hardware
- * modules that offer Location batching capabilities.
- *
- * @hide
- */
-interface IFusedLocationHardware {
- /**
- * Registers a sink with the Location Hardware object.
- *
- * @param eventSink The sink to register.
- */
- void registerSink(in IFusedLocationHardwareSink eventSink) = 0;
-
- /**
- * Unregisters a sink with the Location Hardware object.
- *
- * @param eventSink The sink to unregister.
- */
- void unregisterSink(in IFusedLocationHardwareSink eventSink) = 1;
-
- /**
- * Provides access to the batch size available in Hardware.
- *
- * @return The batch size the hardware supports.
- */
- int getSupportedBatchSize() = 2;
-
- /**
- * Requests the Hardware to start batching locations.
- *
- * @param id An Id associated with the request.
- * @param batchOptions The options required for batching.
- *
- * @throws RuntimeException if the request Id exists.
- */
- void startBatching(in int id, in FusedBatchOptions batchOptions) = 3;
-
- /**
- * Requests the Hardware to stop batching for the given Id.
- *
- * @param id The request that needs to be stopped.
- * @throws RuntimeException if the request Id is unknown.
- */
- void stopBatching(in int id) = 4;
-
- /**
- * Updates a batching operation in progress.
- *
- * @param id The Id of the operation to update.
- * @param batchOptions The options to apply to the given operation.
- *
- * @throws RuntimeException if the Id of the request is unknown.
- */
- void updateBatchingOptions(in int id, in FusedBatchOptions batchOptions) = 5;
-
- /**
- * Requests the most recent locations available in Hardware.
- * This operation does not dequeue the locations, so still other batching
- * events will continue working.
- *
- * @param batchSizeRequested The number of locations requested.
- */
- void requestBatchOfLocations(in int batchSizeRequested) = 6;
-
- /**
- * Flags if the Hardware supports injection of diagnostic data.
- *
- * @return True if data injection is supported, false otherwise.
- */
- boolean supportsDiagnosticDataInjection() = 7;
-
- /**
- * Injects diagnostic data into the Hardware subsystem.
- *
- * @param data The data to inject.
- * @throws RuntimeException if injection is not supported.
- */
- void injectDiagnosticData(in String data) = 8;
-
- /**
- * Flags if the Hardware supports injection of device context information.
- *
- * @return True if device context injection is supported, false otherwise.
- */
- boolean supportsDeviceContextInjection() = 9;
-
- /**
- * Injects device context information into the Hardware subsystem.
- *
- * @param deviceEnabledContext The context to inject.
- * @throws RuntimeException if injection is not supported.
- */
- void injectDeviceContext(in int deviceEnabledContext) = 10;
-
- /**
- * Requests all batched locations currently available in Hardware
- * and clears the buffer. Any subsequent calls will not return any
- * of the locations returned in this call.
- */
- void flushBatchedLocations() = 11;
-
- /**
- * Returns the version of this FLP HAL implementation.
- */
- int getVersion() = 12;
-}
diff --git a/core/java/android/hardware/location/IFusedLocationHardwareSink.aidl b/core/java/android/hardware/location/IFusedLocationHardwareSink.aidl
deleted file mode 100644
index a7dd035..0000000
--- a/core/java/android/hardware/location/IFusedLocationHardwareSink.aidl
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2013, 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/license/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.hardware.location;
-
-import android.location.Location;
-
-/**
- * Fused Location hardware event sink interface.
- * This interface defines the set of events that the FusedLocationHardware provides.
- *
- * @hide
- */
-oneway interface IFusedLocationHardwareSink {
- /**
- * Event generated when a batch of location information is available.
- *
- * @param locations The batch of location information available.
- */
- void onLocationAvailable(in Location[] locations) = 0;
-
- /**
- * Event generated from FLP HAL to provide diagnostic data to the platform.
- *
- * @param data The diagnostic data provided by FLP HAL.
- */
- void onDiagnosticDataAvailable(in String data) = 1;
-
- /**
- * Event generated from FLP HAL to provide a mask of supported
- * capabilities. Should be called immediatly after init.
- */
- void onCapabilities(int capabilities) = 2;
-
- /**
- * Event generated from FLP HAL when the status of location batching
- * changes (location is successful/unsuccessful).
- */
- void onStatusChanged(int status) = 3;
-}
diff --git a/core/java/android/net/IpSecAlgorithm.java b/core/java/android/net/IpSecAlgorithm.java
index f4b328e..57f0588 100644
--- a/core/java/android/net/IpSecAlgorithm.java
+++ b/core/java/android/net/IpSecAlgorithm.java
@@ -129,7 +129,7 @@
* @param algorithm name of the algorithm.
* @param key key padded to a multiple of 8 bits.
*/
- public IpSecAlgorithm(@AlgorithmName String algorithm, @NonNull byte[] key) {
+ public IpSecAlgorithm(@NonNull @AlgorithmName String algorithm, @NonNull byte[] key) {
this(algorithm, key, key.length * 8);
}
@@ -144,7 +144,8 @@
* @param key key padded to a multiple of 8 bits.
* @param truncLenBits number of bits of output hash to use.
*/
- public IpSecAlgorithm(@AlgorithmName String algorithm, @NonNull byte[] key, int truncLenBits) {
+ public IpSecAlgorithm(
+ @NonNull @AlgorithmName String algorithm, @NonNull byte[] key, int truncLenBits) {
mName = algorithm;
mKey = key.clone();
mTruncLenBits = truncLenBits;
@@ -152,11 +153,13 @@
}
/** Get the algorithm name */
+ @NonNull
public String getName() {
return mName;
}
/** Get the key for this algorithm */
+ @NonNull
public byte[] getKey() {
return mKey.clone();
}
@@ -270,6 +273,7 @@
}
@Override
+ @NonNull
public String toString() {
return new StringBuilder()
.append("{mName=")
diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java
index cb4299e..4157845 100644
--- a/core/java/android/net/IpSecManager.java
+++ b/core/java/android/net/IpSecManager.java
@@ -253,8 +253,9 @@
* @throws {@link #ResourceUnavailableException} indicating that too many SPIs are
* currently allocated for this user
*/
- public SecurityParameterIndex allocateSecurityParameterIndex(InetAddress destinationAddress)
- throws ResourceUnavailableException {
+ @NonNull
+ public SecurityParameterIndex allocateSecurityParameterIndex(
+ @NonNull InetAddress destinationAddress) throws ResourceUnavailableException {
try {
return new SecurityParameterIndex(
mService,
@@ -280,8 +281,9 @@
* @throws {@link #SpiUnavailableException} indicating that the requested SPI could not be
* reserved
*/
+ @NonNull
public SecurityParameterIndex allocateSecurityParameterIndex(
- InetAddress destinationAddress, int requestedSpi)
+ @NonNull InetAddress destinationAddress, int requestedSpi)
throws SpiUnavailableException, ResourceUnavailableException {
if (requestedSpi == IpSecManager.INVALID_SECURITY_PARAMETER_INDEX) {
throw new IllegalArgumentException("Requested SPI must be a valid (non-zero) SPI");
@@ -318,9 +320,8 @@
* @param transform a transport mode {@code IpSecTransform}
* @throws IOException indicating that the transform could not be applied
*/
- public void applyTransportModeTransform(
- Socket socket, @PolicyDirection int direction, IpSecTransform transform)
- throws IOException {
+ public void applyTransportModeTransform(@NonNull Socket socket,
+ @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
applyTransportModeTransform(socket.getFileDescriptor$(), direction, transform);
}
@@ -353,9 +354,8 @@
* @param transform a transport mode {@code IpSecTransform}
* @throws IOException indicating that the transform could not be applied
*/
- public void applyTransportModeTransform(
- DatagramSocket socket, @PolicyDirection int direction, IpSecTransform transform)
- throws IOException {
+ public void applyTransportModeTransform(@NonNull DatagramSocket socket,
+ @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
applyTransportModeTransform(socket.getFileDescriptor$(), direction, transform);
}
@@ -388,9 +388,8 @@
* @param transform a transport mode {@code IpSecTransform}
* @throws IOException indicating that the transform could not be applied
*/
- public void applyTransportModeTransform(
- FileDescriptor socket, @PolicyDirection int direction, IpSecTransform transform)
- throws IOException {
+ public void applyTransportModeTransform(@NonNull FileDescriptor socket,
+ @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
// We dup() the FileDescriptor here because if we don't, then the ParcelFileDescriptor()
// constructor takes control and closes the user's FD when we exit the method.
try (ParcelFileDescriptor pfd = ParcelFileDescriptor.dup(socket)) {
@@ -413,8 +412,7 @@
* @param socket a socket that previously had a transform applied to it
* @throws IOException indicating that the transform could not be removed from the socket
*/
- public void removeTransportModeTransforms(Socket socket)
- throws IOException {
+ public void removeTransportModeTransforms(@NonNull Socket socket) throws IOException {
removeTransportModeTransforms(socket.getFileDescriptor$());
}
@@ -431,8 +429,7 @@
* @param socket a socket that previously had a transform applied to it
* @throws IOException indicating that the transform could not be removed from the socket
*/
- public void removeTransportModeTransforms(DatagramSocket socket)
- throws IOException {
+ public void removeTransportModeTransforms(@NonNull DatagramSocket socket) throws IOException {
removeTransportModeTransforms(socket.getFileDescriptor$());
}
@@ -449,8 +446,7 @@
* @param socket a socket that previously had a transform applied to it
* @throws IOException indicating that the transform could not be removed from the socket
*/
- public void removeTransportModeTransforms(FileDescriptor socket)
- throws IOException {
+ public void removeTransportModeTransforms(@NonNull FileDescriptor socket) throws IOException {
try (ParcelFileDescriptor pfd = ParcelFileDescriptor.dup(socket)) {
mService.removeTransportModeTransforms(pfd);
} catch (RemoteException e) {
@@ -588,6 +584,7 @@
// safely usable for Encapsulation without allowing a user to possibly unbind from/close
// the port, which could potentially impact the traffic of the next user who binds to that
// socket.
+ @NonNull
public UdpEncapsulationSocket openUdpEncapsulationSocket(int port)
throws IOException, ResourceUnavailableException {
/*
@@ -617,6 +614,7 @@
// safely usable for Encapsulation without allowing a user to possibly unbind from/close
// the port, which could potentially impact the traffic of the next user who binds to that
// socket.
+ @NonNull
public UdpEncapsulationSocket openUdpEncapsulationSocket()
throws IOException, ResourceUnavailableException {
return new UdpEncapsulationSocket(mService, 0);
@@ -645,6 +643,7 @@
private int mResourceId = INVALID_RESOURCE_ID;
/** Get the underlying SPI held by this object. */
+ @NonNull
public String getInterfaceName() {
return mInterfaceName;
}
@@ -659,7 +658,7 @@
* @hide
*/
@SystemApi
- public void addAddress(LinkAddress address) throws IOException {
+ public void addAddress(@NonNull LinkAddress address) throws IOException {
try {
mService.addAddressToTunnelInterface(mResourceId, address);
} catch (RemoteException e) {
@@ -676,7 +675,7 @@
* @hide
*/
@SystemApi
- public void removeAddress(LinkAddress address) throws IOException {
+ public void removeAddress(@NonNull LinkAddress address) throws IOException {
try {
mService.removeAddressFromTunnelInterface(mResourceId, address);
} catch (RemoteException e) {
@@ -768,6 +767,7 @@
* @hide
*/
@SystemApi
+ @NonNull
@RequiresPermission(android.Manifest.permission.NETWORK_STACK)
public IpSecTunnelInterface createIpSecTunnelInterface(@NonNull InetAddress localAddress,
@NonNull InetAddress remoteAddress, @NonNull Network underlyingNetwork)
@@ -794,8 +794,8 @@
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.NETWORK_STACK)
- public void applyTunnelModeTransform(IpSecTunnelInterface tunnel,
- @PolicyDirection int direction, IpSecTransform transform) throws IOException {
+ public void applyTunnelModeTransform(@NonNull IpSecTunnelInterface tunnel,
+ @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
try {
mService.applyTunnelModeTransform(
tunnel.getResourceId(), direction, transform.getResourceId());
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index 60e96f9..cf58647 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -350,6 +350,7 @@
*
* @param algo {@link IpSecAlgorithm} specifying the encryption to be applied.
*/
+ @NonNull
public IpSecTransform.Builder setEncryption(@NonNull IpSecAlgorithm algo) {
// TODO: throw IllegalArgumentException if algo is not an encryption algorithm.
Preconditions.checkNotNull(algo);
@@ -364,6 +365,7 @@
*
* @param algo {@link IpSecAlgorithm} specifying the authentication to be applied.
*/
+ @NonNull
public IpSecTransform.Builder setAuthentication(@NonNull IpSecAlgorithm algo) {
// TODO: throw IllegalArgumentException if algo is not an authentication algorithm.
Preconditions.checkNotNull(algo);
@@ -384,6 +386,7 @@
* @param algo {@link IpSecAlgorithm} specifying the authenticated encryption algorithm to
* be applied.
*/
+ @NonNull
public IpSecTransform.Builder setAuthenticatedEncryption(@NonNull IpSecAlgorithm algo) {
Preconditions.checkNotNull(algo);
mConfig.setAuthenticatedEncryption(algo);
@@ -403,6 +406,7 @@
* @param remotePort the UDP port number of the remote host that will send and receive
* encapsulated traffic. In the case of IKEv2, this should be port 4500.
*/
+ @NonNull
public IpSecTransform.Builder setIpv4Encapsulation(
@NonNull IpSecManager.UdpEncapsulationSocket localSocket, int remotePort) {
Preconditions.checkNotNull(localSocket);
@@ -436,6 +440,7 @@
* collides with an existing transform
* @throws IOException indicating other errors
*/
+ @NonNull
public IpSecTransform buildTransportModeTransform(
@NonNull InetAddress sourceAddress,
@NonNull IpSecManager.SecurityParameterIndex spi)
@@ -472,6 +477,7 @@
* @hide
*/
@SystemApi
+ @NonNull
@RequiresPermission(android.Manifest.permission.NETWORK_STACK)
public IpSecTransform buildTunnelModeTransform(
@NonNull InetAddress sourceAddress,
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 8cb8b0e..87babc0 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -9650,6 +9650,21 @@
public static final String WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED =
"wifi_connected_mac_randomization_enabled";
+ /**
+ * Parameters to adjust the performance of framework wifi scoring methods.
+ * <p>
+ * Encoded as a comma-separated key=value list, for example:
+ * "rssi5=-80:-77:-70:-57,rssi2=-83:-80:-73:-60,horizon=15"
+ * This is intended for experimenting with new parameter values,
+ * and is normally unset or empty. The example does not include all
+ * parameters that may be honored.
+ * Default values are provided by code or device configurations.
+ * Errors in the parameters will cause the entire setting to be ignored.
+ * @hide
+ */
+ public static final String WIFI_SCORE_PARAMS =
+ "wifi_score_params";
+
/**
* The maximum number of times we will retry a connection to an access
* point for which we have failed in acquiring an IP address from DHCP.
@@ -11610,8 +11625,8 @@
*/
@SystemApi
@TestApi
- public static final String AUTOFILL_COMPAT_ALLOWED_PACKAGES =
- "autofill_compat_allowed_packages";
+ public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES =
+ "autofill_compat_mode_allowed_packages";
/**
* Exemptions to the hidden API blacklist.
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index 10c1c9e..503387a 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -35,6 +35,7 @@
import java.security.UnrecoverableKeyException;
import java.security.cert.CertPath;
import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -578,7 +579,7 @@
if (grantAlias == null) {
throw new InternalRecoveryServiceException("Null grant alias");
}
- return getKeyFromGrant(alias);
+ return getKeyFromGrant(grantAlias);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (UnrecoverableKeyException e) {
@@ -654,6 +655,11 @@
return RecoverySession.newInstance(this);
}
+ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
+ public Map<String, X509Certificate> getRootCertificates() {
+ return TrustedRootCertificates.getRootCertificates();
+ }
+
InternalRecoveryServiceException wrapUnexpectedServiceSpecificException(
ServiceSpecificException e) {
if (e.errorCode == ERROR_SERVICE_INTERNAL_ERROR) {
diff --git a/core/java/android/security/keystore/recovery/RecoverySession.java b/core/java/android/security/keystore/recovery/RecoverySession.java
index 744bfa3..208b9b2 100644
--- a/core/java/android/security/keystore/recovery/RecoverySession.java
+++ b/core/java/android/security/keystore/recovery/RecoverySession.java
@@ -77,7 +77,7 @@
}
/**
- * @deprecated Use {@link #start(CertPath, byte[], byte[], List)} instead.
+ * @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead.
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -108,25 +108,9 @@
}
/**
- * Starts a recovery session and returns a blob with proof of recovery secret possession.
- * The method generates a symmetric key for a session, which trusted remote device can use to
- * return recovery key.
- *
- * @param verifierCertPath The certificate path used to create the recovery blob on the source
- * device. Keystore will verify the certificate path by using the root of trust.
- * @param vaultParams Must match the parameters in the corresponding field in the recovery blob.
- * Used to limit number of guesses.
- * @param vaultChallenge Data passed from server for this recovery session and used to prevent
- * replay attacks.
- * @param secrets Secrets provided by user, the method only uses type and secret fields.
- * @return The recovery claim. Claim provides a b binary blob with recovery claim. It is
- * encrypted with verifierPublicKey and contains a proof of user secrets, session symmetric
- * key and parameters necessary to identify the counter with the number of failed recovery
- * attempts.
- * @throws CertificateException if the {@code verifierCertPath} is invalid.
- * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
- * service.
+ * @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead.
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@NonNull public byte[] start(
@NonNull CertPath verifierCertPath,
@@ -179,8 +163,6 @@
* @throws CertificateException if the {@code verifierCertPath} is invalid.
* @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
* service.
- *
- * @hide
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@NonNull public byte[] start(
@@ -215,17 +197,9 @@
}
/**
- * Imports keys.
- *
- * @param recoveryKeyBlob Recovery blob encrypted by symmetric key generated for this session.
- * @param applicationKeys Application keys. Key material can be decrypted using recoveryKeyBlob
- * and session. KeyStore only uses package names from the application info in {@link
- * WrappedApplicationKey}. Caller is responsibility to perform certificates check.
- * @return Map from alias to raw key material.
- * @throws SessionExpiredException if {@code session} has since been closed.
- * @throws DecryptionFailedException if unable to decrypt the snapshot.
- * @throws InternalRecoveryServiceException if an error occurs internal to the recovery service.
+ * @deprecated Use {@link #recoverKeyChainSnapshot(byte[], List)} instead.
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
public Map<String, byte[]> recoverKeys(
@NonNull byte[] recoveryKeyBlob,
@@ -257,8 +231,6 @@
* @throws SessionExpiredException if {@code session} has since been closed.
* @throws DecryptionFailedException if unable to decrypt the snapshot.
* @throws InternalRecoveryServiceException if an error occurs internal to the recovery service.
- *
- * @hide
*/
@RequiresPermission(Manifest.permission.RECOVER_KEYSTORE)
public Map<String, Key> recoverKeyChainSnapshot(
diff --git a/core/java/android/security/keystore/recovery/TrustedRootCertificates.java b/core/java/android/security/keystore/recovery/TrustedRootCertificates.java
index 4bdde8a..a65b40f 100644
--- a/core/java/android/security/keystore/recovery/TrustedRootCertificates.java
+++ b/core/java/android/security/keystore/recovery/TrustedRootCertificates.java
@@ -32,7 +32,7 @@
*
* @hide
*/
-public class TrustedRootCertificates {
+public final class TrustedRootCertificates {
public static final String GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS =
"GoogleCloudKeyVaultServiceV1";
@@ -83,7 +83,7 @@
/**
* Returns all available root certificates, keyed by alias.
*/
- public static Map<String, X509Certificate> listRootCertificates() {
+ public static Map<String, X509Certificate> getRootCertificates() {
return new ArrayMap(ALL_ROOT_CERTIFICATES);
}
@@ -114,4 +114,7 @@
throw new RuntimeException(e);
}
}
+
+ // Statics only
+ private TrustedRootCertificates() {}
}
diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java
index 41e4181..0f7cea2 100644
--- a/core/java/android/service/autofill/AutofillService.java
+++ b/core/java/android/service/autofill/AutofillService.java
@@ -518,7 +518,7 @@
* <intent-filter>
* <action android:name="android.service.autofill.AutofillService" />
* </intent-filter>
- * <meta-data android:name="android.autofillservice" android:resource="@xml/autofillservice" />
+ * <meta-data android:name="android.autofill" android:resource="@xml/autofillservice" />
* </service></pre>
*
* <P>In the XML file you can specify one or more packages for which to enable compatibility
diff --git a/core/java/android/service/autofill/AutofillServiceHelper.java b/core/java/android/service/autofill/AutofillServiceHelper.java
new file mode 100644
index 0000000..bbaebff
--- /dev/null
+++ b/core/java/android/service/autofill/AutofillServiceHelper.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import android.annotation.Nullable;
+import android.view.autofill.AutofillId;
+
+import com.android.internal.util.Preconditions;
+
+/** @hide */
+final class AutofillServiceHelper {
+
+ static AutofillId[] assertValid(@Nullable AutofillId[] ids) {
+ Preconditions.checkArgument(ids != null && ids.length > 0, "must have at least one id");
+ return Preconditions.checkArrayElementsNotNull(ids, "ids");
+ }
+
+ private AutofillServiceHelper() {
+ throw new UnsupportedOperationException("contains static members only");
+ }
+}
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 3a4b6bb..be84ba9 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -16,6 +16,7 @@
package android.service.autofill;
+import static android.service.autofill.AutofillServiceHelper.assertValid;
import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
import static android.view.autofill.Helper.sDebug;
@@ -245,10 +246,15 @@
* @param ids id of Views that when focused will display the authentication UI.
*
* @return This builder.
-
- * @throws IllegalArgumentException if {@code ids} is {@code null} or empty, or if
- * both {@code authentication} and {@code presentation} are {@code null}, or if
- * both {@code authentication} and {@code presentation} are non-{@code null}
+ *
+ * @throws IllegalArgumentException if any of the following occurs:
+ * <ul>
+ * <li>{@code ids} is {@code null}</li>
+ * <li>{@code ids} is empty</li>
+ * <li>{@code ids} contains a {@code null} element</li>
+ * <li>both {@code authentication} and {@code presentation} are {@code null}</li>
+ * <li>both {@code authentication} and {@code presentation} are non-{@code null}</li>
+ * </ul>
*
* @throws IllegalStateException if a {@link #setHeader(RemoteViews) header} or a
* {@link #setFooter(RemoteViews) footer} are already set for this builder.
@@ -263,16 +269,13 @@
throw new IllegalStateException("Already called #setHeader() or #setFooter()");
}
- if (ids == null || ids.length == 0) {
- throw new IllegalArgumentException("ids cannot be null or empry");
- }
if (authentication == null ^ presentation == null) {
throw new IllegalArgumentException("authentication and presentation"
+ " must be both non-null or null");
}
mAuthentication = authentication;
mPresentation = presentation;
- mAuthenticationIds = ids;
+ mAuthenticationIds = assertValid(ids);
return this;
}
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index a5a6177..1be1be6 100644
--- a/core/java/android/service/autofill/SaveInfo.java
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -16,6 +16,7 @@
package android.service.autofill;
+import static android.service.autofill.AutofillServiceHelper.assertValid;
import static android.view.autofill.Helper.sDebug;
import android.annotation.IntDef;
@@ -405,17 +406,6 @@
mRequiredIds = null;
}
- private AutofillId[] assertValid(AutofillId[] ids) {
- Preconditions.checkArgument(ids != null && ids.length > 0,
- "must have at least one id: " + Arrays.toString(ids));
- for (int i = 0; i < ids.length; i++) {
- final AutofillId id = ids[i];
- Preconditions.checkArgument(id != null,
- "cannot have null id: " + Arrays.toString(ids));
- }
- return ids;
- }
-
/**
* Sets flags changing the save behavior.
*
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 38ab6f2..9687009 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -42,7 +42,7 @@
DEFAULT_FLAGS.put("settings_zone_picker_v2", "true");
DEFAULT_FLAGS.put("settings_about_phone_v2", "true");
DEFAULT_FLAGS.put("settings_bluetooth_while_driving", "false");
- DEFAULT_FLAGS.put("settings_data_usage_v2", "false");
+ DEFAULT_FLAGS.put("settings_data_usage_v2", "true");
DEFAULT_FLAGS.put("settings_audio_switcher", "false");
}
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index a099820..89e6262 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -355,12 +355,10 @@
final List<Locale.LanguageRange> languageRangeList = Locale.LanguageRange.parse(languages);
ModelFile bestModel = null;
- int bestModelVersion = -1;
for (ModelFile model : listAllModelsLocked()) {
if (model.isAnyLanguageSupported(languageRangeList)) {
- if (model.getVersion() >= bestModelVersion) {
+ if (model.isPreferredTo(bestModel)) {
bestModel = model;
- bestModelVersion = model.getVersion();
}
}
}
@@ -482,6 +480,7 @@
private final String mName;
private final int mVersion;
private final List<Locale> mSupportedLocales;
+ private final boolean mLanguageIndependent;
/** Returns null if the path did not point to a compatible model. */
static @Nullable ModelFile fromPath(String path) {
@@ -496,12 +495,14 @@
Log.d(DEFAULT_LOG_TAG, "Ignoring " + file.getAbsolutePath());
return null;
}
+ final boolean languageIndependent = supportedLocalesStr.equals("*");
final List<Locale> supportedLocales = new ArrayList<>();
for (String langTag : supportedLocalesStr.split(",")) {
supportedLocales.add(Locale.forLanguageTag(langTag));
}
closeAndLogError(modelFd);
- return new ModelFile(path, file.getName(), version, supportedLocales);
+ return new ModelFile(path, file.getName(), version, supportedLocales,
+ languageIndependent);
} catch (FileNotFoundException e) {
Log.e(DEFAULT_LOG_TAG, "Failed to peek " + file.getAbsolutePath(), e);
return null;
@@ -525,7 +526,7 @@
/** Returns whether the language supports any language in the given ranges. */
boolean isAnyLanguageSupported(List<Locale.LanguageRange> languageRanges) {
- return Locale.lookup(languageRanges, mSupportedLocales) != null;
+ return mLanguageIndependent || Locale.lookup(languageRanges, mSupportedLocales) != null;
}
/** All locales supported by the model. */
@@ -533,6 +534,25 @@
return Collections.unmodifiableList(mSupportedLocales);
}
+ public boolean isPreferredTo(ModelFile model) {
+ // A model is preferred to no model.
+ if (model == null) {
+ return true;
+ }
+
+ // A language-specific model is preferred to a language independent
+ // model.
+ if (!mLanguageIndependent && model.mLanguageIndependent) {
+ return true;
+ }
+
+ // A higher-version model is preferred.
+ if (getVersion() > model.getVersion()) {
+ return true;
+ }
+ return false;
+ }
+
@Override
public boolean equals(Object other) {
if (this == other) {
@@ -555,11 +575,13 @@
mPath, mName, mVersion, localesJoiner.toString());
}
- private ModelFile(String path, String name, int version, List<Locale> supportedLocales) {
+ private ModelFile(String path, String name, int version, List<Locale> supportedLocales,
+ boolean languageIndependent) {
mPath = path;
mName = name;
mVersion = version;
mSupportedLocales = supportedLocales;
+ mLanguageIndependent = languageIndependent;
}
}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 9a99963..298c61e 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -89,7 +89,7 @@
/**
* Base class that can be used to implement virtualized lists of items. A list does
- * not have a spatial definition here. For instance, subclases of this class can
+ * not have a spatial definition here. For instance, subclasses of this class can
* display the content of the list in a grid, in a carousel, as stack, etc.
*
* @attr ref android.R.styleable#AbsListView_listSelector
diff --git a/core/java/android/widget/MediaControlView2.java b/core/java/android/widget/MediaControlView2.java
index 3ec8ab9..dab0f73 100644
--- a/core/java/android/widget/MediaControlView2.java
+++ b/core/java/android/widget/MediaControlView2.java
@@ -150,7 +150,7 @@
public MediaControlView2(@NonNull Context context, @Nullable AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super((instance, superProvider, privateProvider) ->
- ApiLoader.getProvider(context).createMediaControlView2(
+ ApiLoader.getProvider().createMediaControlView2(
(MediaControlView2) instance, superProvider, privateProvider,
attrs, defStyleAttr, defStyleRes),
context, attrs, defStyleAttr, defStyleRes);
diff --git a/core/java/android/widget/VideoView2.java b/core/java/android/widget/VideoView2.java
index 6f08dc2..214ff3a 100644
--- a/core/java/android/widget/VideoView2.java
+++ b/core/java/android/widget/VideoView2.java
@@ -143,7 +143,7 @@
@NonNull Context context, @Nullable AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super((instance, superProvider, privateProvider) ->
- ApiLoader.getProvider(context).createVideoView2(
+ ApiLoader.getProvider().createVideoView2(
(VideoView2) instance, superProvider, privateProvider,
attrs, defStyleAttr, defStyleRes),
context, attrs, defStyleAttr, defStyleRes);
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index d3b4dbf..9a082ec 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -320,8 +320,8 @@
return builder;
}
- public static ArrayList<InputMethodInfo> getDefaultEnabledImes(final Context context,
- final ArrayList<InputMethodInfo> imis) {
+ public static ArrayList<InputMethodInfo> getDefaultEnabledImes(
+ Context context, ArrayList<InputMethodInfo> imis, boolean onlyMinimum) {
final Locale fallbackLocale = getFallbackLocaleForDefaultIme(imis, context);
// We will primarily rely on the system locale, but also keep relying on the fallback locale
// as a last resort.
@@ -329,11 +329,19 @@
// then pick up suitable auxiliary IMEs when necessary (e.g. Voice IMEs with "automatic"
// subtype)
final Locale systemLocale = getSystemLocaleFromContext(context);
- return getMinimumKeyboardSetWithSystemLocale(imis, context, systemLocale, fallbackLocale)
- .fillImes(imis, context, true /* checkDefaultAttribute */, systemLocale,
- true /* checkCountry */, SUBTYPE_MODE_ANY)
- .fillAuxiliaryImes(imis, context)
- .build();
+ final InputMethodListBuilder builder =
+ getMinimumKeyboardSetWithSystemLocale(imis, context, systemLocale, fallbackLocale);
+ if (!onlyMinimum) {
+ builder.fillImes(imis, context, true /* checkDefaultAttribute */, systemLocale,
+ true /* checkCountry */, SUBTYPE_MODE_ANY)
+ .fillAuxiliaryImes(imis, context);
+ }
+ return builder.build();
+ }
+
+ public static ArrayList<InputMethodInfo> getDefaultEnabledImes(
+ Context context, ArrayList<InputMethodInfo> imis) {
+ return getDefaultEnabledImes(context, imis, false /* onlyMinimum */);
}
public static Locale constructLocaleFromString(String localeStr) {
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 06230c1..3c150c1 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.app.job.JobProtoEnums;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.UidTraffic;
import android.content.ContentResolver;
@@ -137,7 +138,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 176 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 177 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS;
@@ -1550,27 +1551,31 @@
}
}
+ @VisibleForTesting
public static class LongSamplingCounter extends LongCounter implements TimeBaseObs {
final TimeBase mTimeBase;
- long mCount;
- long mLoadedCount;
- long mUnpluggedCount;
+ public long mCount;
+ public long mCurrentCount;
+ public long mLoadedCount;
+ public long mUnpluggedCount;
- LongSamplingCounter(TimeBase timeBase, Parcel in) {
+ public LongSamplingCounter(TimeBase timeBase, Parcel in) {
mTimeBase = timeBase;
mCount = in.readLong();
+ mCurrentCount = in.readLong();
mLoadedCount = in.readLong();
mUnpluggedCount = in.readLong();
timeBase.add(this);
}
- LongSamplingCounter(TimeBase timeBase) {
+ public LongSamplingCounter(TimeBase timeBase) {
mTimeBase = timeBase;
timeBase.add(this);
}
public void writeToParcel(Parcel out) {
out.writeLong(mCount);
+ out.writeLong(mCurrentCount);
out.writeLong(mLoadedCount);
out.writeLong(mUnpluggedCount);
}
@@ -1597,24 +1602,37 @@
@Override
public void logState(Printer pw, String prefix) {
pw.println(prefix + "mCount=" + mCount
+ + " mCurrentCount=" + mCurrentCount
+ " mLoadedCount=" + mLoadedCount
+ " mUnpluggedCount=" + mUnpluggedCount);
}
- void addCountLocked(long count) {
- addCountLocked(count, mTimeBase.isRunning());
+ public void addCountLocked(long count) {
+ update(mCurrentCount + count, mTimeBase.isRunning());
}
- void addCountLocked(long count, boolean isRunning) {
- if (isRunning) {
- mCount += count;
+ public void addCountLocked(long count, boolean isRunning) {
+ update(mCurrentCount + count, isRunning);
+ }
+
+ public void update(long count) {
+ update(count, mTimeBase.isRunning());
+ }
+
+ public void update(long count, boolean isRunning) {
+ if (count < mCurrentCount) {
+ mCurrentCount = 0;
}
+ if (isRunning) {
+ mCount += count - mCurrentCount;
+ }
+ mCurrentCount = count;
}
/**
* Clear state of this counter.
*/
- void reset(boolean detachIfReset) {
+ public void reset(boolean detachIfReset) {
mCount = 0;
mLoadedCount = mUnpluggedCount = 0;
if (detachIfReset) {
@@ -1622,18 +1640,16 @@
}
}
- void detach() {
+ public void detach() {
mTimeBase.remove(this);
}
- void writeSummaryFromParcelLocked(Parcel out) {
+ public void writeSummaryFromParcelLocked(Parcel out) {
out.writeLong(mCount);
}
- void readSummaryFromParcelLocked(Parcel in) {
- mLoadedCount = in.readLong();
- mCount = mLoadedCount;
- mUnpluggedCount = mLoadedCount;
+ public void readSummaryFromParcelLocked(Parcel in) {
+ mCount = mUnpluggedCount= mLoadedCount = in.readLong();
}
}
@@ -10045,7 +10061,8 @@
if (t != null) {
t.startRunningLocked(elapsedRealtimeMs);
StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, getUid(), null,
- name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED);
+ name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED,
+ JobProtoEnums.STOP_REASON_CANCELLED);
}
}
@@ -10055,7 +10072,8 @@
t.stopRunningLocked(elapsedRealtimeMs);
if (!t.isRunningLocked()) { // only tell statsd if truly stopped
StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, getUid(), null,
- name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED);
+ name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED,
+ stopReason);
}
}
if (mBsi.mOnBatteryTimeBase.isRunning()) {
@@ -11600,10 +11618,6 @@
}
}
- // Cache last value for comparison.
- private BluetoothActivityEnergyInfo mLastBluetoothActivityEnergyInfo =
- new BluetoothActivityEnergyInfo(0, 0, 0, 0, 0, 0);
-
/**
* Add modem tx power to history
* Device is said to be in high cellular transmit power when it has spent most of the transmit
@@ -11642,8 +11656,35 @@
return;
}
+ private final class BluetoothActivityInfoCache {
+ long idleTimeMs;
+ long rxTimeMs;
+ long txTimeMs;
+ long energy;
+
+ SparseLongArray uidRxBytes = new SparseLongArray();
+ SparseLongArray uidTxBytes = new SparseLongArray();
+
+ void set(BluetoothActivityEnergyInfo info) {
+ idleTimeMs = info.getControllerIdleTimeMillis();
+ rxTimeMs = info.getControllerRxTimeMillis();
+ txTimeMs = info.getControllerTxTimeMillis();
+ energy = info.getControllerEnergyUsed();
+ if (info.getUidTraffic() != null) {
+ for (UidTraffic traffic : info.getUidTraffic()) {
+ uidRxBytes.put(traffic.getUid(), traffic.getRxBytes());
+ uidTxBytes.put(traffic.getUid(), traffic.getTxBytes());
+ }
+ }
+ }
+ }
+
+ private final BluetoothActivityInfoCache mLastBluetoothActivityInfo
+ = new BluetoothActivityInfoCache();
+
/**
* Distribute Bluetooth energy info and network traffic to apps.
+ *
* @param info The energy information from the bluetooth controller.
*/
public void updateBluetoothStateLocked(@Nullable final BluetoothActivityEnergyInfo info) {
@@ -11658,12 +11699,13 @@
mHasBluetoothReporting = true;
final long elapsedRealtimeMs = mClocks.elapsedRealtime();
- final long rxTimeMs = info.getControllerRxTimeMillis() -
- mLastBluetoothActivityEnergyInfo.getControllerRxTimeMillis();
- final long txTimeMs = info.getControllerTxTimeMillis() -
- mLastBluetoothActivityEnergyInfo.getControllerTxTimeMillis();
- final long idleTimeMs = info.getControllerIdleTimeMillis() -
- mLastBluetoothActivityEnergyInfo.getControllerIdleTimeMillis();
+ final long rxTimeMs =
+ info.getControllerRxTimeMillis() - mLastBluetoothActivityInfo.rxTimeMs;
+ final long txTimeMs =
+ info.getControllerTxTimeMillis() - mLastBluetoothActivityInfo.txTimeMs;
+ final long idleTimeMs =
+ info.getControllerIdleTimeMillis() - mLastBluetoothActivityInfo.idleTimeMs;
+
if (DEBUG_ENERGY) {
Slog.d(TAG, "------ BEGIN BLE power blaming ------");
Slog.d(TAG, " Tx Time: " + txTimeMs + " ms");
@@ -11735,8 +11777,8 @@
}
if (DEBUG_ENERGY) {
- Slog.d(TAG, "Left over time for traffic RX=" + leftOverRxTimeMs
- + " TX=" + leftOverTxTimeMs);
+ Slog.d(TAG, "Left over time for traffic RX=" + leftOverRxTimeMs + " TX="
+ + leftOverTxTimeMs);
}
//
@@ -11747,70 +11789,56 @@
long totalRxBytes = 0;
final UidTraffic[] uidTraffic = info.getUidTraffic();
- final UidTraffic[] lastUidTraffic = mLastBluetoothActivityEnergyInfo.getUidTraffic();
- final ArrayList<UidTraffic> deltaTraffic = new ArrayList<>();
- int m = 0, n = 0;
- for (; m < uidTraffic.length && n < lastUidTraffic.length; m++) {
- final UidTraffic traffic = uidTraffic[m];
- final UidTraffic lastTraffic = lastUidTraffic[n];
- if (traffic.getUid() == lastTraffic.getUid()) {
- deltaTraffic.add(new UidTraffic(traffic.getUid(),
- traffic.getRxBytes() - lastTraffic.getRxBytes(),
- traffic.getTxBytes() - lastTraffic.getTxBytes()));
- n++;
- }
- }
- for (; m < uidTraffic.length; m ++) {
- deltaTraffic.add(uidTraffic[m]);
- }
-
- for (int i = 0, j = 0; i < deltaTraffic.size(); i++) {
- final UidTraffic traffic = deltaTraffic.get(i);
+ final int numUids = uidTraffic != null ? uidTraffic.length : 0;
+ for (int i = 0; i < numUids; i++) {
+ final UidTraffic traffic = uidTraffic[i];
+ final long rxBytes = traffic.getRxBytes() - mLastBluetoothActivityInfo.uidRxBytes.get(
+ traffic.getUid());
+ final long txBytes = traffic.getTxBytes() - mLastBluetoothActivityInfo.uidTxBytes.get(
+ traffic.getUid());
// Add to the global counters.
- mNetworkByteActivityCounters[NETWORK_BT_RX_DATA].addCountLocked(
- traffic.getRxBytes());
- mNetworkByteActivityCounters[NETWORK_BT_TX_DATA].addCountLocked(
- traffic.getTxBytes());
+ mNetworkByteActivityCounters[NETWORK_BT_RX_DATA].addCountLocked(rxBytes);
+ mNetworkByteActivityCounters[NETWORK_BT_TX_DATA].addCountLocked(txBytes);
// Add to the UID counters.
final Uid u = getUidStatsLocked(mapUid(traffic.getUid()));
- u.noteNetworkActivityLocked(NETWORK_BT_RX_DATA, traffic.getRxBytes(), 0);
- u.noteNetworkActivityLocked(NETWORK_BT_TX_DATA, traffic.getTxBytes(), 0);
+ u.noteNetworkActivityLocked(NETWORK_BT_RX_DATA, rxBytes, 0);
+ u.noteNetworkActivityLocked(NETWORK_BT_TX_DATA, txBytes, 0);
// Calculate the total traffic.
- totalTxBytes += traffic.getTxBytes();
- totalRxBytes += traffic.getRxBytes();
+ totalRxBytes += rxBytes;
+ totalTxBytes += txBytes;
}
- if ((totalTxBytes != 0 || totalRxBytes != 0) &&
- (leftOverRxTimeMs != 0 || leftOverTxTimeMs != 0)) {
- for (int i = 0; i < deltaTraffic.size(); i++) {
- final UidTraffic traffic = deltaTraffic.get(i);
+ if ((totalTxBytes != 0 || totalRxBytes != 0) && (leftOverRxTimeMs != 0
+ || leftOverTxTimeMs != 0)) {
+ for (int i = 0; i < numUids; i++) {
+ final UidTraffic traffic = uidTraffic[i];
+ final int uid = traffic.getUid();
+ final long rxBytes =
+ traffic.getRxBytes() - mLastBluetoothActivityInfo.uidRxBytes.get(uid);
+ final long txBytes =
+ traffic.getTxBytes() - mLastBluetoothActivityInfo.uidTxBytes.get(uid);
- final Uid u = getUidStatsLocked(mapUid(traffic.getUid()));
+ final Uid u = getUidStatsLocked(mapUid(uid));
final ControllerActivityCounterImpl counter =
u.getOrCreateBluetoothControllerActivityLocked();
- if (totalRxBytes > 0 && traffic.getRxBytes() > 0) {
- final long timeRxMs = (leftOverRxTimeMs * traffic.getRxBytes()) / totalRxBytes;
-
+ if (totalRxBytes > 0 && rxBytes > 0) {
+ final long timeRxMs = (leftOverRxTimeMs * rxBytes) / totalRxBytes;
if (DEBUG_ENERGY) {
- Slog.d(TAG, "UID=" + traffic.getUid() + " rx_bytes=" + traffic.getRxBytes()
- + " rx_time=" + timeRxMs);
+ Slog.d(TAG, "UID=" + uid + " rx_bytes=" + rxBytes + " rx_time=" + timeRxMs);
}
counter.getRxTimeCounter().addCountLocked(timeRxMs);
leftOverRxTimeMs -= timeRxMs;
}
- if (totalTxBytes > 0 && traffic.getTxBytes() > 0) {
- final long timeTxMs = (leftOverTxTimeMs * traffic.getTxBytes()) / totalTxBytes;
-
+ if (totalTxBytes > 0 && txBytes > 0) {
+ final long timeTxMs = (leftOverTxTimeMs * txBytes) / totalTxBytes;
if (DEBUG_ENERGY) {
- Slog.d(TAG, "UID=" + traffic.getUid() + " tx_bytes=" + traffic.getTxBytes()
- + " tx_time=" + timeTxMs);
+ Slog.d(TAG, "UID=" + uid + " tx_bytes=" + txBytes + " tx_time=" + timeTxMs);
}
-
counter.getTxTimeCounters()[0].addCountLocked(timeTxMs);
leftOverTxTimeMs -= timeTxMs;
}
@@ -11827,10 +11855,10 @@
if (opVolt != 0) {
// We store the power drain as mAms.
mBluetoothActivity.getPowerCounter().addCountLocked(
- (long) ((info.getControllerEnergyUsed() -
- mLastBluetoothActivityEnergyInfo.getControllerEnergyUsed() )/ opVolt));
+ (long) ((info.getControllerEnergyUsed() - mLastBluetoothActivityInfo.energy)
+ / opVolt));
}
- mLastBluetoothActivityEnergyInfo = info;
+ mLastBluetoothActivityInfo.set(info);
}
/**
diff --git a/core/java/com/android/internal/util/ProviderAccessStats.java b/core/java/com/android/internal/util/ProviderAccessStats.java
new file mode 100644
index 0000000..c3ffb02
--- /dev/null
+++ b/core/java/com/android/internal/util/ProviderAccessStats.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.util;
+
+import android.os.SystemClock;
+import android.util.SparseBooleanArray;
+import android.util.SparseLongArray;
+
+import java.io.PrintWriter;
+
+public class ProviderAccessStats {
+ private final Object mLock = new Object();
+
+ private final long mStartUptime = SystemClock.uptimeMillis();
+
+ private final SparseBooleanArray mAllCallingUids = new SparseBooleanArray();
+ private final SparseLongArray mQueryStats = new SparseLongArray(16);
+ private final SparseLongArray mBatchStats = new SparseLongArray(0);
+ private final SparseLongArray mInsertStats = new SparseLongArray(0);
+ private final SparseLongArray mUpdateStats = new SparseLongArray(0);
+ private final SparseLongArray mDeleteStats = new SparseLongArray(0);
+ private final SparseLongArray mInsertInBatchStats = new SparseLongArray(0);
+ private final SparseLongArray mUpdateInBatchStats = new SparseLongArray(0);
+ private final SparseLongArray mDeleteInBatchStats = new SparseLongArray(0);
+
+ private final SparseLongArray mOperationDurationMillis = new SparseLongArray(16);
+
+ private static class PerThreadData {
+ public int nestCount;
+ public long startUptimeMillis;
+ }
+
+ private final ThreadLocal<PerThreadData> mThreadLocal =
+ ThreadLocal.withInitial(() -> new PerThreadData());
+
+ private void incrementStats(int callingUid, SparseLongArray stats) {
+ synchronized (mLock) {
+ stats.put(callingUid, stats.get(callingUid) + 1);
+ mAllCallingUids.put(callingUid, true);
+ }
+
+ final PerThreadData data = mThreadLocal.get();
+ data.nestCount++;
+ if (data.nestCount == 1) {
+ data.startUptimeMillis = SystemClock.uptimeMillis();
+ }
+ }
+
+ private void incrementStats(int callingUid, boolean inBatch,
+ SparseLongArray statsNonBatch, SparseLongArray statsInBatch) {
+ incrementStats(callingUid, inBatch ? statsInBatch : statsNonBatch);
+ }
+
+ public final void incrementInsertStats(int callingUid, boolean inBatch) {
+ incrementStats(callingUid, inBatch, mInsertStats, mInsertInBatchStats);
+ }
+
+ public final void incrementUpdateStats(int callingUid, boolean inBatch) {
+ incrementStats(callingUid, inBatch, mUpdateStats, mUpdateInBatchStats);
+ }
+
+ public final void incrementDeleteStats(int callingUid, boolean inBatch) {
+ incrementStats(callingUid, inBatch, mDeleteStats, mDeleteInBatchStats);
+ }
+
+ public final void incrementQueryStats(int callingUid) {
+ incrementStats(callingUid, mQueryStats);
+ }
+
+ public final void incrementBatchStats(int callingUid) {
+ incrementStats(callingUid, mBatchStats);
+ }
+
+ public void finishOperation(int callingUid) {
+ final PerThreadData data = mThreadLocal.get();
+ data.nestCount--;
+ if (data.nestCount == 0) {
+ // Because we only have millisecond granularity, let's always attribute at least 1ms
+ // for each operation.
+ final long duration = Math.max(1, SystemClock.uptimeMillis() - data.startUptimeMillis);
+
+ synchronized (mLock) {
+ mOperationDurationMillis.put(callingUid,
+ mOperationDurationMillis.get(callingUid) + duration);
+ }
+ }
+ }
+
+ public void dump(PrintWriter pw, String prefix) {
+ synchronized (mLock) {
+ pw.print(" Process uptime: ");
+ pw.print((SystemClock.uptimeMillis() - mStartUptime) / (60 * 1000));
+ pw.println(" minutes");
+ pw.println();
+
+ pw.print(prefix);
+ pw.println("Client activities:");
+ pw.print(prefix);
+ pw.println(" UID Query Insert Update Delete Batch Insert Update Delete"
+ + " Sec");
+ for (int i = 0; i < mAllCallingUids.size(); i++) {
+ final int uid = mAllCallingUids.keyAt(i);
+ pw.print(prefix);
+ pw.println(String.format(
+ " %-9d %6d %6d %6d %6d %6d %6d %6d %6d %12.3f",
+ uid,
+ mQueryStats.get(uid),
+ mInsertStats.get(uid),
+ mUpdateStats.get(uid),
+ mDeleteStats.get(uid),
+ mBatchStats.get(uid),
+ mInsertInBatchStats.get(uid),
+ mUpdateInBatchStats.get(uid),
+ mDeleteInBatchStats.get(uid),
+ (mOperationDurationMillis.get(uid) / 1000.0)
+ ));
+ }
+ pw.println();
+ }
+ }
+}
diff --git a/core/proto/android/app/jobparameters.proto b/core/proto/android/app/job/enums.proto
similarity index 66%
rename from core/proto/android/app/jobparameters.proto
rename to core/proto/android/app/job/enums.proto
index 4f6a2a2..0f14f20 100644
--- a/core/proto/android/app/jobparameters.proto
+++ b/core/proto/android/app/job/enums.proto
@@ -15,19 +15,18 @@
*/
syntax = "proto2";
+
+package android.app.job;
+
+option java_outer_classname = "JobProtoEnums";
option java_multiple_files = true;
-package android.app;
-
-/**
- * An android.app.JobParameters object.
- */
-message JobParametersProto {
- enum CancelReason {
- REASON_CANCELLED = 0;
- REASON_CONSTRAINTS_NOT_SATISFIED = 1;
- REASON_PREEMPT = 2;
- REASON_TIMEOUT = 3;
- REASON_DEVICE_IDLE = 4;
- }
+// Reasons a job is stopped.
+// Primarily used in android.app.job.JobParameters.java.
+enum StopReasonEnum {
+ STOP_REASON_CANCELLED = 0;
+ STOP_REASON_CONSTRAINTS_NOT_SATISFIED = 1;
+ STOP_REASON_PREEMPT = 2;
+ STOP_REASON_TIMEOUT = 3;
+ STOP_REASON_DEVICE_IDLE = 4;
}
diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto
index 345c8ef..8e98ac9 100644
--- a/core/proto/android/os/batterystats.proto
+++ b/core/proto/android/os/batterystats.proto
@@ -19,7 +19,7 @@
package android.os;
-import "frameworks/base/core/proto/android/app/jobparameters.proto";
+import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/os/powermanager.proto";
import "frameworks/base/core/proto/android/telephony/enums.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
@@ -637,7 +637,7 @@
message ReasonCount {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional android.app.JobParametersProto.CancelReason name = 1;
+ optional android.app.job.StopReasonEnum name = 1;
optional int32 count = 2;
}
repeated ReasonCount reason_count = 2;
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index 4e781d6..4bb9707 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -466,7 +466,7 @@
// skipped.
optional SettingProto override_settings_provider_restore_any_version = 355 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto chained_battery_attribution_enabled = 356 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto autofill_compat_allowed_packages = 357 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto autofill_compat_mode_allowed_packages = 357 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto hidden_api_blacklist_exemptions = 358 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto sound_trigger_detection_service_op_timeout = 387 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto max_sound_trigger_detection_service_ops_per_day = 388 [ (android.privacy).dest = DEST_AUTOMATIC ];
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 9193129..122e5c4 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -20,7 +20,7 @@
option java_multiple_files = true;
-import "frameworks/base/core/proto/android/app/jobparameters.proto";
+import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/content/clipdata.proto";
import "frameworks/base/core/proto/android/content/component_name.proto";
import "frameworks/base/core/proto/android/content/intent.proto";
@@ -465,7 +465,7 @@
message StopReasonCount {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.app.JobParametersProto.CancelReason reason = 1;
+ optional .android.app.job.StopReasonEnum reason = 1;
optional int32 count = 2;
}
repeated StopReasonCount stop_reasons = 9;
@@ -516,7 +516,7 @@
optional int32 job_id = 4;
optional string tag = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
// Only valid for STOP_JOB or STOP_PERIODIC_JOB Events.
- optional .android.app.JobParametersProto.CancelReason stop_reason = 6;
+ optional .android.app.job.StopReasonEnum stop_reason = 6;
}
repeated HistoryEvent history_event = 1;
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 1b4d571..2ebffb7 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -3310,8 +3310,9 @@
<permission android:name="android.permission.BACKUP"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows application to manage RecoverableKeyStoreLoader.
- <p>Not for use by third-party applications.
+ <!-- @SystemApi Allows application to manage
+ {@link android.security.keystore.recovery.RecoveryController}.
+ <p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.RECOVER_KEYSTORE"
android:protectionLevel="signature|privileged" />
diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml
index 3609fb8..6e8134b 100644
--- a/core/res/res/values/colors_material.xml
+++ b/core/res/res/values/colors_material.xml
@@ -97,7 +97,7 @@
<color name="material_deep_teal_100">#ffb2dfdb</color>
<color name="material_deep_teal_200">#ff80cbc4</color>
<color name="material_deep_teal_300">#ff4db6ac</color>
- <color name="material_deep_teal_500">#ff008577</color>
+ <color name="material_deep_teal_500">#ff009688</color>
<color name="material_blue_grey_200">#ffb0bec5</color>
<color name="material_blue_grey_700">#ff455a64</color>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 1b11070..f0f7270 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4578,14 +4578,14 @@
<!-- Displayed when the USSD/SS request is modified by STK CC to a
different request. This will be displayed in a toast. -->
- <string name="stk_cc_ussd_to_dial">USSD request is modified to DIAL request.</string>
- <string name="stk_cc_ussd_to_ss">USSD request is modified to SS request.</string>
- <string name="stk_cc_ussd_to_ussd">USSD request is modified to new USSD request.</string>
- <string name="stk_cc_ussd_to_dial_video">USSD request is modified to Video DIAL request.</string>
- <string name="stk_cc_ss_to_dial">SS request is modified to DIAL request.</string>
- <string name="stk_cc_ss_to_dial_video">SS request is modified to Video DIAL request.</string>
- <string name="stk_cc_ss_to_ussd">SS request is modified to USSD request.</string>
- <string name="stk_cc_ss_to_ss">SS request is modified to new SS request.</string>
+ <string name="stk_cc_ussd_to_dial">USSD request changed to regular call</string>
+ <string name="stk_cc_ussd_to_ss">USSD request changed to SS request</string>
+ <string name="stk_cc_ussd_to_ussd">Changed to new USSD request</string>
+ <string name="stk_cc_ussd_to_dial_video">USSD request changed to video call</string>
+ <string name="stk_cc_ss_to_dial">SS request changed to regular call</string>
+ <string name="stk_cc_ss_to_dial_video">SS request changed to video call</string>
+ <string name="stk_cc_ss_to_ussd">SS request changed to USSD request</string>
+ <string name="stk_cc_ss_to_ss">Changed to new SS request</string>
<!-- Content description of the work profile icon in the notification. -->
<string name="notification_work_profile_content_description">Work profile</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index cf9ac2a..4cf50f5 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2779,7 +2779,6 @@
<java-symbol type="drawable" name="ic_user_secure" />
<java-symbol type="string" name="android_upgrading_notification_title" />
- <java-symbol type="string" name="android_upgrading_notification_body" />
<java-symbol type="string" name="usb_mtp_launch_notification_title" />
<java-symbol type="string" name="usb_mtp_launch_notification_description" />
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index deafbd3..87a9bd0e 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -117,7 +117,7 @@
Settings.Global.APP_STANDBY_ENABLED,
Settings.Global.ASSISTED_GPS_ENABLED,
Settings.Global.AUDIO_SAFE_VOLUME_STATE,
- Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES,
+ Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES,
Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD,
Settings.Global.BATTERY_DISCHARGE_THRESHOLD,
Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS,
@@ -450,6 +450,7 @@
Settings.Global.WIFI_SAVED_STATE,
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
Settings.Global.WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS,
+ Settings.Global.WIFI_SCORE_PARAMS,
Settings.Global.WIFI_SLEEP_POLICY,
Settings.Global.WIFI_SUPPLICANT_SCAN_INTERVAL_MS,
Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED,
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java b/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java
index 3b4ad38..a5a3ca9 100644
--- a/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java
@@ -16,7 +16,7 @@
package android.security.keystore.recovery;
-import static android.security.keystore.recovery.TrustedRootCertificates.listRootCertificates;
+import static android.security.keystore.recovery.TrustedRootCertificates.getRootCertificates;
import static org.junit.Assert.assertTrue;
@@ -36,8 +36,8 @@
"GoogleCloudKeyVaultServiceV1";
@Test
- public void listRootCertificates_listsGoogleCloudVaultV1Certificate() {
- Map<String, X509Certificate> certificates = listRootCertificates();
+ public void getRootCertificates_listsGoogleCloudVaultV1Certificate() {
+ Map<String, X509Certificate> certificates = getRootCertificates();
assertTrue(certificates.containsKey(GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS));
}
diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
index e6ac682..1fd24e3 100644
--- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
@@ -99,6 +99,10 @@
assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US,
"DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
"DummyNonDefaultAutoVoiceIme1");
+ assertDefaultEnabledMinimumImes(getImesWithDefaultVoiceIme(), LOCALE_EN_US,
+ "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledMinimumImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US,
+ "DummyDefaultEnKeyboardIme");
// locale: en_GB
assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB,
@@ -106,6 +110,10 @@
assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB,
"DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
"DummyNonDefaultAutoVoiceIme1");
+ assertDefaultEnabledMinimumImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB,
+ "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledMinimumImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB,
+ "DummyDefaultEnKeyboardIme");
// locale: ja_JP
assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP,
@@ -113,6 +121,10 @@
assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP,
"DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
"DummyNonDefaultAutoVoiceIme1");
+ assertDefaultEnabledMinimumImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP,
+ "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledMinimumImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP,
+ "DummyDefaultEnKeyboardIme");
}
@Test
@@ -120,34 +132,49 @@
// locale: en_US
assertDefaultEnabledImes(getSamplePreinstalledImes("en-rUS"), LOCALE_EN_US,
"com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("en-rUS"), LOCALE_EN_US,
+ "com.android.apps.inputmethod.latin");
// locale: en_GB
assertDefaultEnabledImes(getSamplePreinstalledImes("en-rGB"), LOCALE_EN_GB,
"com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("en-rGB"), LOCALE_EN_GB,
+ "com.android.apps.inputmethod.latin");
// locale: en_IN
assertDefaultEnabledImes(getSamplePreinstalledImes("en-rIN"), LOCALE_EN_IN,
"com.android.apps.inputmethod.hindi",
"com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("en-rIN"), LOCALE_EN_IN,
+ "com.android.apps.inputmethod.hindi",
+ "com.android.apps.inputmethod.latin");
// locale: hi
assertDefaultEnabledImes(getSamplePreinstalledImes("hi"), LOCALE_HI,
"com.android.apps.inputmethod.hindi", "com.android.apps.inputmethod.latin",
"com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("hi"), LOCALE_HI,
+ "com.android.apps.inputmethod.hindi", "com.android.apps.inputmethod.latin");
// locale: ja_JP
assertDefaultEnabledImes(getSamplePreinstalledImes("ja-rJP"), LOCALE_JA_JP,
"com.android.apps.inputmethod.japanese", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("ja-rJP"), LOCALE_JA_JP,
+ "com.android.apps.inputmethod.japanese");
// locale: zh_CN
assertDefaultEnabledImes(getSamplePreinstalledImes("zh-rCN"), LOCALE_ZH_CN,
"com.android.apps.inputmethod.pinyin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("zh-rCN"), LOCALE_ZH_CN,
+ "com.android.apps.inputmethod.pinyin");
// locale: zh_TW
// Note: In this case, no IME is suitable for the system locale. Hence we will pick up a
// fallback IME regardless of the "default" attribute.
assertDefaultEnabledImes(getSamplePreinstalledImes("zh-rTW"), LOCALE_ZH_TW,
"com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("zh-rTW"), LOCALE_ZH_TW,
+ "com.android.apps.inputmethod.latin");
}
@Test
@@ -785,6 +812,18 @@
}
}
+ private void assertDefaultEnabledMinimumImes(final ArrayList<InputMethodInfo> preinstalledImes,
+ final Locale systemLocale, String... expectedImeNames) {
+ final Context context = createTargetContextWithLocales(new LocaleList(systemLocale));
+ final String[] actualImeNames = getPackageNames(
+ InputMethodUtils.getDefaultEnabledImes(context, preinstalledImes,
+ true /* onlyMinimum */));
+ assertEquals(expectedImeNames.length, actualImeNames.length);
+ for (int i = 0; i < expectedImeNames.length; ++i) {
+ assertEquals(expectedImeNames[i], actualImeNames[i]);
+ }
+ }
+
private static List<InputMethodInfo> cloneViaParcel(final List<InputMethodInfo> list) {
Parcel p = null;
try {
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index f5fe80c..94492ba 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -43,6 +43,7 @@
KernelUidCpuActiveTimeReaderTest.class,
KernelUidCpuClusterTimeReaderTest.class,
KernelWakelockReaderTest.class,
+ LongSamplingCounterTest.class,
LongSamplingCounterArrayTest.class,
PowerCalculatorTest.class,
PowerProfileTest.class
diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java
new file mode 100644
index 0000000..853bf8a
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import static android.os.BatteryStats.STATS_SINCE_CHARGED;
+
+import static com.android.internal.os.BatteryStatsImpl.LongSamplingCounter;
+import static com.android.internal.os.BatteryStatsImpl.TimeBase;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Test class for {@link LongSamplingCounter}.
+ *
+ * To run the tests, use
+ *
+ * bit FrameworksCoreTests:com.android.internal.os.LongSamplingCounterTest
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class LongSamplingCounterTest {
+
+ private static final long COUNT = 1111;
+ private static final long CURRENT_COUNT = 5555;
+
+ @Mock
+ private TimeBase mTimeBase;
+ private LongSamplingCounter mCounter;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mCounter = new LongSamplingCounter(mTimeBase);
+ Mockito.reset(mTimeBase);
+ }
+
+ @Test
+ public void testReadWriteParcel() {
+ final Parcel parcel = Parcel.obtain();
+ updateCounts(COUNT, CURRENT_COUNT);
+ mCounter.writeToParcel(parcel);
+ parcel.setDataPosition(0);
+
+ // Now clear counterArray and verify values are read from parcel correctly.
+ updateCounts(0, 0);
+
+ mCounter = new LongSamplingCounter(mTimeBase, parcel);
+ assertEquals(COUNT, mCounter.mCount);
+ assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
+ parcel.recycle();
+ }
+
+ @Test
+ public void testReadWriteSummaryParcel() {
+ final Parcel parcel = Parcel.obtain();
+ updateCounts(COUNT, CURRENT_COUNT);
+ mCounter.writeSummaryFromParcelLocked(parcel);
+ parcel.setDataPosition(0);
+
+ // Now clear counterArray and verify values are read from parcel correctly.
+ updateCounts(0, 0);
+
+ mCounter.readSummaryFromParcelLocked(parcel);
+ assertEquals(COUNT, mCounter.mCount);
+ parcel.recycle();
+ }
+
+ @Test
+ public void testOnTimeStarted() {
+ updateCounts(COUNT, CURRENT_COUNT);
+ mCounter.onTimeStarted(0, 0, 0);
+ assertEquals(COUNT, mCounter.mCount);
+ assertEquals(COUNT, mCounter.mUnpluggedCount);
+ }
+
+ @Test
+ public void testOnTimeStopped() {
+ updateCounts(COUNT, CURRENT_COUNT);
+ mCounter.onTimeStopped(0, 0, 0);
+ assertEquals(COUNT, mCounter.mCount);
+ }
+
+ @Test
+ public void testAddCountLocked() {
+ updateCounts(0, 0);
+ assertEquals(0, mCounter.getCountLocked(0));
+ when(mTimeBase.isRunning()).thenReturn(true);
+ mCounter.addCountLocked(111);
+ assertEquals(111, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(111, mCounter.mCurrentCount);
+ mCounter.addCountLocked(222);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(333, mCounter.mCurrentCount);
+
+ when(mTimeBase.isRunning()).thenReturn(false);
+ mCounter.addCountLocked(456);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(789, mCounter.mCurrentCount);
+
+ mCounter.addCountLocked(444, true);
+ assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(1233, mCounter.mCurrentCount);
+ mCounter.addCountLocked(567, false);
+ assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(1800, mCounter.mCurrentCount);
+ }
+
+ @Test
+ public void testUpdate() {
+ updateCounts(0, 0);
+ assertEquals(0, mCounter.getCountLocked(0));
+ when(mTimeBase.isRunning()).thenReturn(true);
+ mCounter.update(111);
+ assertEquals(111, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(111, mCounter.mCurrentCount);
+ mCounter.update(333);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(333, mCounter.mCurrentCount);
+
+ when(mTimeBase.isRunning()).thenReturn(false);
+ mCounter.update(789);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(789, mCounter.mCurrentCount);
+ mCounter.update(100);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(100, mCounter.mCurrentCount);
+
+ mCounter.update(544, true);
+ assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(544, mCounter.mCurrentCount);
+ mCounter.update(1544, false);
+ assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(1544, mCounter.mCurrentCount);
+ }
+
+ @Test
+ public void testReset() {
+ updateCounts(COUNT, CURRENT_COUNT);
+ // Test with detachIfReset=false
+ mCounter.reset(false /* detachIfReset */);
+ assertEquals(0, mCounter.mCount);
+ assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
+ verifyZeroInteractions(mTimeBase);
+
+ updateCounts(COUNT, CURRENT_COUNT);
+ // Test with detachIfReset=true
+ mCounter.reset(true /* detachIfReset */);
+ assertEquals(0, mCounter.mCount);
+ assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
+ verify(mTimeBase).remove(mCounter);
+ verifyNoMoreInteractions(mTimeBase);
+ }
+
+ @Test
+ public void testDetach() {
+ mCounter.detach();
+ verify(mTimeBase).remove(mCounter);
+ verifyNoMoreInteractions(mTimeBase);
+ }
+
+ private void updateCounts(long total, long current) {
+ mCounter.mCount = total;
+ mCounter.mCurrentCount = current;
+ }
+}
diff --git a/graphics/java/android/graphics/Picture.java b/graphics/java/android/graphics/Picture.java
index 9ac94d8..d01ff6f 100644
--- a/graphics/java/android/graphics/Picture.java
+++ b/graphics/java/android/graphics/Picture.java
@@ -209,6 +209,8 @@
public PictureCanvas(Picture pict, long nativeCanvas) {
super(nativeCanvas);
mPicture = pict;
+ // Disable bitmap density scaling. This matches DisplayListCanvas.
+ mDensity = 0;
}
@Override
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 820789d..f4d8051 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -355,7 +355,14 @@
// Already drew for this vsync pulse, UI draw request missed
// the deadline for RT animations
info.out.canDrawThisFrame = false;
- } else if (vsyncDelta >= mRenderThread.timeLord().frameIntervalNanos() * 3 ||
+ }
+ /* This logic exists to try and recover from a display latch miss, which essentially
+ * results in the bufferqueue being double-buffered instead of triple-buffered.
+ * SurfaceFlinger itself now tries to handle & recover from this situation, so this
+ * logic should no longer be necessary. As it's occasionally triggering when
+ * undesired disable it.
+ * TODO: Remove this entirely if the results are solid.
+ else if (vsyncDelta >= mRenderThread.timeLord().frameIntervalNanos() * 3 ||
(latestVsync - mLastDropVsync) < 500_ms) {
// It's been several frame intervals, assume the buffer queue is fine
// or the last drop was too recent
@@ -367,6 +374,7 @@
mLastDropVsync = mRenderThread.timeLord().latestVsync();
}
}
+ */
} else {
info.out.canDrawThisFrame = true;
}
diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h
index 7ac0d96..4857a87 100644
--- a/libs/hwui/utils/Color.h
+++ b/libs/hwui/utils/Color.h
@@ -34,7 +34,7 @@
LightBlue_300 = 0xFF4FC3F7,
LightBlue_500 = 0xFF03A9F4,
Cyan_500 = 0xFF00BCD4,
- Teal_500 = 0xFF008577,
+ Teal_500 = 0xFF009688,
Teal_700 = 0xFF00796B,
Green_500 = 0xFF4CAF50,
Green_700 = 0xFF388E3C,
diff --git a/location/java/android/location/IFusedProvider.aidl b/location/java/android/location/IFusedProvider.aidl
deleted file mode 100644
index e86ad1a..0000000
--- a/location/java/android/location/IFusedProvider.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2013 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.location;
-
-import android.hardware.location.IFusedLocationHardware;
-
-/**
- * Interface definition for Location providers that require FLP services.
- * @hide
- */
-oneway interface IFusedProvider {
- /**
- * Provides access to a FusedLocationHardware instance needed for the provider to work.
- *
- * @param instance The FusedLocationHardware available for the provider to use.
- */
- void onFusedLocationHardwareChange(in IFusedLocationHardware instance);
-}
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index c16876b..a523958 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -23,6 +23,7 @@
import android.Manifest;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
@@ -236,12 +237,6 @@
"android.location.HIGH_POWER_REQUEST_CHANGE";
/**
- * The value returned by {@link LocationManager#getGnssHardwareModelName()} when the hardware
- * does not support providing the actual value.
- */
- public static final String GNSS_HARDWARE_MODEL_NAME_UNKNOWN = "Model Name Unknown";
-
- /**
* Broadcast intent action for Settings app to inject a footer at the bottom of location
* settings.
*
@@ -2206,7 +2201,9 @@
/**
* Returns the model year of the GNSS hardware and software build.
*
- * May return 0 if the model year is less than 2016.
+ * <p> More details, such as build date, may be available in {@link #getGnssHardwareModelName()}.
+ *
+ * <p> May return 0 if the model year is less than 2016.
*/
public int getGnssYearOfHardware() {
try {
@@ -2220,10 +2217,12 @@
* Returns the Model Name (including Vendor and Hardware/Software Version) of the GNSS hardware
* driver.
*
- * Will return {@link LocationManager#GNSS_HARDWARE_MODEL_NAME_UNKNOWN} when the GNSS hardware
- * abstraction layer does not support providing this value.
+ * <p> No device-specific serial number or ID is returned from this API.
+ *
+ * <p> Will return null when the GNSS hardware abstraction layer does not support providing
+ * this value.
*/
- @NonNull
+ @Nullable
public String getGnssHardwareModelName() {
try {
return mService.getGnssHardwareModelName();
diff --git a/location/lib/Android.mk b/location/lib/Android.mk
index 8424601..6642134 100644
--- a/location/lib/Android.mk
+++ b/location/lib/Android.mk
@@ -42,3 +42,25 @@
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
+
+# ==== Stub library ===========================================
+include $(CLEAR_VARS)
+LOCAL_MODULE := com.android.location.provider-stubs-gen
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_SRC_FILES := $(call all-java-files-under,java)
+LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/com.android.location.provider.stubs_intermediates/src
+LOCAL_DROIDDOC_OPTIONS:= \
+ -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \
+ -stubpackages com.android.location.provider \
+ -nodocs
+LOCAL_UNINSTALLABLE_MODULE := true
+include $(BUILD_DROIDDOC)
+com_android_nfc_extras_gen_stamp := $(full_target)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := com.android.location.provider.stubs
+LOCAL_SOURCE_FILES_ALL_GENERATED := true
+LOCAL_SDK_VERSION := current
+LOCAL_ADDITIONAL_DEPENDENCIES := $(com_android_nfc_extras_gen_stamp)
+com_android_nfc_extras_gen_stamp :=
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/location/lib/java/com/android/location/provider/ActivityChangedEvent.java b/location/lib/java/com/android/location/provider/ActivityChangedEvent.java
index c7dfc88..843dd67 100644
--- a/location/lib/java/com/android/location/provider/ActivityChangedEvent.java
+++ b/location/lib/java/com/android/location/provider/ActivityChangedEvent.java
@@ -23,6 +23,7 @@
/**
* A class representing an event for Activity changes.
+ * @hide
*/
public class ActivityChangedEvent {
private final List<ActivityRecognitionEvent> mActivityRecognitionEvents;
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java b/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java
index a39cff2..e54dea4 100644
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java
+++ b/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java
@@ -18,6 +18,7 @@
/**
* A class that represents an Activity Recognition Event.
+ * @hide
*/
public class ActivityRecognitionEvent {
private final String mActivity;
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java
index bc2dae1..0eff7d3 100644
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java
+++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java
@@ -28,6 +28,7 @@
/**
* A class that exposes {@link IActivityRecognitionHardware} functionality to unbundled services.
+ * @hide
*/
public final class ActivityRecognitionProvider {
private final IActivityRecognitionHardware mService;
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java
index 0b878d7..326d901 100644
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java
+++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java
@@ -27,6 +27,7 @@
/**
* A client class for interaction with an Activity-Recognition provider.
+ * @hide
*/
public abstract class ActivityRecognitionProviderClient {
private static final String TAG = "ArProviderClient";
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java
index 7139025..42f77b4 100644
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java
+++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java
@@ -30,6 +30,7 @@
* A watcher class for Activity-Recognition instances.
*
* @deprecated use {@link ActivityRecognitionProviderClient} instead.
+ * @hide
*/
@Deprecated
public class ActivityRecognitionProviderWatcher {
diff --git a/location/lib/java/com/android/location/provider/FusedLocationHardware.java b/location/lib/java/com/android/location/provider/FusedLocationHardware.java
deleted file mode 100644
index eb3b2f4..0000000
--- a/location/lib/java/com/android/location/provider/FusedLocationHardware.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.location.provider;
-
-import android.hardware.location.IFusedLocationHardware;
-import android.hardware.location.IFusedLocationHardwareSink;
-
-import android.location.Location;
-
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Class that exposes IFusedLocationHardware functionality to unbundled services.
- */
-public final class FusedLocationHardware {
- private static final String TAG = "FusedLocationHardware";
-
- private IFusedLocationHardware mLocationHardware;
-
- // the list uses a copy-on-write pattern to update its contents
- HashMap<FusedLocationHardwareSink, DispatcherHandler> mSinkList =
- new HashMap<FusedLocationHardwareSink, DispatcherHandler>();
-
- private IFusedLocationHardwareSink mInternalSink = new IFusedLocationHardwareSink.Stub() {
- @Override
- public void onLocationAvailable(Location[] locations) {
- dispatchLocations(locations);
- }
-
- @Override
- public void onDiagnosticDataAvailable(String data) {
- dispatchDiagnosticData(data);
- }
-
- @Override
- public void onCapabilities(int capabilities) {
- dispatchCapabilities(capabilities);
- }
-
- @Override
- public void onStatusChanged(int status) {
- dispatchStatus(status);
- }
- };
-
- /**
- * @hide
- */
- public FusedLocationHardware(IFusedLocationHardware locationHardware) {
- mLocationHardware = locationHardware;
- }
-
- /*
- * Methods to provide a Facade for IFusedLocationHardware
- */
- public void registerSink(FusedLocationHardwareSink sink, Looper looper) {
- if(sink == null || looper == null) {
- throw new IllegalArgumentException("Parameter sink and looper cannot be null.");
- }
-
- boolean registerSink;
- synchronized (mSinkList) {
- // register only on first insertion
- registerSink = mSinkList.size() == 0;
- // guarantee uniqueness
- if(mSinkList.containsKey(sink)) {
- return;
- }
-
- HashMap<FusedLocationHardwareSink, DispatcherHandler> newSinkList =
- new HashMap<FusedLocationHardwareSink, DispatcherHandler>(mSinkList);
- newSinkList.put(sink, new DispatcherHandler(looper));
- mSinkList = newSinkList;
- }
-
- if(registerSink) {
- try {
- mLocationHardware.registerSink(mInternalSink);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at registerSink");
- }
- }
- }
-
- public void unregisterSink(FusedLocationHardwareSink sink) {
- if(sink == null) {
- throw new IllegalArgumentException("Parameter sink cannot be null.");
- }
-
- boolean unregisterSink;
- synchronized(mSinkList) {
- if(!mSinkList.containsKey(sink)) {
- //done
- return;
- }
-
- HashMap<FusedLocationHardwareSink, DispatcherHandler> newSinkList =
- new HashMap<FusedLocationHardwareSink, DispatcherHandler>(mSinkList);
- newSinkList.remove(sink);
- //unregister after the last sink
- unregisterSink = newSinkList.size() == 0;
-
- mSinkList = newSinkList;
- }
-
- if(unregisterSink) {
- try {
- mLocationHardware.unregisterSink(mInternalSink);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at unregisterSink");
- }
- }
- }
-
- public int getSupportedBatchSize() {
- try {
- return mLocationHardware.getSupportedBatchSize();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at getSupportedBatchSize");
- return 0;
- }
- }
-
- public void startBatching(int id, GmsFusedBatchOptions batchOptions) {
- try {
- mLocationHardware.startBatching(id, batchOptions.getParcelableOptions());
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at startBatching");
- }
- }
-
- public void stopBatching(int id) {
- try {
- mLocationHardware.stopBatching(id);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at stopBatching");
- }
- }
-
- public void updateBatchingOptions(int id, GmsFusedBatchOptions batchOptions) {
- try {
- mLocationHardware.updateBatchingOptions(id, batchOptions.getParcelableOptions());
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at updateBatchingOptions");
- }
- }
-
- public void requestBatchOfLocations(int batchSizeRequest) {
- try {
- mLocationHardware.requestBatchOfLocations(batchSizeRequest);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at requestBatchOfLocations");
- }
- }
-
- public void flushBatchedLocations() {
- try {
- mLocationHardware.flushBatchedLocations();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at flushBatchedLocations");
- }
- }
-
- public boolean supportsDiagnosticDataInjection() {
- try {
- return mLocationHardware.supportsDiagnosticDataInjection();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at supportsDiagnisticDataInjection");
- return false;
- }
- }
-
- public void injectDiagnosticData(String data) {
- try {
- mLocationHardware.injectDiagnosticData(data);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at injectDiagnosticData");
- }
- }
-
- public boolean supportsDeviceContextInjection() {
- try {
- return mLocationHardware.supportsDeviceContextInjection();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at supportsDeviceContextInjection");
- return false;
- }
- }
-
- public void injectDeviceContext(int deviceEnabledContext) {
- try {
- mLocationHardware.injectDeviceContext(deviceEnabledContext);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at injectDeviceContext");
- }
- }
-
-
- /**
- * Returns the version of the FLP HAL.
- *
- * <p>Version 1 is the initial release.
- * <p>Version 2 adds the ability to use {@link #flushBatchedLocations},
- * {@link FusedLocationHardwareSink#onCapabilities}, and
- * {@link FusedLocationHardwareSink#onStatusChanged}.
- *
- * <p>This method is only available on API 23 or later. Older APIs have version 1.
- */
- public int getVersion() {
- try {
- return mLocationHardware.getVersion();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at getVersion");
- }
- return 1;
- }
-
- /*
- * Helper methods and classes
- */
- private class DispatcherHandler extends Handler {
- public static final int DISPATCH_LOCATION = 1;
- public static final int DISPATCH_DIAGNOSTIC_DATA = 2;
- public static final int DISPATCH_CAPABILITIES = 3;
- public static final int DISPATCH_STATUS = 4;
-
- public DispatcherHandler(Looper looper) {
- super(looper, null /*callback*/ , true /*async*/);
- }
-
- @Override
- public void handleMessage(Message message) {
- MessageCommand command = (MessageCommand) message.obj;
- switch(message.what) {
- case DISPATCH_LOCATION:
- command.dispatchLocation();
- break;
- case DISPATCH_DIAGNOSTIC_DATA:
- command.dispatchDiagnosticData();
- break;
- case DISPATCH_CAPABILITIES:
- command.dispatchCapabilities();
- break;
- case DISPATCH_STATUS:
- command.dispatchStatus();
- break;
- default:
- Log.e(TAG, "Invalid dispatch message");
- break;
- }
- }
- }
-
- private class MessageCommand {
- private final FusedLocationHardwareSink mSink;
- private final Location[] mLocations;
- private final String mData;
- private final int mCapabilities;
- private final int mStatus;
-
- public MessageCommand(
- FusedLocationHardwareSink sink,
- Location[] locations,
- String data,
- int capabilities,
- int status) {
- mSink = sink;
- mLocations = locations;
- mData = data;
- mCapabilities = capabilities;
- mStatus = status;
- }
-
- public void dispatchLocation() {
- mSink.onLocationAvailable(mLocations);
- }
-
- public void dispatchDiagnosticData() {
- mSink.onDiagnosticDataAvailable(mData);
- }
-
- public void dispatchCapabilities() {
- mSink.onCapabilities(mCapabilities);
- }
-
- public void dispatchStatus() {
- mSink.onStatusChanged(mStatus);
- }
- }
-
- private void dispatchLocations(Location[] locations) {
- HashMap<FusedLocationHardwareSink, DispatcherHandler> sinks;
- synchronized (mSinkList) {
- sinks = mSinkList;
- }
-
- for(Map.Entry<FusedLocationHardwareSink, DispatcherHandler> entry : sinks.entrySet()) {
- Message message = Message.obtain(
- entry.getValue(),
- DispatcherHandler.DISPATCH_LOCATION,
- new MessageCommand(entry.getKey(), locations, null /*data*/, 0, 0));
- message.sendToTarget();
- }
- }
-
- private void dispatchDiagnosticData(String data) {
- HashMap<FusedLocationHardwareSink, DispatcherHandler> sinks;
- synchronized(mSinkList) {
- sinks = mSinkList;
- }
-
- for(Map.Entry<FusedLocationHardwareSink, DispatcherHandler> entry : sinks.entrySet()) {
- Message message = Message.obtain(
- entry.getValue(),
- DispatcherHandler.DISPATCH_DIAGNOSTIC_DATA,
- new MessageCommand(entry.getKey(), null /*locations*/, data, 0, 0));
- message.sendToTarget();
- }
- }
-
- private void dispatchCapabilities(int capabilities) {
- HashMap<FusedLocationHardwareSink, DispatcherHandler> sinks;
- synchronized(mSinkList) {
- sinks = mSinkList;
- }
-
- for(Map.Entry<FusedLocationHardwareSink, DispatcherHandler> entry : sinks.entrySet()) {
- Message message = Message.obtain(
- entry.getValue(),
- DispatcherHandler.DISPATCH_CAPABILITIES,
- new MessageCommand(entry.getKey(), null /*locations*/, null, capabilities, 0));
- message.sendToTarget();
- }
- }
-
- private void dispatchStatus(int status) {
- HashMap<FusedLocationHardwareSink, DispatcherHandler> sinks;
- synchronized(mSinkList) {
- sinks = mSinkList;
- }
-
- for(Map.Entry<FusedLocationHardwareSink, DispatcherHandler> entry : sinks.entrySet()) {
- Message message = Message.obtain(
- entry.getValue(),
- DispatcherHandler.DISPATCH_STATUS,
- new MessageCommand(entry.getKey(), null /*locations*/, null, 0, status));
- message.sendToTarget();
- }
- }
-}
diff --git a/location/lib/java/com/android/location/provider/FusedLocationHardwareSink.java b/location/lib/java/com/android/location/provider/FusedLocationHardwareSink.java
deleted file mode 100644
index 01d37ac..0000000
--- a/location/lib/java/com/android/location/provider/FusedLocationHardwareSink.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.location.provider;
-
-import android.location.Location;
-
-/**
- * Base class for sinks to interact with FusedLocationHardware.
- *
- * <p>Default implementations allow new methods to be added without crashing
- * clients compiled against an old library version.
- */
-public class FusedLocationHardwareSink {
- /**
- * Called when one or more locations are available from the FLP
- * HAL.
- */
- public void onLocationAvailable(Location[] locations) {
- // default do nothing
- }
-
- /**
- * Called when diagnostic data is available from the FLP HAL.
- */
- public void onDiagnosticDataAvailable(String data) {
- // default do nothing
- }
-
- /**
- * Called when capabilities are available from the FLP HAL.
- * Should be called once right after initialization.
- *
- * @param capabilities A bitmask of capabilities defined in
- * fused_location.h.
- */
- public void onCapabilities(int capabilities) {
- // default do nothing
- }
-
- /**
- * Called when the status changes in the underlying FLP HAL
- * implementation (the ability to compute location). This
- * callback will only be made on version 2 or later
- * (see {@link FusedLocationHardware#getVersion()}).
- *
- * @param status One of FLP_STATUS_LOCATION_AVAILABLE or
- * FLP_STATUS_LOCATION_UNAVAILABLE as defined in
- * fused_location.h.
- */
- public void onStatusChanged(int status) {
- // default do nothing
- }
-}
\ No newline at end of file
diff --git a/location/lib/java/com/android/location/provider/FusedProvider.java b/location/lib/java/com/android/location/provider/FusedProvider.java
index c966ade..78a593b 100644
--- a/location/lib/java/com/android/location/provider/FusedProvider.java
+++ b/location/lib/java/com/android/location/provider/FusedProvider.java
@@ -16,8 +16,6 @@
package com.android.location.provider;
-import android.hardware.location.IFusedLocationHardware;
-import android.location.IFusedProvider;
import android.os.IBinder;
/**
@@ -26,17 +24,12 @@
* <p>Fused providers can be implemented as services and return the result of
* {@link com.android.location.provider.FusedProvider#getBinder()} in its getBinder() method.
*
- * <p>IMPORTANT: This class is effectively a public API for unbundled applications, and must remain
- * API stable. See README.txt in the root of this package for more information.
+ * @deprecated This class should no longer be used. The location service does not uses this.
+ * This class exist here just to prevent existing apps having reference to this class from
+ * breaking.
*/
+@Deprecated
public abstract class FusedProvider {
- private IFusedProvider.Stub mProvider = new IFusedProvider.Stub() {
- @Override
- public void onFusedLocationHardwareChange(IFusedLocationHardware instance) {
- setFusedLocationHardware(new FusedLocationHardware(instance));
- }
- };
-
/**
* Gets the Binder associated with the provider.
* This is intended to be used for the onBind() method of a service that implements a fused
@@ -45,13 +38,6 @@
* @return The IBinder instance associated with the provider.
*/
public IBinder getBinder() {
- return mProvider;
+ return null;
}
-
- /**
- * Sets the FusedLocationHardware instance in the provider..
- * @param value The instance to set. This can be null in cases where the service connection
- * is disconnected.
- */
- public abstract void setFusedLocationHardware(FusedLocationHardware value);
}
diff --git a/location/lib/java/com/android/location/provider/GeocodeProvider.java b/location/lib/java/com/android/location/provider/GeocodeProvider.java
index d7a34af..f7f3d82 100644
--- a/location/lib/java/com/android/location/provider/GeocodeProvider.java
+++ b/location/lib/java/com/android/location/provider/GeocodeProvider.java
@@ -33,6 +33,7 @@
* <p>IMPORTANT: This class is effectively a public API for unbundled
* applications, and must remain API stable. See README.txt in the root
* of this package for more information.
+ * @hide
*/
public abstract class GeocodeProvider {
diff --git a/location/lib/java/com/android/location/provider/GeofenceProvider.java b/location/lib/java/com/android/location/provider/GeofenceProvider.java
index fafaa84..43690ab 100644
--- a/location/lib/java/com/android/location/provider/GeofenceProvider.java
+++ b/location/lib/java/com/android/location/provider/GeofenceProvider.java
@@ -31,6 +31,7 @@
* <p>IMPORTANT: This class is effectively a public API for unbundled
* applications, and must remain API stable. See README.txt in the root
* of this package for more information.
+ * @hide
*/
public abstract class GeofenceProvider {
diff --git a/location/lib/java/com/android/location/provider/GmsFusedBatchOptions.java b/location/lib/java/com/android/location/provider/GmsFusedBatchOptions.java
deleted file mode 100644
index 29818ec..0000000
--- a/location/lib/java/com/android/location/provider/GmsFusedBatchOptions.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.location.provider;
-
-import android.location.FusedBatchOptions;
-
-/**
- * Class that exposes FusedBatchOptions to the GmsCore .
- */
-public class GmsFusedBatchOptions {
- private FusedBatchOptions mOptions = new FusedBatchOptions();
-
- /*
- * Methods that provide a facade for properties in FusedBatchOptions.
- */
- public void setMaxPowerAllocationInMW(double value) {
- mOptions.setMaxPowerAllocationInMW(value);
- }
-
- public double getMaxPowerAllocationInMW() {
- return mOptions.getMaxPowerAllocationInMW();
- }
-
- public void setPeriodInNS(long value) {
- mOptions.setPeriodInNS(value);
- }
-
- public long getPeriodInNS() {
- return mOptions.getPeriodInNS();
- }
-
- public void setSmallestDisplacementMeters(float value) {
- mOptions.setSmallestDisplacementMeters(value);
- }
-
- public float getSmallestDisplacementMeters() {
- return mOptions.getSmallestDisplacementMeters();
- }
-
- public void setSourceToUse(int source) {
- mOptions.setSourceToUse(source);
- }
-
- public void resetSourceToUse(int source) {
- mOptions.resetSourceToUse(source);
- }
-
- public boolean isSourceToUseSet(int source) {
- return mOptions.isSourceToUseSet(source);
- }
-
- public int getSourcesToUse() {
- return mOptions.getSourcesToUse();
- }
-
- public void setFlag(int flag) {
- mOptions.setFlag(flag);
- }
-
- public void resetFlag(int flag) {
- mOptions.resetFlag(flag);
- }
-
- public boolean isFlagSet(int flag) {
- return mOptions.isFlagSet(flag);
- }
-
- public int getFlags() {
- return mOptions.getFlags();
- }
-
- /**
- * Definition of enum flag sets needed by this class.
- * Such values need to be kept in sync with the ones in fused_location.h
- */
-
- public static final class SourceTechnologies {
- public static int GNSS = 1<<0;
- public static int WIFI = 1<<1;
- public static int SENSORS = 1<<2;
- public static int CELL = 1<<3;
- public static int BLUETOOTH = 1<<4;
- }
-
- public static final class BatchFlags {
- public static int WAKEUP_ON_FIFO_FULL = 1<<0;
- public static int CALLBACK_ON_LOCATION_FIX = 1<<1;
- }
-
- /*
- * Method definitions for internal use.
- */
-
- /*
- * @hide
- */
- public FusedBatchOptions getParcelableOptions() {
- return mOptions;
- }
-}
diff --git a/location/lib/java/com/android/location/provider/LocationProviderBase.java b/location/lib/java/com/android/location/provider/LocationProviderBase.java
index d717f40..30655f5 100644
--- a/location/lib/java/com/android/location/provider/LocationProviderBase.java
+++ b/location/lib/java/com/android/location/provider/LocationProviderBase.java
@@ -56,6 +56,7 @@
public abstract class LocationProviderBase {
private final String TAG;
+ /** @hide */
protected final ILocationManager mLocationManager;
private final ProviderProperties mProperties;
private final IBinder mBinder;
diff --git a/location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java b/location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java
index 9ee4df21..b1a1bda 100644
--- a/location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java
+++ b/location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java
@@ -41,6 +41,7 @@
mProperties = properties;
}
+ /** @hide */
public ProviderProperties getProviderProperties() {
return mProperties;
}
diff --git a/location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java b/location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java
index ad3d1df..6a8e618 100644
--- a/location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java
+++ b/location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java
@@ -33,6 +33,7 @@
public final class ProviderRequestUnbundled {
private final ProviderRequest mRequest;
+ /** @hide */
public ProviderRequestUnbundled(ProviderRequest request) {
mRequest = request;
}
diff --git a/media/java/android/media/AudioPresentation.java b/media/java/android/media/AudioPresentation.java
index 4652c18..e39cb7d 100644
--- a/media/java/android/media/AudioPresentation.java
+++ b/media/java/android/media/AudioPresentation.java
@@ -17,6 +17,9 @@
package android.media;
import android.annotation.IntDef;
+import android.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -88,10 +91,14 @@
*/
public static final int MASTERED_FOR_HEADPHONE = 4;
- AudioPresentation(int presentationId,
+ /**
+ * @hide
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public AudioPresentation(int presentationId,
int programId,
- Map<String, String> labels,
- String language,
+ @NonNull Map<String, String> labels,
+ @NonNull String language,
@MasteringIndicationType int masteringIndication,
boolean audioDescriptionAvailable,
boolean spokenSubtitlesAvailable,
@@ -112,6 +119,7 @@
* decoder. Presentation id is typically sequential, but does not have to be.
* @hide
*/
+ @VisibleForTesting
public int getPresentationId() {
return mPresentationId;
}
@@ -121,13 +129,14 @@
* Program id can be used to further uniquely identify the presentation to a decoder.
* @hide
*/
+ @VisibleForTesting
public int getProgramId() {
return mProgramId;
}
/**
* @return a map of available text labels for this presentation. Each label is indexed by its
- * locale corresponding to the language code as specified by ISO 639-2 [42]. Either ISO 639-2/B
+ * locale corresponding to the language code as specified by ISO 639-2. Either ISO 639-2/B
* or ISO 639-2/T could be used.
*/
public Map<Locale, String> getLabels() {
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 2d5fad5..9c48e09 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -2012,9 +2012,10 @@
* If the audio presentation is invalid then {@link #ERROR_BAD_VALUE} will be returned.
* If a multi-stream decoder (MSD) is not present, or the format does not support
* multiple presentations, then {@link #ERROR_INVALID_OPERATION} will be returned.
+ * {@link #ERROR} is returned in case of any other error.
* @param presentation see {@link AudioPresentation}. In particular, id should be set.
- * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE},
- * {@link #ERROR_INVALID_OPERATION}
+ * @return error code or success, see {@link #SUCCESS}, {@link #ERROR},
+ * {@link #ERROR_BAD_VALUE}, {@link #ERROR_INVALID_OPERATION}
* @throws IllegalArgumentException if the audio presentation is null.
* @throws IllegalStateException if track is not initialized.
*/
diff --git a/media/java/android/media/MediaBrowser2.java b/media/java/android/media/MediaBrowser2.java
index cf33958..f246005 100644
--- a/media/java/android/media/MediaBrowser2.java
+++ b/media/java/android/media/MediaBrowser2.java
@@ -142,8 +142,8 @@
@Override
MediaBrowser2Provider createProvider(Context context, SessionToken2 token,
Executor executor, ControllerCallback callback) {
- return ApiLoader.getProvider(context)
- .createMediaBrowser2(context, this, token, executor, (BrowserCallback) callback);
+ return ApiLoader.getProvider().createMediaBrowser2(
+ context, this, token, executor, (BrowserCallback) callback);
}
/**
diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java
index 20c3209..14dcced 100644
--- a/media/java/android/media/MediaController2.java
+++ b/media/java/android/media/MediaController2.java
@@ -366,8 +366,8 @@
MediaController2Provider createProvider(@NonNull Context context,
@NonNull SessionToken2 token, @NonNull Executor executor,
@NonNull ControllerCallback callback) {
- return ApiLoader.getProvider(context)
- .createMediaController2(context, this, token, executor, callback);
+ return ApiLoader.getProvider().createMediaController2(
+ context, this, token, executor, callback);
}
/**
diff --git a/media/java/android/media/MediaItem2.java b/media/java/android/media/MediaItem2.java
index b50c3e4..8d62bd4 100644
--- a/media/java/android/media/MediaItem2.java
+++ b/media/java/android/media/MediaItem2.java
@@ -81,7 +81,7 @@
}
public static MediaItem2 fromBundle(Context context, Bundle bundle) {
- return ApiLoader.getProvider(context).fromBundle_MediaItem2(context, bundle);
+ return ApiLoader.getProvider().fromBundle_MediaItem2(context, bundle);
}
public String toString() {
@@ -164,8 +164,7 @@
* @param flags
*/
public Builder(@NonNull Context context, @Flags int flags) {
- mProvider = ApiLoader.getProvider(context).createMediaItem2Builder(
- context, this, flags);
+ mProvider = ApiLoader.getProvider().createMediaItem2Builder(context, this, flags);
}
/**
diff --git a/media/java/android/media/MediaLibraryService2.java b/media/java/android/media/MediaLibraryService2.java
index 6cab430..f3684d6 100644
--- a/media/java/android/media/MediaLibraryService2.java
+++ b/media/java/android/media/MediaLibraryService2.java
@@ -210,9 +210,8 @@
public Builder(@NonNull MediaLibraryService2 service,
@NonNull @CallbackExecutor Executor callbackExecutor,
@NonNull MediaLibrarySessionCallback callback) {
- super((instance) -> ApiLoader.getProvider(service)
- .createMediaLibraryService2Builder(service, (Builder) instance,
- callbackExecutor, callback));
+ super((instance) -> ApiLoader.getProvider().createMediaLibraryService2Builder(
+ service, (Builder) instance, callbackExecutor, callback));
}
@Override
@@ -309,7 +308,7 @@
@Override
MediaSessionService2Provider createProvider() {
- return ApiLoader.getProvider(this).createMediaLibraryService2(this);
+ return ApiLoader.getProvider().createMediaLibraryService2(this);
}
/**
@@ -403,7 +402,7 @@
*/
public LibraryRoot(@NonNull Context context,
@NonNull String rootId, @Nullable Bundle extras) {
- mProvider = ApiLoader.getProvider(context).createMediaLibraryService2LibraryRoot(
+ mProvider = ApiLoader.getProvider().createMediaLibraryService2LibraryRoot(
context, this, rootId, extras);
}
diff --git a/media/java/android/media/MediaMetadata2.java b/media/java/android/media/MediaMetadata2.java
index fb12065..2ba66b2 100644
--- a/media/java/android/media/MediaMetadata2.java
+++ b/media/java/android/media/MediaMetadata2.java
@@ -684,7 +684,7 @@
*/
public static @NonNull MediaMetadata2 fromBundle(@NonNull Context context,
@Nullable Bundle bundle) {
- return ApiLoader.getProvider(context).fromBundle_MediaMetadata2(context, bundle);
+ return ApiLoader.getProvider().fromBundle_MediaMetadata2(context, bundle);
}
/**
@@ -699,8 +699,7 @@
* {@link MediaMetadata2} must be added.
*/
public Builder(@NonNull Context context) {
- mProvider = ApiLoader.getProvider(context).createMediaMetadata2Builder(
- context, this);
+ mProvider = ApiLoader.getProvider().createMediaMetadata2Builder(context, this);
}
/**
@@ -711,8 +710,7 @@
* @param source
*/
public Builder(@NonNull Context context, @NonNull MediaMetadata2 source) {
- mProvider = ApiLoader.getProvider(context).createMediaMetadata2Builder(
- context, this, source);
+ mProvider = ApiLoader.getProvider().createMediaMetadata2Builder(context, this, source);
}
/**
diff --git a/media/java/android/media/MediaPlaylistAgent.java b/media/java/android/media/MediaPlaylistAgent.java
index 6b3620b..1250810 100644
--- a/media/java/android/media/MediaPlaylistAgent.java
+++ b/media/java/android/media/MediaPlaylistAgent.java
@@ -148,7 +148,7 @@
}
public MediaPlaylistAgent(@NonNull Context context) {
- mProvider = ApiLoader.getProvider(context).createMediaPlaylistAgent(context, this);
+ mProvider = ApiLoader.getProvider().createMediaPlaylistAgent(context, this);
}
/**
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index 6647831..472d942 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -431,16 +431,16 @@
private final CommandProvider mProvider;
public Command(@NonNull Context context, int commandCode) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2Command(this, commandCode, null, null);
+ mProvider = ApiLoader.getProvider().createMediaSession2Command(
+ this, commandCode, null, null);
}
public Command(@NonNull Context context, @NonNull String action, @Nullable Bundle extras) {
if (action == null) {
throw new IllegalArgumentException("action shouldn't be null");
}
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2Command(this, COMMAND_CODE_CUSTOM, action, extras);
+ mProvider = ApiLoader.getProvider().createMediaSession2Command(
+ this, COMMAND_CODE_CUSTOM, action, extras);
}
/**
@@ -488,7 +488,7 @@
* @hide
*/
public static Command fromBundle(@NonNull Context context, @NonNull Bundle command) {
- return ApiLoader.getProvider(context).fromBundle_MediaSession2Command(context, command);
+ return ApiLoader.getProvider().fromBundle_MediaSession2Command(context, command);
}
}
@@ -499,13 +499,13 @@
private final CommandGroupProvider mProvider;
public CommandGroup(@NonNull Context context) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2CommandGroup(context, this, null);
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandGroup(
+ context, this, null);
}
public CommandGroup(@NonNull Context context, @Nullable CommandGroup others) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2CommandGroup(context, this, others);
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandGroup(
+ context, this, others);
}
/**
@@ -559,8 +559,7 @@
* @hide
*/
public static @Nullable CommandGroup fromBundle(Context context, Bundle commands) {
- return ApiLoader.getProvider(context)
- .fromBundle_MediaSession2CommandGroup(context, commands);
+ return ApiLoader.getProvider().fromBundle_MediaSession2CommandGroup(context, commands);
}
}
@@ -1010,7 +1009,7 @@
// This workarounds javadoc issue described in the MediaSession2.BuilderBase.
public static final class Builder extends BuilderBase<MediaSession2, Builder, SessionCallback> {
public Builder(Context context) {
- super((instance) -> ApiLoader.getProvider(context).createMediaSession2Builder(
+ super((instance) -> ApiLoader.getProvider().createMediaSession2Builder(
context, (Builder) instance));
}
@@ -1062,9 +1061,8 @@
*/
public ControllerInfo(@NonNull Context context, int uid, int pid,
@NonNull String packageName, @NonNull IInterface callback) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2ControllerInfo(
- context, this, uid, pid, packageName, callback);
+ mProvider = ApiLoader.getProvider().createMediaSession2ControllerInfo(
+ context, this, uid, pid, packageName, callback);
}
/**
@@ -1192,8 +1190,8 @@
private final CommandButtonProvider.BuilderProvider mProvider;
public Builder(@NonNull Context context) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2CommandButtonBuilder(context, this);
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandButtonBuilder(
+ context, this);
}
public @NonNull Builder setCommand(@Nullable Command command) {
diff --git a/media/java/android/media/MediaSessionService2.java b/media/java/android/media/MediaSessionService2.java
index 32caf4b..b830694 100644
--- a/media/java/android/media/MediaSessionService2.java
+++ b/media/java/android/media/MediaSessionService2.java
@@ -123,7 +123,7 @@
}
MediaSessionService2Provider createProvider() {
- return ApiLoader.getProvider(this).createMediaSessionService2(this);
+ return ApiLoader.getProvider().createMediaSessionService2(this);
}
/**
@@ -220,9 +220,8 @@
*/
public MediaNotification(@NonNull Context context,
int notificationId, @NonNull Notification notification) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSessionService2MediaNotification(
- context, this, notificationId, notification);
+ mProvider = ApiLoader.getProvider().createMediaSessionService2MediaNotification(
+ context, this, notificationId, notification);
}
public int getNotificationId() {
diff --git a/media/java/android/media/Rating2.java b/media/java/android/media/Rating2.java
index 29bd922..5f7a334 100644
--- a/media/java/android/media/Rating2.java
+++ b/media/java/android/media/Rating2.java
@@ -131,7 +131,7 @@
* @return new Rating2 instance or {@code null} for error
*/
public static Rating2 fromBundle(@NonNull Context context, @Nullable Bundle bundle) {
- return ApiLoader.getProvider(context).fromBundle_Rating2(context, bundle);
+ return ApiLoader.getProvider().fromBundle_Rating2(context, bundle);
}
/**
@@ -154,7 +154,7 @@
*/
public static @Nullable Rating2 newUnratedRating(@NonNull Context context,
@Style int ratingStyle) {
- return ApiLoader.getProvider(context).newUnratedRating_Rating2(context, ratingStyle);
+ return ApiLoader.getProvider().newUnratedRating_Rating2(context, ratingStyle);
}
/**
@@ -166,7 +166,7 @@
* @return a new Rating2 instance.
*/
public static @Nullable Rating2 newHeartRating(@NonNull Context context, boolean hasHeart) {
- return ApiLoader.getProvider(context).newHeartRating_Rating2(context, hasHeart);
+ return ApiLoader.getProvider().newHeartRating_Rating2(context, hasHeart);
}
/**
@@ -178,7 +178,7 @@
* @return a new Rating2 instance.
*/
public static @Nullable Rating2 newThumbRating(@NonNull Context context, boolean thumbIsUp) {
- return ApiLoader.getProvider(context).newThumbRating_Rating2(context, thumbIsUp);
+ return ApiLoader.getProvider().newThumbRating_Rating2(context, thumbIsUp);
}
/**
@@ -196,8 +196,7 @@
*/
public static @Nullable Rating2 newStarRating(@NonNull Context context,
@StarStyle int starRatingStyle, float starRating) {
- return ApiLoader.getProvider(context).newStarRating_Rating2(
- context, starRatingStyle, starRating);
+ return ApiLoader.getProvider().newStarRating_Rating2(context, starRatingStyle, starRating);
}
/**
@@ -209,7 +208,7 @@
* @return null if the rating is out of range, a new Rating2 instance otherwise.
*/
public static @Nullable Rating2 newPercentageRating(@NonNull Context context, float percent) {
- return ApiLoader.getProvider(context).newPercentageRating_Rating2(context, percent);
+ return ApiLoader.getProvider().newPercentageRating_Rating2(context, percent);
}
/**
diff --git a/media/java/android/media/SessionToken2.java b/media/java/android/media/SessionToken2.java
index fdfa43a..68a5641 100644
--- a/media/java/android/media/SessionToken2.java
+++ b/media/java/android/media/SessionToken2.java
@@ -80,7 +80,7 @@
*/
public SessionToken2(@NonNull Context context, @NonNull String packageName,
@NonNull String serviceName, int uid) {
- mProvider = ApiLoader.getProvider(context).createSessionToken2(
+ mProvider = ApiLoader.getProvider().createSessionToken2(
context, this, packageName, serviceName, uid);
}
@@ -150,7 +150,7 @@
* @return
*/
public static SessionToken2 fromBundle(@NonNull Context context, @NonNull Bundle bundle) {
- return ApiLoader.getProvider(context).fromBundle_SessionToken2(context, bundle);
+ return ApiLoader.getProvider().fromBundle_SessionToken2(context, bundle);
}
/**
diff --git a/media/java/android/media/VolumeProvider2.java b/media/java/android/media/VolumeProvider2.java
index 711f51f..8501924 100644
--- a/media/java/android/media/VolumeProvider2.java
+++ b/media/java/android/media/VolumeProvider2.java
@@ -76,7 +76,7 @@
*/
public VolumeProvider2(@NonNull Context context, @ControlType int controlType,
int maxVolume, int currentVolume) {
- mProvider = ApiLoader.getProvider(context).createVolumeProvider2(
+ mProvider = ApiLoader.getProvider().createVolumeProvider2(
context, this, controlType, maxVolume, currentVolume);
}
diff --git a/media/java/android/media/update/ApiLoader.java b/media/java/android/media/update/ApiLoader.java
index cf18bdd..6f82f68 100644
--- a/media/java/android/media/update/ApiLoader.java
+++ b/media/java/android/media/update/ApiLoader.java
@@ -46,11 +46,6 @@
private ApiLoader() { }
- @Deprecated
- public static StaticProvider getProvider(Context context) {
- return getProvider();
- }
-
public static StaticProvider getProvider() {
if (sMediaUpdatable != null) return sMediaUpdatable;
@@ -79,7 +74,7 @@
ActivityManager.getService().addPackageDependency(ai.packageName);
}
- PathClassLoader classLoader = new PathClassLoader(ai.sourceDir,
+ ClassLoader classLoader = new PathClassLoader(ai.sourceDir,
ai.nativeLibraryDir + File.pathSeparator + System.getProperty("java.library.path"),
ClassLoader.getSystemClassLoader().getParent());
return sMediaUpdatable = (StaticProvider) classLoader.loadClass(UPDATE_CLASS)
diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp
index 23ef84f6..12d7440 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -39,6 +39,7 @@
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
#include <jni.h>
+#include <media/stagefright/NuMediaExtractor.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedLocalRef.h>
@@ -788,6 +789,41 @@
return exif_get_long(e->data, o);
}
+static ExifData *getExifFromExtractor(const char *path) {
+ std::unique_ptr<uint8_t[]> exifBuf;
+ ExifData *exifdata = NULL;
+
+ FILE *fp = fopen (path, "rb");
+ if (!fp) {
+ ALOGE("failed to open file");
+ return NULL;
+ }
+
+ sp<NuMediaExtractor> extractor = new NuMediaExtractor();
+ fseek(fp, 0L, SEEK_END);
+ if (extractor->setDataSource(fileno(fp), 0, ftell(fp)) != OK) {
+ ALOGE("failed to setDataSource");
+ fclose(fp);
+ return NULL;
+ }
+
+ off64_t offset;
+ size_t size;
+ if (extractor->getExifOffsetSize(&offset, &size) != OK) {
+ fclose(fp);
+ return NULL;
+ }
+
+ exifBuf.reset(new uint8_t[size]);
+ fseek(fp, offset, SEEK_SET);
+ if (fread(exifBuf.get(), 1, size, fp) == size) {
+ exifdata = exif_data_new_from_data(exifBuf.get(), size);
+ }
+
+ fclose(fp);
+ return exifdata;
+}
+
MtpResponseCode MtpDatabase::getObjectInfo(MtpObjectHandle handle,
MtpObjectInfo& info) {
MtpString path;
@@ -834,7 +870,12 @@
case MTP_FORMAT_EXIF_JPEG:
case MTP_FORMAT_HEIF:
case MTP_FORMAT_JFIF: {
- ExifData *exifdata = exif_data_new_from_file(path);
+ ExifData *exifdata;
+ if (info.mFormat == MTP_FORMAT_HEIF) {
+ exifdata = getExifFromExtractor(path);
+ } else {
+ exifdata = exif_data_new_from_file(path);
+ }
if (exifdata) {
if ((false)) {
exif_data_foreach_content(exifdata, foreachcontent, NULL);
@@ -892,7 +933,12 @@
case MTP_FORMAT_EXIF_JPEG:
case MTP_FORMAT_HEIF:
case MTP_FORMAT_JFIF: {
- ExifData *exifdata = exif_data_new_from_file(path);
+ ExifData *exifdata;
+ if (format == MTP_FORMAT_HEIF) {
+ exifdata = getExifFromExtractor(path);
+ } else {
+ exifdata = exif_data_new_from_file(path);
+ }
if (exifdata) {
if (exifdata->data) {
result = malloc(exifdata->size);
diff --git a/packages/PrintSpooler/res/drawable/ic_pdf_printer.xml b/packages/PrintSpooler/res/drawable/ic_pdf_printer.xml
index b8a0689..8196650 100644
--- a/packages/PrintSpooler/res/drawable/ic_pdf_printer.xml
+++ b/packages/PrintSpooler/res/drawable/ic_pdf_printer.xml
@@ -18,7 +18,7 @@
android:height="36dp"
android:viewportWidth="48.0"
android:viewportHeight="48.0"
- android:tint="@*android:color/accent_device_default_light">
+ android:tint="@color/pdf_printer_color">
<path
android:pathData="M40,4L16,4c-2.21,0 -4,1.79 -4,4v24c0,2.21 1.79,4 4,4h24c2.21,0 4,-1.79 4,-4L44,8c0,-2.21 -1.79,-4 -4,-4zM23,19c0,1.66 -1.34,3 -3,3h-2v4h-3L15,14h5c1.66,0 3,1.34 3,3v2zM33,23c0,1.66 -1.34,3 -3,3h-5L25,14h5c1.66,0 3,1.34 3,3v6zM41,17h-3v2h3v3h-3v4h-3L35,14h6v3zM18,19h2v-2h-2v2zM8,12L4,12v28c0,2.21 1.79,4 4,4h28v-4L8,40L8,12zM28,23h2v-6h-2v6z"
android:fillColor="@android:color/black"/>
diff --git a/packages/PrintSpooler/res/values/colors.xml b/packages/PrintSpooler/res/values/colors.xml
index 68bc6f2..a15fff5 100644
--- a/packages/PrintSpooler/res/values/colors.xml
+++ b/packages/PrintSpooler/res/values/colors.xml
@@ -23,4 +23,6 @@
<color name="unselected_page_background_color">#C0C0C0</color>
<color name="material_grey_500">#ffa3a3a3</color>
+
+ <color name="pdf_printer_color">#009688</color>
</resources>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 589608a..98ef62ad7 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -1093,4 +1093,7 @@
<string name="zen_mode_duration_settings_title">Duration</string>
<!-- Do not disturb: Duration option to always prompt for the duration of dnd -->
<string name="zen_mode_duration_always_prompt_title">Ask every time</string>
+
+ <!-- time label for event have that happened very recently [CHAR LIMIT=60] -->
+ <string name="time_unit_just_now">Just now</string>
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
index 68be2b4..81a2d43 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
@@ -27,6 +27,9 @@
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.TtsSpan;
+
+import com.android.settingslib.R;
+
import java.util.ArrayList;
import java.util.Locale;
@@ -121,8 +124,7 @@
final RelativeUnit unit;
final int value;
if (withSeconds && seconds < 2 * SECONDS_PER_MINUTE) {
- unit = RelativeUnit.SECONDS;
- value = seconds;
+ return context.getResources().getString(R.string.time_unit_just_now);
} else if (seconds < 2 * SECONDS_PER_HOUR) {
unit = RelativeUnit.MINUTES;
value = (seconds + SECONDS_PER_MINUTE / 2)
@@ -141,7 +143,7 @@
final RelativeDateTimeFormatter formatter = RelativeDateTimeFormatter.getInstance(
ULocale.forLocale(locale),
null /* default NumberFormat */,
- RelativeDateTimeFormatter.Style.SHORT,
+ RelativeDateTimeFormatter.Style.LONG,
android.icu.text.DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE);
return formatter.format(value, RelativeDateTimeFormatter.Direction.LAST, unit);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
index 47dd022..532c755 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
@@ -114,7 +114,7 @@
@Test
public void testFormatRelativeTime_WithSeconds_ShowSeconds() {
final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "40 sec. ago";
+ final String expectedTime = "Just now";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -123,7 +123,7 @@
@Test
public void testFormatRelativeTime_NoSeconds_DoNotShowSeconds() {
final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "1 min. ago";
+ final String expectedTime = "1 minute ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
expectedTime);
@@ -132,7 +132,7 @@
@Test
public void testFormatRelativeTime_LessThanTwoMinutes_withSeconds() {
final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "119 sec. ago";
+ final String expectedTime = "Just now";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -141,7 +141,7 @@
@Test
public void testFormatRelativeTime_LessThanTwoMinutes_NoSeconds() {
final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "2 min. ago";
+ final String expectedTime = "2 minutes ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
expectedTime);
@@ -150,7 +150,7 @@
@Test
public void testFormatRelativeTime_TwoMinutes_withSeconds() {
final double testMillis = 2 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "2 min. ago";
+ final String expectedTime = "2 minutes ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -159,7 +159,7 @@
@Test
public void testFormatRelativeTime_LessThanTwoHours_withSeconds() {
final double testMillis = 119 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "119 min. ago";
+ final String expectedTime = "119 minutes ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -168,7 +168,7 @@
@Test
public void testFormatRelativeTime_TwoHours_withSeconds() {
final double testMillis = 2 * DateUtils.HOUR_IN_MILLIS;
- final String expectedTime = "2 hr. ago";
+ final String expectedTime = "2 hours ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -177,7 +177,7 @@
@Test
public void testFormatRelativeTime_LessThanTwoDays_withSeconds() {
final double testMillis = 47 * DateUtils.HOUR_IN_MILLIS;
- final String expectedTime = "47 hr. ago";
+ final String expectedTime = "47 hours ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -195,7 +195,7 @@
@Test
public void testFormatRelativeTime_FormatZero_WithSeconds() {
final double testMillis = 0;
- final String expectedTime = "0 sec. ago";
+ final String expectedTime = "Just now";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -204,7 +204,7 @@
@Test
public void testFormatRelativeTime_FormatZero_NoSeconds() {
final double testMillis = 0;
- final String expectedTime = "0 min. ago";
+ final String expectedTime = "0 minutes ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
expectedTime);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 34aae49..797b4f9 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1158,8 +1158,8 @@
Global.CHAINED_BATTERY_ATTRIBUTION_ENABLED,
GlobalSettingsProto.CHAINED_BATTERY_ATTRIBUTION_ENABLED);
dumpSetting(s, p,
- Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES,
- GlobalSettingsProto.AUTOFILL_COMPAT_ALLOWED_PACKAGES);
+ Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES,
+ GlobalSettingsProto.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES);
dumpSetting(s, p,
Global.HIDDEN_API_BLACKLIST_EXEMPTIONS,
GlobalSettingsProto.HIDDEN_API_BLACKLIST_EXEMPTIONS);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 40b8d78..834feb7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -85,6 +85,7 @@
private String mTileSpec;
private EnforcedAdmin mEnforcedAdmin;
private boolean mShowingDetail;
+ private int mIsFullQs;
public abstract TState newTileState();
@@ -110,18 +111,7 @@
* listening client it will go into the listening state.
*/
public void setListening(Object listener, boolean listening) {
- if (listening) {
- if (mListeners.add(listener) && mListeners.size() == 1) {
- if (DEBUG) Log.d(TAG, "setListening " + true);
- mHandler.obtainMessage(H.SET_LISTENING, 1, 0).sendToTarget();
- refreshState(); // Ensure we get at least one refresh after listening.
- }
- } else {
- if (mListeners.remove(listener) && mListeners.size() == 0) {
- if (DEBUG) Log.d(TAG, "setListening " + false);
- mHandler.obtainMessage(H.SET_LISTENING, 0, 0).sendToTarget();
- }
- }
+ mHandler.obtainMessage(H.SET_LISTENING, listening ? 1 : 0, 0, listener).sendToTarget();
}
protected long getStaleTimeout() {
@@ -205,19 +195,10 @@
logMaker.addTaggedData(FIELD_QS_VALUE, ((BooleanState) mState).value ? 1 : 0);
}
return logMaker.setSubtype(getMetricsCategory())
- .addTaggedData(FIELD_CONTEXT, isFullQs())
+ .addTaggedData(FIELD_CONTEXT, mIsFullQs)
.addTaggedData(FIELD_QS_POSITION, mHost.indexOf(mTileSpec));
}
- private int isFullQs() {
- for (Object listener : mListeners) {
- if (TilePage.class.equals(listener.getClass())) {
- return 1;
- }
- }
- return 0;
- }
-
public void showDetail(boolean show) {
mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0).sendToTarget();
}
@@ -352,6 +333,32 @@
handleRefreshState(null);
}
+ private void handleSetListeningInternal(Object listener, boolean listening) {
+ if (listening) {
+ if (mListeners.add(listener) && mListeners.size() == 1) {
+ if (DEBUG) Log.d(TAG, "handleSetListening true");
+ handleSetListening(listening);
+ refreshState(); // Ensure we get at least one refresh after listening.
+ }
+ } else {
+ if (mListeners.remove(listener) && mListeners.size() == 0) {
+ if (DEBUG) Log.d(TAG, "handleSetListening false");
+ handleSetListening(listening);
+ }
+ }
+ updateIsFullQs();
+ }
+
+ private void updateIsFullQs() {
+ for (Object listener : mListeners) {
+ if (TilePage.class.equals(listener.getClass())) {
+ mIsFullQs = 1;
+ return;
+ }
+ }
+ mIsFullQs = 0;
+ }
+
protected abstract void handleSetListening(boolean listening);
protected void handleDestroy() {
@@ -464,8 +471,8 @@
name = "handleClearState";
handleClearState();
} else if (msg.what == SET_LISTENING) {
- name = "handleSetListening";
- handleSetListening(msg.arg1 != 0);
+ name = "handleSetListeningInternal";
+ handleSetListeningInternal(msg.obj, msg.arg1 != 0);
} else if (msg.what == STALE) {
name = "handleStale";
handleStale();
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 5d2e241..9417f04 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -3964,7 +3964,8 @@
// Type TYPE_FAILURE: The request failed
// Package: Package of app that is autofilled
// Tag FIELD_AUTOFILL_SERVICE: Package of service that processed the request
- // Tag FIELD_AUTOFILL_NUM_DATASETS: The number of datasets returned (only in success case)
+ // Tag FIELD_AUTOFILL_NUM_DATASETS: The number of datasets returned in the response, or -1 if
+ // the service returned a null response.
// NOTE: starting on OS P, it also added:
// Type TYPE_CLOSE: Service returned a null response.
// Tag FIELD_AUTOFILL_NUM_FIELD_CLASSIFICATION_IDS: if service requested field classification,
diff --git a/services/art-profile b/services/art-profile
index d2cde02..93e580a 100644
--- a/services/art-profile
+++ b/services/art-profile
@@ -10677,7 +10677,6 @@
PLcom/android/server/location/CountryDetectorBase;-><init>(Landroid/content/Context;)V
PLcom/android/server/location/CountryDetectorBase;->notifyListener(Landroid/location/Country;)V
PLcom/android/server/location/CountryDetectorBase;->setCountryListener(Landroid/location/CountryListener;)V
-PLcom/android/server/location/FlpHardwareProvider;->isSupported()Z
PLcom/android/server/location/GeocoderProxy;-><init>(Landroid/content/Context;IIILandroid/os/Handler;)V
PLcom/android/server/location/GeocoderProxy;->bind()Z
PLcom/android/server/location/GeocoderProxy;->createAndBind(Landroid/content/Context;IIILandroid/os/Handler;)Lcom/android/server/location/GeocoderProxy;
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index a5339e0..7409ec2 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -575,7 +575,7 @@
private String getWhitelistedCompatModePackagesFromSettings() {
return Settings.Global.getString(
mContext.getContentResolver(),
- Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES);
+ Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES);
}
@Nullable
@@ -1179,7 +1179,7 @@
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES), false, this,
+ Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES), false, this,
UserHandle.USER_ALL);
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 54ea3ba..ef0d7e6 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -1189,7 +1189,7 @@
boolean isFieldClassificationEnabledLocked() {
return Settings.Secure.getIntForUser(
mContext.getContentResolver(),
- Settings.Secure.AUTOFILL_FEATURE_FIELD_CLASSIFICATION, 0,
+ Settings.Secure.AUTOFILL_FEATURE_FIELD_CLASSIFICATION, 1,
mUserId) == 1;
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 7f57615..55c0372 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -596,6 +596,9 @@
}
if (response == null) {
processNullResponseLocked(requestFlags);
+ mMetricsLogger.write(newLogMaker(MetricsEvent.AUTOFILL_REQUEST, servicePackageName)
+ .setType(MetricsEvent.TYPE_SUCCESS)
+ .addTaggedData(MetricsEvent.FIELD_AUTOFILL_NUM_DATASETS, -1));
return;
}
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 4cac707..d6f6c6c 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -215,6 +215,13 @@
// Timeout interval for deciding that a bind or clear-data has taken too long
private static final long TIMEOUT_INTERVAL = 10 * 1000;
+ // Timeout intervals for agent backup & restore operations
+ public static final long TIMEOUT_BACKUP_INTERVAL = 30 * 1000;
+ public static final long TIMEOUT_FULL_BACKUP_INTERVAL = 5 * 60 * 1000;
+ public static final long TIMEOUT_SHARED_BACKUP_INTERVAL = 30 * 60 * 1000;
+ public static final long TIMEOUT_RESTORE_INTERVAL = 60 * 1000;
+ public static final long TIMEOUT_RESTORE_FINISHED_INTERVAL = 30 * 1000;
+
// User confirmation timeout for a full backup/restore operation. It's this long in
// order to give them time to enter the backup password.
private static final long TIMEOUT_FULL_CONFIRMATION = 60 * 1000;
@@ -225,7 +232,6 @@
private static final int BUSY_BACKOFF_FUZZ = 1000 * 60 * 60 * 2; // two hours
private BackupManagerConstants mConstants;
- private BackupAgentTimeoutParameters mAgentTimeoutParameters;
private Context mContext;
private PackageManager mPackageManager;
private IPackageManager mPackageManagerBinder;
@@ -309,10 +315,6 @@
return mConstants;
}
- public BackupAgentTimeoutParameters getAgentTimeoutParameters() {
- return mAgentTimeoutParameters;
- }
-
public Context getContext() {
return mContext;
}
@@ -854,10 +856,6 @@
// require frequent starting and stopping.
mConstants.start();
- mAgentTimeoutParameters = new
- BackupAgentTimeoutParameters(mBackupHandler, mContext.getContentResolver());
- mAgentTimeoutParameters.start();
-
// Set up the various sorts of package tracking we do
mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule");
initPackageTracking();
@@ -3409,7 +3407,7 @@
}
mActiveRestoreSession = new ActiveRestoreSession(this, packageName, transport);
mBackupHandler.sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
- mAgentTimeoutParameters.getRestoreAgentTimeoutMillis());
+ TIMEOUT_RESTORE_INTERVAL);
}
return mActiveRestoreSession;
}
diff --git a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
index aabe7f6..7b021c6 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
@@ -191,7 +191,4 @@
void dump(FileDescriptor fd, PrintWriter pw, String[] args);
IBackupManager getBackupManagerBinder();
-
- // Gets access to the backup/restore agent timeout parameters.
- BackupAgentTimeoutParameters getAgentTimeoutParameters();
}
diff --git a/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java b/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
index f08c655..4755877 100644
--- a/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
+++ b/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
@@ -4,8 +4,8 @@
import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
import static android.os.ParcelFileDescriptor.MODE_READ_WRITE;
import static android.os.ParcelFileDescriptor.MODE_TRUNCATE;
-
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_BACKUP_INTERVAL;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
@@ -59,7 +59,6 @@
private ParcelFileDescriptor mSavedState;
private ParcelFileDescriptor mBackupData;
private ParcelFileDescriptor mNewState;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public KeyValueAdbBackupEngine(OutputStream output, PackageInfo packageInfo,
BackupManagerServiceInterface backupManagerService, PackageManager packageManager,
@@ -82,7 +81,6 @@
pkg + BACKUP_KEY_VALUE_NEW_STATE_FILENAME_SUFFIX);
mManifestFile = new File(mDataDir, BackupManagerService.BACKUP_MANIFEST_FILENAME);
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
}
public void backupOnePackage() throws IOException {
@@ -150,9 +148,8 @@
// Return true on backup success, false otherwise
private boolean invokeAgentForAdbBackup(String packageName, IBackupAgent agent) {
int token = mBackupManagerService.generateRandomIntegerToken();
- long kvBackupAgentTimeoutMillis = mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
try {
- mBackupManagerService.prepareOperationTimeout(token, kvBackupAgentTimeoutMillis, null,
+ mBackupManagerService.prepareOperationTimeout(token, TIMEOUT_BACKUP_INTERVAL, null,
OP_TYPE_BACKUP_WAIT);
// Start backup and wait for BackupManagerService to get callback for success or timeout
@@ -234,14 +231,14 @@
}
private void writeBackupData() throws IOException {
+
int token = mBackupManagerService.generateRandomIntegerToken();
- long kvBackupAgentTimeoutMillis = mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
ParcelFileDescriptor[] pipes = null;
try {
pipes = ParcelFileDescriptor.createPipe();
- mBackupManagerService.prepareOperationTimeout(token, kvBackupAgentTimeoutMillis, null,
+ mBackupManagerService.prepareOperationTimeout(token, TIMEOUT_BACKUP_INTERVAL, null,
OP_TYPE_BACKUP_WAIT);
// We will have to create a runnable that will read the manifest and backup data we
diff --git a/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java b/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
index 597da21..0582aba 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
@@ -25,6 +25,9 @@
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.BackupManagerService.TAG;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
+import static com.android.server.backup.BackupManagerService
+ .TIMEOUT_SHARED_BACKUP_INTERVAL;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
@@ -42,9 +45,8 @@
import android.util.StringBuilderPrinter;
import com.android.server.AppWidgetBackupBridge;
-import com.android.server.backup.BackupAgentTimeoutParameters;
-import com.android.server.backup.BackupManagerService;
import com.android.server.backup.BackupRestoreTask;
+import com.android.server.backup.BackupManagerService;
import com.android.server.backup.utils.FullBackupUtils;
import java.io.BufferedOutputStream;
@@ -73,7 +75,6 @@
private final long mQuota;
private final int mOpToken;
private final int mTransportFlags;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
class FullBackupRunner implements Runnable {
@@ -136,8 +137,8 @@
final boolean isSharedStorage =
mPackage.packageName.equals(SHARED_BACKUP_AGENT_PACKAGE);
final long timeout = isSharedStorage ?
- mAgentTimeoutParameters.getSharedBackupAgentTimeoutMillis() :
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
+ TIMEOUT_SHARED_BACKUP_INTERVAL :
+ TIMEOUT_FULL_BACKUP_INTERVAL;
if (DEBUG) {
Slog.d(TAG, "Calling doFullBackup() on " + mPackage.packageName);
@@ -179,7 +180,6 @@
mQuota = quota;
mOpToken = opToken;
mTransportFlags = transportFlags;
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
}
public int preflightCheck() throws RemoteException {
diff --git a/services/backup/java/com/android/server/backup/fullbackup/FullBackupObbConnection.java b/services/backup/java/com/android/server/backup/fullbackup/FullBackupObbConnection.java
index d441cf6..40b6967 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/FullBackupObbConnection.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/FullBackupObbConnection.java
@@ -19,6 +19,7 @@
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
import static com.android.server.backup.BackupManagerService.TAG;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
import android.app.backup.IBackupManager;
import android.content.ComponentName;
@@ -32,7 +33,6 @@
import android.util.Slog;
import com.android.internal.backup.IObbBackupService;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.utils.FullBackupUtils;
@@ -46,12 +46,10 @@
private BackupManagerService backupManagerService;
volatile IObbBackupService mService;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public FullBackupObbConnection(BackupManagerService backupManagerService) {
this.backupManagerService = backupManagerService;
mService = null;
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
}
public void establish() {
@@ -77,10 +75,8 @@
try {
pipes = ParcelFileDescriptor.createPipe();
int token = backupManagerService.generateRandomIntegerToken();
- long fullBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
backupManagerService.prepareOperationTimeout(
- token, fullBackupAgentTimeoutMillis, null, OP_TYPE_BACKUP_WAIT);
+ token, TIMEOUT_FULL_BACKUP_INTERVAL, null, OP_TYPE_BACKUP_WAIT);
mService.backupObbs(pkg.packageName, pipes[1], token,
backupManagerService.getBackupManagerBinder());
FullBackupUtils.routeSocketDataToOutput(pipes[0], out);
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
index 1ea3eb5..2c2dd85 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
@@ -22,6 +22,7 @@
import static com.android.server.backup.BackupManagerService.OP_PENDING;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
import android.annotation.Nullable;
import android.app.IBackupAgent;
@@ -43,7 +44,6 @@
import com.android.internal.backup.IBackupTransport;
import com.android.server.EventLogTags;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.FullBackupJob;
import com.android.server.backup.BackupManagerService;
@@ -146,7 +146,6 @@
private volatile boolean mIsDoingBackup;
private volatile boolean mCancelAll;
private final int mCurrentOpToken;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public PerformFullTransportBackupTask(BackupManagerService backupManagerService,
TransportClient transportClient,
@@ -168,7 +167,6 @@
mUserInitiated = userInitiated;
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
mBackupRunnerOpToken = backupManagerService.generateRandomIntegerToken();
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
if (backupManagerService.isBackupOperationInProgress()) {
if (DEBUG) {
@@ -700,11 +698,9 @@
@Override
public int preflightFullBackup(PackageInfo pkg, IBackupAgent agent) {
int result;
- long fullBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
backupManagerService.prepareOperationTimeout(
- mCurrentOpToken, fullBackupAgentTimeoutMillis, this, OP_TYPE_BACKUP_WAIT);
+ mCurrentOpToken, TIMEOUT_FULL_BACKUP_INTERVAL, this, OP_TYPE_BACKUP_WAIT);
backupManagerService.addBackupTrace("preflighting");
if (MORE_DEBUG) {
Slog.d(TAG, "Preflighting full payload of " + pkg.packageName);
@@ -717,7 +713,7 @@
// timeout had been produced. In case of a real backstop timeout, mResult
// will still contain the value it was constructed with, AGENT_ERROR, which
// intentionaly falls into the "just report failure" code.
- mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
+ mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
long totalSize = mResult.get();
// If preflight timed out, mResult will contain error code as int.
@@ -773,10 +769,8 @@
@Override
public long getExpectedSizeOrErrorCode() {
- long fullBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
- mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
+ mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
return mResult.get();
} catch (InterruptedException e) {
return BackupTransport.NO_MORE_DATA;
@@ -869,10 +863,8 @@
// If preflight succeeded, returns positive number - preflight size,
// otherwise return negative error code.
long getPreflightResultBlocking() {
- long fullBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
- mPreflightLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
+ mPreflightLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
if (mIsCancelled) {
return BackupManager.ERROR_BACKUP_CANCELLED;
}
@@ -887,10 +879,8 @@
}
int getBackupResultBlocking() {
- long fullBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
- mBackupLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
+ mBackupLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
if (mIsCancelled) {
return BackupManager.ERROR_BACKUP_CANCELLED;
}
diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
index 5886862..136fada 100644
--- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java
+++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
@@ -19,6 +19,7 @@
import static com.android.server.backup.BackupManagerService.DEBUG;
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
import static com.android.server.backup.BackupManagerService.TAG;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
import android.app.backup.RestoreSet;
import android.content.Intent;
@@ -33,7 +34,6 @@
import com.android.internal.backup.IBackupTransport;
import com.android.server.EventLogTags;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.DataChangedJournal;
@@ -81,12 +81,10 @@
public static final int MSG_OP_COMPLETE = 21;
private final BackupManagerService backupManagerService;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public BackupHandler(BackupManagerService backupManagerService, Looper looper) {
super(looper);
this.backupManagerService = backupManagerService;
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
}
public void handleMessage(Message msg) {
@@ -324,8 +322,7 @@
// Done: reset the session timeout clock
removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
- sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
- mAgentTimeoutParameters.getRestoreAgentTimeoutMillis());
+ sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT, TIMEOUT_RESTORE_INTERVAL);
params.listener.onFinished(callerLogString);
}
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index 0313066..11394e66 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -24,6 +24,7 @@
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
import static com.android.server.backup.BackupManagerService.PACKAGE_MANAGER_SENTINEL;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_BACKUP_INTERVAL;
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_OPERATION_TIMEOUT;
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP;
@@ -56,7 +57,6 @@
import com.android.internal.backup.IBackupTransport;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.EventLogTags;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.DataChangedJournal;
import com.android.server.backup.KeyValueBackupJob;
@@ -142,7 +142,6 @@
private boolean mFinished;
private final boolean mUserInitiated;
private final boolean mNonIncremental;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
private volatile boolean mCancelAll;
@@ -163,7 +162,6 @@
mPendingFullBackups = pendingFullBackups;
mUserInitiated = userInitiated;
mNonIncremental = nonIncremental;
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
mStateDir = new File(backupManagerService.getBaseStateDir(), dirName);
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
@@ -713,10 +711,8 @@
// Initiate the target's backup pass
backupManagerService.addBackupTrace("setting timeout");
- long kvBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
backupManagerService.prepareOperationTimeout(
- mEphemeralOpToken, kvBackupAgentTimeoutMillis, this, OP_TYPE_BACKUP_WAIT);
+ mEphemeralOpToken, TIMEOUT_BACKUP_INTERVAL, this, OP_TYPE_BACKUP_WAIT);
backupManagerService.addBackupTrace("calling agent doBackup()");
agent.doBackup(
diff --git a/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedLatch.java b/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedLatch.java
index 6175629..e4f3a9d 100644
--- a/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedLatch.java
+++ b/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedLatch.java
@@ -18,10 +18,10 @@
import static com.android.server.backup.BackupManagerService.DEBUG;
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
import android.util.Slog;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.BackupRestoreTask;
@@ -37,22 +37,18 @@
private BackupManagerService backupManagerService;
final CountDownLatch mLatch;
private final int mCurrentOpToken;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
public AdbRestoreFinishedLatch(BackupManagerService backupManagerService,
int currentOpToken) {
this.backupManagerService = backupManagerService;
mLatch = new CountDownLatch(1);
mCurrentOpToken = currentOpToken;
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
}
void await() {
boolean latched = false;
- long fullBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
try {
- latched = mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
+ latched = mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Slog.w(TAG, "Interrupted!");
}
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
index f168afed..c1a1c1d 100644
--- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
@@ -23,6 +23,9 @@
import static com.android.server.backup.BackupManagerService.OP_TYPE_RESTORE_WAIT;
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.BackupManagerService.TAG;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
+import static com.android.server.backup.BackupManagerService
+ .TIMEOUT_SHARED_BACKUP_INTERVAL;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
import android.app.ApplicationThreadConstants;
@@ -40,11 +43,10 @@
import android.util.Slog;
import com.android.server.LocalServices;
-import com.android.server.backup.BackupAgentTimeoutParameters;
-import com.android.server.backup.BackupManagerService;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.FileMetadata;
import com.android.server.backup.KeyValueAdbRestoreEngine;
+import com.android.server.backup.BackupManagerService;
import com.android.server.backup.fullbackup.FullBackupObbConnection;
import com.android.server.backup.utils.BytesReadListener;
import com.android.server.backup.utils.FullBackupRestoreObserverUtils;
@@ -119,8 +121,6 @@
final int mEphemeralOpToken;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
-
public FullRestoreEngine(BackupManagerService backupManagerService,
BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer,
IBackupManagerMonitor monitor, PackageInfo onlyPackage, boolean allowApks,
@@ -135,7 +135,6 @@
mAllowObbs = allowObbs;
mBuffer = new byte[32 * 1024];
mBytes = 0;
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
}
public IBackupAgent getAgent() {
@@ -382,8 +381,8 @@
long toCopy = info.size;
final boolean isSharedStorage = pkg.equals(SHARED_BACKUP_AGENT_PACKAGE);
final long timeout = isSharedStorage ?
- mAgentTimeoutParameters.getSharedBackupAgentTimeoutMillis() :
- mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
+ TIMEOUT_SHARED_BACKUP_INTERVAL :
+ TIMEOUT_RESTORE_INTERVAL;
try {
mBackupManagerService.prepareOperationTimeout(token,
timeout,
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index 221637c..dacde0b 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -16,6 +16,8 @@
package com.android.server.backup.restore;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
import static com.android.server.backup.BackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.BackupManagerService.BACKUP_FILE_VERSION;
import static com.android.server.backup.BackupManagerService.BACKUP_MANIFEST_FILENAME;
@@ -26,8 +28,8 @@
import static com.android.server.backup.BackupManagerService.SETTINGS_PACKAGE;
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.BackupManagerService.TAG;
-import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
-import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
import android.app.ApplicationThreadConstants;
@@ -47,7 +49,6 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.LocalServices;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.FileMetadata;
import com.android.server.backup.KeyValueAdbRestoreEngine;
@@ -100,7 +101,6 @@
private byte[] mWidgetData = null;
private long mBytes;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
// Runner that can be placed on a separate thread to do in-process invocation
// of the "restore finished" API asynchronously. Used by adb restore.
@@ -155,7 +155,6 @@
mAgentPackage = null;
mTargetApp = null;
mObbConnection = new FullBackupObbConnection(backupManagerService);
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
// Which packages we've already wiped data on. We prepopulate this
// with a whitelist of packages known to be unclearable.
@@ -644,11 +643,9 @@
if (okay) {
boolean agentSuccess = true;
long toCopy = info.size;
- long restoreAgentTimeoutMillis =
- mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
try {
mBackupManagerService.prepareOperationTimeout(
- token, restoreAgentTimeoutMillis, null, OP_TYPE_RESTORE_WAIT);
+ token, TIMEOUT_RESTORE_INTERVAL, null, OP_TYPE_RESTORE_WAIT);
if (FullBackup.OBB_TREE_TOKEN.equals(info.domain)) {
if (DEBUG) {
@@ -823,12 +820,10 @@
// In the adb restore case, we do restore-finished here
if (doRestoreFinished) {
final int token = mBackupManagerService.generateRandomIntegerToken();
- long fullBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
final AdbRestoreFinishedLatch latch = new AdbRestoreFinishedLatch(
mBackupManagerService, token);
mBackupManagerService.prepareOperationTimeout(
- token, fullBackupAgentTimeoutMillis, latch, OP_TYPE_RESTORE_WAIT);
+ token, TIMEOUT_FULL_BACKUP_INTERVAL, latch, OP_TYPE_RESTORE_WAIT);
if (mTargetApp.processName.equals("system")) {
if (MORE_DEBUG) {
Slog.d(TAG, "system agent - restoreFinished on thread");
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 069e3b6..4b467e5 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -23,6 +23,9 @@
import static com.android.server.backup.BackupManagerService.PACKAGE_MANAGER_SENTINEL;
import static com.android.server.backup.BackupManagerService.SETTINGS_PACKAGE;
import static com.android.server.backup.BackupManagerService.TAG;
+import static com.android.server.backup.BackupManagerService
+ .TIMEOUT_RESTORE_FINISHED_INTERVAL;
+import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_SESSION_TIMEOUT;
@@ -56,7 +59,6 @@
import com.android.server.AppWidgetBackupBridge;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.BackupUtils;
import com.android.server.backup.PackageManagerBackupAgent;
@@ -158,7 +160,6 @@
ParcelFileDescriptor mNewState;
private final int mEphemeralOpToken;
- private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
// This task can assume that the wakelock is properly held for it and doesn't have to worry
// about releasing it.
@@ -189,7 +190,6 @@
mFinished = false;
mDidLaunch = false;
mListener = listener;
- mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
if (targetPackage != null) {
// Single package restore
@@ -760,9 +760,8 @@
// Kick off the restore, checking for hung agents. The timeout or
// the operationComplete() callback will schedule the next step,
// so we do not do that here.
- long restoreAgentTimeoutMillis = mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
backupManagerService.prepareOperationTimeout(
- mEphemeralOpToken, restoreAgentTimeoutMillis, this, OP_TYPE_RESTORE_WAIT);
+ mEphemeralOpToken, TIMEOUT_RESTORE_INTERVAL, this, OP_TYPE_RESTORE_WAIT);
mAgent.doRestore(mBackupData, appVersionCode, mNewState,
mEphemeralOpToken, backupManagerService.getBackupManagerBinder());
} catch (Exception e) {
@@ -814,11 +813,9 @@
Slog.d(TAG, "restoreFinished packageName=" + mCurrentPackage.packageName);
}
try {
- long restoreAgentFinishedTimeoutMillis =
- mAgentTimeoutParameters.getRestoreAgentFinishedTimeoutMillis();
backupManagerService
.prepareOperationTimeout(mEphemeralOpToken,
- restoreAgentFinishedTimeoutMillis, this,
+ TIMEOUT_RESTORE_FINISHED_INTERVAL, this,
OP_TYPE_RESTORE_WAIT);
mAgent.doRestoreFinished(mEphemeralOpToken,
backupManagerService.getBackupManagerBinder());
@@ -1112,10 +1109,9 @@
} else {
// We were invoked via an active restore session, not by the Package
// Manager, so start up the session timeout again.
- long restoreAgentTimeoutMillis = mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
backupManagerService.getBackupHandler().sendEmptyMessageDelayed(
MSG_RESTORE_SESSION_TIMEOUT,
- restoreAgentTimeoutMillis);
+ TIMEOUT_RESTORE_INTERVAL);
}
// Kick off any work that may be needed regarding app widget restores
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 5b57c14..f6ff359 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -3663,16 +3663,21 @@
}
}
+ boolean reenableMinimumNonAuxSystemImes = false;
// TODO: The following code should find better place to live.
if (!resetDefaultEnabledIme) {
boolean enabledImeFound = false;
+ boolean enabledNonAuxImeFound = false;
final List<InputMethodInfo> enabledImes = mSettings.getEnabledInputMethodListLocked();
final int N = enabledImes.size();
for (int i = 0; i < N; ++i) {
final InputMethodInfo imi = enabledImes.get(i);
if (mMethodList.contains(imi)) {
enabledImeFound = true;
- break;
+ if (!imi.isAuxiliaryIme()) {
+ enabledNonAuxImeFound = true;
+ break;
+ }
}
}
if (!enabledImeFound) {
@@ -3681,12 +3686,18 @@
}
resetDefaultEnabledIme = true;
resetSelectedInputMethodAndSubtypeLocked("");
+ } else if (!enabledNonAuxImeFound) {
+ if (DEBUG) {
+ Slog.i(TAG, "All the enabled non-Aux IMEs are gone. Do partial reset.");
+ }
+ reenableMinimumNonAuxSystemImes = true;
}
}
- if (resetDefaultEnabledIme) {
+ if (resetDefaultEnabledIme || reenableMinimumNonAuxSystemImes) {
final ArrayList<InputMethodInfo> defaultEnabledIme =
- InputMethodUtils.getDefaultEnabledImes(mContext, mMethodList);
+ InputMethodUtils.getDefaultEnabledImes(mContext, mMethodList,
+ reenableMinimumNonAuxSystemImes);
final int N = defaultEnabledIme.size();
for (int i = 0; i < N; ++i) {
final InputMethodInfo imi = defaultEnabledIme.get(i);
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 65e90bad..26b83f5 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -19,6 +19,7 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.PendingIntent;
@@ -82,8 +83,6 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.server.location.ActivityRecognitionProxy;
-import com.android.server.location.FlpHardwareProvider;
-import com.android.server.location.FusedProxy;
import com.android.server.location.GeocoderProxy;
import com.android.server.location.GeofenceManager;
import com.android.server.location.GeofenceProxy;
@@ -491,13 +490,6 @@
if (gpsProvider != null && gpsProvider.isEnabled()) {
gpsProvider.disable();
}
-
- // it is needed to check if FLP HW provider is supported before accessing the instance, this
- // avoids an exception to be thrown by the singleton factory method
- if (FlpHardwareProvider.isSupported()) {
- FlpHardwareProvider flpHardwareProvider = FlpHardwareProvider.getInstance(mContext);
- flpHardwareProvider.cleanup();
- }
}
/**
@@ -686,27 +678,6 @@
Slog.e(TAG, "no geocoder provider found");
}
- // bind to fused hardware provider if supported
- // in devices without support, requesting an instance of FlpHardwareProvider will raise an
- // exception, so make sure we only do that when supported
- FlpHardwareProvider flpHardwareProvider;
- if (FlpHardwareProvider.isSupported()) {
- flpHardwareProvider = FlpHardwareProvider.getInstance(mContext);
- FusedProxy fusedProxy = FusedProxy.createAndBind(
- mContext,
- mLocationHandler,
- flpHardwareProvider.getLocationHardware(),
- com.android.internal.R.bool.config_enableHardwareFlpOverlay,
- com.android.internal.R.string.config_hardwareFlpPackageName,
- com.android.internal.R.array.config_locationProviderPackageNames);
- if (fusedProxy == null) {
- Slog.d(TAG, "Unable to bind FusedProxy.");
- }
- } else {
- flpHardwareProvider = null;
- Slog.d(TAG, "FLP HAL not supported");
- }
-
// bind to geofence provider
GeofenceProxy provider = GeofenceProxy.createAndBind(
mContext, com.android.internal.R.bool.config_enableGeofenceOverlay,
@@ -714,7 +685,7 @@
com.android.internal.R.array.config_locationProviderPackageNames,
mLocationHandler,
mGpsGeofenceProxy,
- flpHardwareProvider != null ? flpHardwareProvider.getGeofenceHardware() : null);
+ null);
if (provider == null) {
Slog.d(TAG, "Unable to bind FLP Geofence proxy.");
}
@@ -1161,11 +1132,12 @@
* Returns the model name of the GNSS hardware.
*/
@Override
+ @Nullable
public String getGnssHardwareModelName() {
if (mGnssSystemInfoProvider != null) {
return mGnssSystemInfoProvider.getGnssHardwareModelName();
} else {
- return LocationManager.GNSS_HARDWARE_MODEL_NAME_UNKNOWN;
+ return null;
}
}
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index f5e1a31..2291e44 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -283,30 +283,34 @@
mUseLatestStates = true;
}
- synchronized (mWorkerLock) {
- if (DEBUG) {
- Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
- }
- try {
- updateExternalStatsLocked(reason, updateFlags, onBattery,
- onBatteryScreenOff, useLatestStates);
- } finally {
+ try {
+ synchronized (mWorkerLock) {
if (DEBUG) {
- Slog.d(TAG, "end updateExternalStatsSync");
+ Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
+ }
+ try {
+ updateExternalStatsLocked(reason, updateFlags, onBattery,
+ onBatteryScreenOff, useLatestStates);
+ } finally {
+ if (DEBUG) {
+ Slog.d(TAG, "end updateExternalStatsSync");
+ }
}
}
- }
- if ((updateFlags & UPDATE_CPU) != 0) {
- mStats.copyFromAllUidsCpuTimes();
- }
-
- // Clean up any UIDs if necessary.
- synchronized (mStats) {
- for (int uid : uidsToRemove) {
- mStats.removeIsolatedUidLocked(uid);
+ if ((updateFlags & UPDATE_CPU) != 0) {
+ mStats.copyFromAllUidsCpuTimes();
}
- mStats.clearPendingRemovedUids();
+
+ // Clean up any UIDs if necessary.
+ synchronized (mStats) {
+ for (int uid : uidsToRemove) {
+ mStats.removeIsolatedUidLocked(uid);
+ }
+ mStats.clearPendingRemovedUids();
+ }
+ } catch (Exception e) {
+ Slog.wtf(TAG, "Error updating external stats: ", e);
}
}
};
@@ -398,7 +402,7 @@
if (bluetoothInfo.isValid()) {
mStats.updateBluetoothStateLocked(bluetoothInfo);
} else {
- Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo);
+ Slog.w(TAG, "bluetooth info is invalid: " + bluetoothInfo);
}
}
}
@@ -410,7 +414,7 @@
if (wifiInfo.isValid()) {
mStats.updateWifiState(extractDeltaLocked(wifiInfo));
} else {
- Slog.e(TAG, "wifi info is invalid: " + wifiInfo);
+ Slog.w(TAG, "wifi info is invalid: " + wifiInfo);
}
}
@@ -418,7 +422,7 @@
if (modemInfo.isValid()) {
mStats.updateMobileRadioState(modemInfo);
} else {
- Slog.e(TAG, "modem info is invalid: " + modemInfo);
+ Slog.w(TAG, "modem info is invalid: " + modemInfo);
}
}
}
diff --git a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
index 5bf5020..328426d 100644
--- a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
@@ -36,9 +36,11 @@
private static final String TAG = "GlobalSettingsToPropertiesMapper";
+ // List mapping entries in the following format:
+ // {Settings.Global.SETTING_NAME, "system_property_name"}
+ // Important: Property being added should be whitelisted by SELinux policy or have one of the
+ // already whitelisted prefixes in system_server.te, e.g. sys.
private static final String[][] sGlobalSettingsMapping = new String[][] {
- // List mapping entries in the following format:
- // {Settings.Global.SETTING_NAME, "system_property_name"},
{Settings.Global.SYS_VDSO, "sys.vdso"},
{Settings.Global.FPS_DEVISOR, ThreadedRenderer.DEBUG_FPS_DIVISOR},
{Settings.Global.DISPLAY_PANEL_LPM, "sys.display_panel_lpm"},
diff --git a/services/core/java/com/android/server/am/OWNERS b/services/core/java/com/android/server/am/OWNERS
new file mode 100644
index 0000000..9964053
--- /dev/null
+++ b/services/core/java/com/android/server/am/OWNERS
@@ -0,0 +1,4 @@
+per-file GlobalSettingsToPropertiesMapper.java=fkupolov@google.com
+per-file GlobalSettingsToPropertiesMapper.java=omakoto@google.com
+per-file GlobalSettingsToPropertiesMapper.java=svetoslavganov@google.com
+per-file GlobalSettingsToPropertiesMapper.java=yamasani@google.com
\ No newline at end of file
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 0b1f9a6..66817fa 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -29,6 +29,7 @@
import android.app.job.IJobScheduler;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
+import android.app.job.JobProtoEnums;
import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.app.job.JobWorkItem;
@@ -880,7 +881,8 @@
startTrackingJobLocked(jobStatus, toCancel);
StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED,
uId, null, jobStatus.getBatteryName(),
- StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__SCHEDULED);
+ StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__SCHEDULED,
+ JobProtoEnums.STOP_REASON_CANCELLED);
// If the job is immediately ready to run, then we can just immediately
// put it in the pending list and try to schedule it. This is especially
diff --git a/services/core/java/com/android/server/location/FlpHardwareProvider.java b/services/core/java/com/android/server/location/FlpHardwareProvider.java
deleted file mode 100644
index 5c9b0ea..0000000
--- a/services/core/java/com/android/server/location/FlpHardwareProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.location;
-
-import android.content.Context;
-import android.hardware.location.IFusedLocationHardware;
-import android.location.IFusedGeofenceHardware;
-import android.util.Log;
-
-/**
- * This class was an interop layer for JVM types and the JNI code that interacted
- * with the FLP HAL implementation.
- *
- * Now, after Treble FLP & GNSS HAL simplification, it is a thin shell that acts like the
- * pre-existing cases where there was no FLP Hardware support, to keep legacy users of this
- * class operating.
- *
- * {@hide}
- * {@Deprecated}
- */
-public class FlpHardwareProvider {
- private static FlpHardwareProvider sSingletonInstance = null;
-
- private final static String TAG = "FlpHardwareProvider";
-
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- public static FlpHardwareProvider getInstance(Context context) {
- if (sSingletonInstance == null) {
- sSingletonInstance = new FlpHardwareProvider();
- if (DEBUG) Log.d(TAG, "getInstance() created empty provider");
- }
- return sSingletonInstance;
- }
-
- private FlpHardwareProvider() {
- }
-
- public static boolean isSupported() {
- if (DEBUG) Log.d(TAG, "isSupported() returning false");
- return false;
- }
-
- /**
- * Interface implementations for services built on top of this functionality.
- */
- public static final String LOCATION = "Location";
-
- public IFusedLocationHardware getLocationHardware() {
- return null;
- }
-
- public IFusedGeofenceHardware getGeofenceHardware() {
- return null;
- }
-
- public void cleanup() {
- if (DEBUG) Log.d(TAG, "empty cleanup()");
- }
-}
diff --git a/services/core/java/com/android/server/location/FusedLocationHardwareSecure.java b/services/core/java/com/android/server/location/FusedLocationHardwareSecure.java
deleted file mode 100644
index a08d326..0000000
--- a/services/core/java/com/android/server/location/FusedLocationHardwareSecure.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.location;
-
-import android.content.Context;
-import android.hardware.location.IFusedLocationHardware;
-import android.hardware.location.IFusedLocationHardwareSink;
-import android.location.FusedBatchOptions;
-import android.os.RemoteException;
-
-/**
- * FusedLocationHardware decorator that adds permission checking.
- * @hide
- */
-public class FusedLocationHardwareSecure extends IFusedLocationHardware.Stub {
- private final IFusedLocationHardware mLocationHardware;
- private final Context mContext;
- private final String mPermissionId;
-
- public FusedLocationHardwareSecure(
- IFusedLocationHardware locationHardware,
- Context context,
- String permissionId) {
- mLocationHardware = locationHardware;
- mContext = context;
- mPermissionId = permissionId;
- }
-
- private void checkPermissions() {
- mContext.enforceCallingPermission(
- mPermissionId,
- String.format(
- "Permission '%s' not granted to access FusedLocationHardware",
- mPermissionId));
- }
-
- @Override
- public void registerSink(IFusedLocationHardwareSink eventSink) throws RemoteException {
- checkPermissions();
- mLocationHardware.registerSink(eventSink);
- }
-
- @Override
- public void unregisterSink(IFusedLocationHardwareSink eventSink) throws RemoteException {
- checkPermissions();
- mLocationHardware.unregisterSink(eventSink);
- }
-
- @Override
- public int getSupportedBatchSize() throws RemoteException {
- checkPermissions();
- return mLocationHardware.getSupportedBatchSize();
- }
-
- @Override
- public void startBatching(int id, FusedBatchOptions batchOptions) throws RemoteException {
- checkPermissions();
- mLocationHardware.startBatching(id, batchOptions);
- }
-
- @Override
- public void stopBatching(int id) throws RemoteException {
- checkPermissions();
- mLocationHardware.stopBatching(id);
- }
-
- @Override
- public void updateBatchingOptions(
- int id,
- FusedBatchOptions batchoOptions
- ) throws RemoteException {
- checkPermissions();
- mLocationHardware.updateBatchingOptions(id, batchoOptions);
- }
-
- @Override
- public void requestBatchOfLocations(int batchSizeRequested) throws RemoteException {
- checkPermissions();
- mLocationHardware.requestBatchOfLocations(batchSizeRequested);
- }
-
- @Override
- public boolean supportsDiagnosticDataInjection() throws RemoteException {
- checkPermissions();
- return mLocationHardware.supportsDiagnosticDataInjection();
- }
-
- @Override
- public void injectDiagnosticData(String data) throws RemoteException {
- checkPermissions();
- mLocationHardware.injectDiagnosticData(data);
- }
-
- @Override
- public boolean supportsDeviceContextInjection() throws RemoteException {
- checkPermissions();
- return mLocationHardware.supportsDeviceContextInjection();
- }
-
- @Override
- public void injectDeviceContext(int deviceEnabledContext) throws RemoteException {
- checkPermissions();
- mLocationHardware.injectDeviceContext(deviceEnabledContext);
- }
-
- @Override
- public void flushBatchedLocations() throws RemoteException {
- checkPermissions();
- mLocationHardware.flushBatchedLocations();
- }
-
- @Override
- public int getVersion() throws RemoteException {
- checkPermissions();
- return mLocationHardware.getVersion();
- }
-}
diff --git a/services/core/java/com/android/server/location/FusedProxy.java b/services/core/java/com/android/server/location/FusedProxy.java
deleted file mode 100644
index b90f037..0000000
--- a/services/core/java/com/android/server/location/FusedProxy.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2013 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 law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.location;
-
-import com.android.server.ServiceWatcher;
-
-import android.Manifest;
-import android.content.Context;
-import android.hardware.location.IFusedLocationHardware;
-import android.location.IFusedProvider;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * Proxy that helps bind GCore FusedProvider implementations to the Fused Hardware instances.
- *
- * @hide
- */
-public final class FusedProxy {
- private final String TAG = "FusedProxy";
- private final ServiceWatcher mServiceWatcher;
- private final FusedLocationHardwareSecure mLocationHardware;
-
- /**
- * Constructor of the class.
- * This is private as the class follows a factory pattern for construction.
- *
- * @param context The context needed for construction.
- * @param handler The handler needed for construction.
- * @param locationHardware The instance of the Fused location hardware assigned to the proxy.
- */
- private FusedProxy(
- Context context,
- Handler handler,
- IFusedLocationHardware locationHardware,
- int overlaySwitchResId,
- int defaultServicePackageNameResId,
- int initialPackageNameResId) {
- mLocationHardware = new FusedLocationHardwareSecure(
- locationHardware,
- context,
- Manifest.permission.LOCATION_HARDWARE);
- Runnable newServiceWork = new Runnable() {
- @Override
- public void run() {
- bindProvider(mLocationHardware);
- }
- };
-
- // prepare the connection to the provider
- mServiceWatcher = new ServiceWatcher(
- context,
- TAG,
- "com.android.location.service.FusedProvider",
- overlaySwitchResId,
- defaultServicePackageNameResId,
- initialPackageNameResId,
- newServiceWork,
- handler);
- }
-
- /**
- * Creates an instance of the proxy and binds it to the appropriate FusedProvider.
- *
- * @param context The context needed for construction.
- * @param handler The handler needed for construction.
- * @param locationHardware The instance of the Fused location hardware assigned to the proxy.
- *
- * @return An instance of the proxy if it could be bound, null otherwise.
- */
- public static FusedProxy createAndBind(
- Context context,
- Handler handler,
- IFusedLocationHardware locationHardware,
- int overlaySwitchResId,
- int defaultServicePackageNameResId,
- int initialPackageNameResId) {
- FusedProxy fusedProxy = new FusedProxy(
- context,
- handler,
- locationHardware,
- overlaySwitchResId,
- defaultServicePackageNameResId,
- initialPackageNameResId);
-
- // try to bind the Fused provider
- if (!fusedProxy.mServiceWatcher.start()) {
- return null;
- }
-
- return fusedProxy;
- }
-
- /**
- * Helper function to bind the FusedLocationHardware to the appropriate FusedProvider instance.
- *
- * @param locationHardware The FusedLocationHardware instance to use for the binding operation.
- */
- private void bindProvider(IFusedLocationHardware locationHardware) {
- if (!mServiceWatcher.runOnBinder(new ServiceWatcher.BinderRunner() {
- @Override
- public void run(IBinder binder) {
- IFusedProvider provider = IFusedProvider.Stub.asInterface(binder);
- try {
- provider.onFusedLocationHardwareChange(locationHardware);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- }
- })) {
- Log.e(TAG, "No instance of FusedProvider found on FusedLocationHardware connected.");
- }
- }
-}
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index e02feec..8f0e1da 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -470,7 +470,7 @@
// Volatile for simple inter-thread sync on these values.
private volatile int mHardwareYear = 0;
- private volatile String mHardwareModelName = LocationManager.GNSS_HARDWARE_MODEL_NAME_UNKNOWN;
+ private volatile String mHardwareModelName;
// Set lower than the current ITAR limit of 600m/s to allow this to trigger even if GPS HAL
// stops output right at 600m/s, depriving this of the information of a device that reaches
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
index f46657c..a87adbd 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
@@ -255,9 +255,6 @@
}
}
- // TODO: make sure the same counter id is used during recovery and remove temporary fix.
- counterId = 1L;
-
byte[] vaultParams = KeySyncUtils.packVaultParams(
publicKey,
counterId,
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
index 5b10add..e03e86f1 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
@@ -416,8 +416,8 @@
* @param vaultChallenge Challenge issued by vault service.
* @param secrets Lock-screen hashes. For now only a single secret is supported.
* @return Encrypted bytes of recovery claim. This can then be issued to the vault service.
- * @deprecated Use {@link #startRecoverySessionWithCertPath(String, RecoveryCertPath, byte[],
- * byte[], List)} instead.
+ * @deprecated Use {@link #startRecoverySessionWithCertPath(String, String, RecoveryCertPath,
+ * byte[], byte[], List)} instead.
*
* @hide
*/
@@ -457,6 +457,7 @@
uid,
new RecoverySessionStorage.Entry(sessionId, kfHash, keyClaimant, vaultParams));
+ Log.i(TAG, "Received VaultParams for recovery: " + HexDump.toHexString(vaultParams));
try {
byte[] thmKfHash = KeySyncUtils.calculateThmKfHash(kfHash);
return KeySyncUtils.encryptRecoveryClaim(
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 052f239..26e9a9a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -10355,7 +10355,7 @@
if (Build.IS_DEBUGGABLE &&
pkg.isPrivileged() &&
- !SystemProperties.getBoolean("pm.dexopt.priv-apps", true)) {
+ !SystemProperties.getBoolean(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB, true)) {
PackageManagerServiceUtils.logPackageHasUncompressedCode(pkg);
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 54b4123..993556f 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -859,10 +859,12 @@
// If the task has temp inset bounds set, we have to make sure all its windows uses
// the temp inset frame. Otherwise different display frames get applied to the main
// window and the child window, making them misaligned.
- if (inFullscreenContainer || isLetterboxedAppWindow()) {
- mInsetFrame.setEmpty();
- } else if (task != null && isInMultiWindowMode()) {
+ // Otherwise we need to clear the inset frame, to avoid using a stale frame after leaving
+ // multi window mode.
+ if (task != null && isInMultiWindowMode()) {
task.getTempInsetBounds(mInsetFrame);
+ } else {
+ mInsetFrame.setEmpty();
}
// Denotes the actual frame used to calculate the insets and to perform the layout. When
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
index d0398ad..f603a09 100644
--- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
@@ -148,22 +148,16 @@
Looper backupLooper = startBackupThreadAndGetLooper();
mShadowBackupLooper = shadowOf(backupLooper);
mBackupHandler = new BackupHandler(mBackupManagerService, backupLooper);
- Handler mainHandler = new Handler(Looper.getMainLooper());
mBackupManager = spy(FakeIBackupManager.class);
- BackupAgentTimeoutParameters agentTimeoutParameters =
- new BackupAgentTimeoutParameters(mainHandler, application.getContentResolver());
- agentTimeoutParameters.start();
-
setUpBackupManagerServiceBasics(
mBackupManagerService,
application,
mTransportManager,
packageManager,
mBackupHandler,
- mWakeLock,
- agentTimeoutParameters);
+ mWakeLock);
when(mBackupManagerService.getBaseStateDir()).thenReturn(mBaseStateDir);
when(mBackupManagerService.getDataDir()).thenReturn(dataDir);
when(mBackupManagerService.getBackupManagerBinder()).thenReturn(mBackupManager);
diff --git a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
index 869c50b..03792b1 100644
--- a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
+++ b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
@@ -41,14 +41,12 @@
import android.app.backup.RestoreSet;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import com.android.server.EventLogTags;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.TransportManager;
import com.android.server.backup.internal.BackupHandler;
@@ -117,15 +115,6 @@
Looper backupLooper = startBackupThreadAndGetLooper();
mShadowBackupLooper = shadowOf(backupLooper);
-
- Handler mainHandler = new Handler(Looper.getMainLooper());
- BackupAgentTimeoutParameters agentTimeoutParameters =
- new BackupAgentTimeoutParameters(mainHandler, application.getContentResolver());
- agentTimeoutParameters.start();
-
- // We need to mock BMS timeout parameters before initializing the BackupHandler since
- // the constructor of BackupHandler relies on the timeout parameters.
- when(mBackupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
BackupHandler backupHandler = new BackupHandler(mBackupManagerService, backupLooper);
mWakeLock = createBackupWakeLock(application);
@@ -136,8 +125,7 @@
mTransportManager,
application.getPackageManager(),
backupHandler,
- mWakeLock,
- agentTimeoutParameters);
+ mWakeLock);
when(mBackupManagerService.getPendingRestores()).thenReturn(new ArrayDeque<>());
}
diff --git a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
index 5a886e3..c210fde 100644
--- a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
+++ b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
@@ -28,7 +28,6 @@
import android.os.PowerManager;
import android.util.SparseArray;
-import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.TransportManager;
import com.android.server.backup.internal.BackupHandler;
@@ -44,8 +43,7 @@
TransportManager transportManager,
PackageManager packageManager,
BackupHandler backupHandler,
- PowerManager.WakeLock wakeLock,
- BackupAgentTimeoutParameters agentTimeoutParameters) {
+ PowerManager.WakeLock wakeLock) {
when(backupManagerService.getContext()).thenReturn(context);
when(backupManagerService.getTransportManager()).thenReturn(transportManager);
when(backupManagerService.getPackageManager()).thenReturn(packageManager);
@@ -55,7 +53,6 @@
when(backupManagerService.getCurrentOperations()).thenReturn(new SparseArray<>());
when(backupManagerService.getActivityManager()).thenReturn(mock(IActivityManager.class));
when(backupManagerService.getWakelock()).thenReturn(wakeLock);
- when(backupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
}
public static PowerManager.WakeLock createBackupWakeLock(Application application) {
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
index 69796b3..25747b8 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
@@ -296,7 +296,6 @@
keyDerivationParams.getSalt(),
TEST_CREDENTIAL);
Long counterId = mRecoverableKeyStoreDb.getCounterId(TEST_USER_ID, TEST_RECOVERY_AGENT_UID);
- counterId = 1L; // TODO: use value from the database.
assertThat(counterId).isNotNull();
byte[] recoveryKey = decryptThmEncryptedKey(
lockScreenHash,
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
index c4a688b..0f2e56b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
@@ -367,6 +367,28 @@
}
@Test
+ public void testActionsMoreOptionsThanChoices() {
+ PendingIntent intent1 = mock(PendingIntent.class);
+ PendingIntent intent2 = mock(PendingIntent.class);
+ Icon icon = mock(Icon.class);
+
+ Notification n1 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent1).build())
+ .addAction(new Notification.Action.Builder(icon, "TEXT 2", intent1)
+ .addRemoteInput(new RemoteInput.Builder("a")
+ .setChoices(new CharSequence[] {"i", "m"})
+ .build())
+ .build())
+ .build();
+ Notification n2 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent2).build())
+ .addAction(new Notification.Action.Builder(icon, "TEXT 2", intent1).build())
+ .build();
+
+ assertTrue(Notification.areActionsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
public void testActionsDifferentRemoteInputs() {
PendingIntent intent = mock(PendingIntent.class);
Icon icon = mock(Icon.class);
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 73243d2..1c0e260 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -881,7 +881,7 @@
*/
@IntDef(prefix = { "HANDOVER_" },
value = {HANDOVER_FAILURE_DEST_APP_REJECTED, HANDOVER_FAILURE_NOT_SUPPORTED,
- HANDOVER_FAILURE_USER_REJECTED, HANDOVER_FAILURE_ONGOING_EMERG_CALL,
+ HANDOVER_FAILURE_USER_REJECTED, HANDOVER_FAILURE_ONGOING_EMERGENCY_CALL,
HANDOVER_FAILURE_UNKNOWN})
@Retention(RetentionPolicy.SOURCE)
public @interface HandoverFailureErrors {}
@@ -939,7 +939,7 @@
* For more information on call handovers, see
* {@link #handoverTo(PhoneAccountHandle, int, Bundle)}.
*/
- public static final int HANDOVER_FAILURE_ONGOING_EMERG_CALL = 4;
+ public static final int HANDOVER_FAILURE_ONGOING_EMERGENCY_CALL = 4;
/**
* Handover failure reason returned via {@link #onHandoverFailed(Call, int)} when a handover
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index eebe2a1..c79eec0 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -2227,7 +2227,9 @@
/**
* Gets the configuration values for a particular subscription, which is associated with a
* specific SIM card. If an invalid subId is used, the returned config will contain default
- * values.
+ * values. After using this method to get the configuration bundle,
+ * {@link #isConfigForIdentifiedCarrier(PersistableBundle)} should be called to confirm whether
+ * any carrier specific configuration has been applied.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
@@ -2254,7 +2256,9 @@
}
/**
- * Gets the configuration values for the default subscription.
+ * Gets the configuration values for the default subscription. After using this method to get
+ * the configuration bundle, {@link #isConfigForIdentifiedCarrier(PersistableBundle)} should be
+ * called to confirm whether any carrier specific configuration has been applied.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
@@ -2283,6 +2287,9 @@
* <p>
* After using {@link #getConfig()} or {@link #getConfigForSubId(int)} an app should always
* use this method to confirm whether any carrier specific configuration has been applied.
+ * Especially when an app misses the broadcast {@link #ACTION_CARRIER_CONFIG_CHANGED} but it
+ * still needs to get the current configuration, it must use this method to verify whether the
+ * configuration is default or carrier overridden.
* </p>
*
* @param bundle the configuration bundle to be checked.