Merge "Add CursorWindow perf tests"
diff --git a/api/current.txt b/api/current.txt
index 88390b9..1a01f0e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -37584,12 +37584,10 @@
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.view.SurfaceHolder getSurfaceHolder();
- method public void invalidateColors();
method public boolean isPreview();
method public boolean isVisible();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
- method public android.app.WallpaperColors onComputeWallpaperColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
diff --git a/api/system-current.txt b/api/system-current.txt
index 4fb52d7..2391621 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -40803,12 +40803,10 @@
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.view.SurfaceHolder getSurfaceHolder();
- method public void invalidateColors();
method public boolean isPreview();
method public boolean isVisible();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
- method public android.app.WallpaperColors onComputeWallpaperColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
diff --git a/api/test-current.txt b/api/test-current.txt
index ca4898b..fea258c 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -37792,12 +37792,10 @@
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.view.SurfaceHolder getSurfaceHolder();
- method public void invalidateColors();
method public boolean isPreview();
method public boolean isVisible();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
- method public android.app.WallpaperColors onComputeWallpaperColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
diff --git a/core/java/android/hardware/radio/IRadioService.aidl b/core/java/android/hardware/radio/IRadioService.aidl
index 9a157d1..c43fd26 100644
--- a/core/java/android/hardware/radio/IRadioService.aidl
+++ b/core/java/android/hardware/radio/IRadioService.aidl
@@ -26,6 +26,8 @@
* {@hide}
*/
interface IRadioService {
+ List<RadioManager.ModuleProperties> listModules();
+
ITuner openTuner(int moduleId, in RadioManager.BandConfig bandConfig, boolean withAudio,
in ITunerCallback callback);
}
diff --git a/core/java/android/hardware/radio/RadioManager.aidl b/core/java/android/hardware/radio/RadioManager.aidl
index 0f0ec84..8a39388 100644
--- a/core/java/android/hardware/radio/RadioManager.aidl
+++ b/core/java/android/hardware/radio/RadioManager.aidl
@@ -17,7 +17,10 @@
package android.hardware.radio;
/** @hide */
-parcelable RadioManager.ProgramInfo;
+parcelable RadioManager.BandConfig;
/** @hide */
-parcelable RadioManager.BandConfig;
+parcelable RadioManager.ModuleProperties;
+
+/** @hide */
+parcelable RadioManager.ProgramInfo;
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index 20292f7..434cf51 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -31,8 +31,8 @@
import android.text.TextUtils;
import android.util.Log;
-import java.util.List;
import java.util.Arrays;
+import java.util.List;
/**
* The RadioManager class allows to control a broadcast radio tuner present on the device.
@@ -111,6 +111,7 @@
public static class ModuleProperties implements Parcelable {
private final int mId;
+ @NonNull private final String mServiceName;
private final int mClassId;
private final String mImplementor;
private final String mProduct;
@@ -123,10 +124,12 @@
private final boolean mIsBgScanSupported;
private final String mVendorExension;
- ModuleProperties(int id, int classId, String implementor, String product, String version,
- String serial, int numTuners, int numAudioSources, boolean isCaptureSupported,
- BandDescriptor[] bands, boolean isBgScanSupported, String vendorExension) {
+ ModuleProperties(int id, String serviceName, int classId, String implementor,
+ String product, String version, String serial, int numTuners, int numAudioSources,
+ boolean isCaptureSupported, BandDescriptor[] bands, boolean isBgScanSupported,
+ String vendorExension) {
mId = id;
+ mServiceName = TextUtils.isEmpty(serviceName) ? "default" : serviceName;
mClassId = classId;
mImplementor = implementor;
mProduct = product;
@@ -149,6 +152,16 @@
return mId;
}
+ /**
+ * Module service (driver) name as registered with HIDL.
+ * @return the module service name.
+ *
+ * @hide FutureFeature
+ */
+ public @NonNull String getServiceName() {
+ return mServiceName;
+ }
+
/** Module class identifier: {@link #CLASS_AM_FM}, {@link #CLASS_SAT}, {@link #CLASS_DT}
* @return the radio module class identifier.
*/
@@ -250,6 +263,8 @@
private ModuleProperties(Parcel in) {
mId = in.readInt();
+ String serviceName = in.readString();
+ mServiceName = TextUtils.isEmpty(serviceName) ? "default" : serviceName;
mClassId = in.readInt();
mImplementor = in.readString();
mProduct = in.readString();
@@ -281,6 +296,7 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mId);
+ dest.writeString(mServiceName);
dest.writeInt(mClassId);
dest.writeString(mImplementor);
dest.writeString(mProduct);
@@ -301,7 +317,8 @@
@Override
public String toString() {
- return "ModuleProperties [mId=" + mId + ", mClassId=" + mClassId
+ return "ModuleProperties [mId=" + mId
+ + ", mServiceName=" + mServiceName + ", mClassId=" + mClassId
+ ", mImplementor=" + mImplementor + ", mProduct=" + mProduct
+ ", mVersion=" + mVersion + ", mSerial=" + mSerial
+ ", mNumTuners=" + mNumTuners
@@ -316,6 +333,7 @@
final int prime = 31;
int result = 1;
result = prime * result + mId;
+ result = prime * result + mServiceName.hashCode();
result = prime * result + mClassId;
result = prime * result + ((mImplementor == null) ? 0 : mImplementor.hashCode());
result = prime * result + ((mProduct == null) ? 0 : mProduct.hashCode());
@@ -339,6 +357,7 @@
ModuleProperties other = (ModuleProperties) obj;
if (mId != other.getId())
return false;
+ if (!TextUtils.equals(mServiceName, other.mServiceName)) return false;
if (mClassId != other.getClassId())
return false;
if (mImplementor == null) {
@@ -1457,7 +1476,35 @@
* <li>{@link #STATUS_DEAD_OBJECT} if the binder transaction to the native service fails, </li>
* </ul>
*/
- public native int listModules(List <ModuleProperties> modules);
+ public int listModules(List<ModuleProperties> modules) {
+ if (modules == null) {
+ Log.e(TAG, "the output list must not be empty");
+ return STATUS_BAD_VALUE;
+ }
+
+ if (mService == null) {
+ return nativeListModules(modules);
+ }
+
+ Log.v(TAG, "Listing available tuners...");
+ List<ModuleProperties> returnedList;
+ try {
+ returnedList = mService.listModules();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed listing available tuners", e);
+ return STATUS_DEAD_OBJECT;
+ }
+
+ if (returnedList == null) {
+ Log.e(TAG, "Returned list was a null");
+ return STATUS_ERROR;
+ }
+
+ modules.addAll(returnedList);
+ return STATUS_OK;
+ }
+
+ private native int nativeListModules(List<ModuleProperties> modules);
/**
* Open an interface to control a tuner on a given broadcast radio module.
@@ -1487,7 +1534,8 @@
try {
tuner = mService.openTuner(moduleId, config, withAudio, halCallback);
} catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ Log.e(TAG, "Failed to open tuner", e);
+ return null;
}
if (tuner == null) {
Log.e(TAG, "Failed to open tuner");
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 201e594..ed2b0b2 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -9950,6 +9950,16 @@
public static final String ENABLE_EPHEMERAL_FEATURE = "enable_ephemeral_feature";
/**
+ * Toggle to enable/disable dexopt for instant applications. The default is for dexopt
+ * to be disabled.
+ * <p>
+ * Type: int (0 to disable, 1 to enable)
+ *
+ * @hide
+ */
+ public static final String INSTANT_APP_DEXOPT_ENABLED = "instant_app_dexopt_enabled";
+
+ /**
* The min period for caching installed instant apps in milliseconds.
* <p>
* Type: long
@@ -10099,6 +10109,15 @@
"backup_refactored_service_disabled";
/**
+ * Flag to set the waiting time for euicc factory reset inside System > Settings
+ * Type: long
+ *
+ * @hide
+ */
+ public static final String EUICC_WIPING_TIMEOUT_MILLIS =
+ "euicc_wiping_timeout_millis";
+
+ /**
* Settings to backup. This is here so that it's in the same place as the settings
* keys and easy to update.
*
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index fa3f55b..6ea7d5e 100644
--- a/core/java/android/service/autofill/SaveInfo.java
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -273,13 +273,24 @@
*
* <p>See {@link SaveInfo} for more info.
*
- * @throws IllegalArgumentException if {@code requiredIds} is {@code null} or empty.
+ * @throws IllegalArgumentException if {@code requiredIds} is {@code null} or empty, or if
+ * it contains any {@code null} entry.
*/
public Builder(@SaveDataType int type, @NonNull AutofillId[] requiredIds) {
- Preconditions.checkArgument(requiredIds != null && requiredIds.length > 0,
- "must have at least one required id: " + Arrays.toString(requiredIds));
+ // TODO: add CTS unit tests (not integration) to assert the null cases
mType = type;
- mRequiredIds = requiredIds;
+ mRequiredIds = assertValid(requiredIds);
+ }
+
+ 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;
}
/**
@@ -302,12 +313,14 @@
*
* @param ids The ids of the optional views.
* @return This builder.
+ *
+ * @throws IllegalArgumentException if {@code ids} is {@code null} or empty, or if
+ * it contains any {@code null} entry.
*/
- public @NonNull Builder setOptionalIds(@Nullable AutofillId[] ids) {
+ public @NonNull Builder setOptionalIds(@NonNull AutofillId[] ids) {
+ // TODO: add CTS unit tests (not integration) to assert the null cases
throwIfDestroyed();
- if (ids != null && ids.length != 0) {
- mOptionalIds = ids;
- }
+ mOptionalIds = assertValid(ids);
return this;
}
@@ -421,7 +434,10 @@
final Builder builder = new Builder(parcel.readInt(),
parcel.readParcelableArray(null, AutofillId.class));
builder.setNegativeAction(parcel.readInt(), parcel.readParcelable(null));
- builder.setOptionalIds(parcel.readParcelableArray(null, AutofillId.class));
+ final AutofillId[] optionalIds = parcel.readParcelableArray(null, AutofillId.class);
+ if (optionalIds != null) {
+ builder.setOptionalIds(optionalIds);
+ }
builder.setDescription(parcel.readCharSequence());
builder.setFlags(parcel.readInt());
return builder.build();
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 539278f..da6b1f5 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -548,6 +548,7 @@
/**
* Notifies the engine that wallpaper colors changed significantly.
* This will trigger a {@link #onComputeWallpaperColors()} call.
+ * @hide
*/
public void invalidateColors() {
try {
@@ -564,6 +565,7 @@
* you might want to call {@link #invalidateColors()} in a near future.
*
* @return List of wallpaper colors and their weights.
+ * @hide
*/
public @Nullable WallpaperColors onComputeWallpaperColors() {
return null;
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index dfbf962..4c0a190 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1391,6 +1391,13 @@
public static final int PRIVATE_FLAG_TASK_SNAPSHOT = 0x00080000;
/**
+ * Flag to indicate that this window should be ignored when determining what parts of the
+ * screen can be magnified.
+ * @hide
+ */
+ public static final int PRIVATE_FLAG_NO_MAGNIFICATION_REGION_EFFECT = 0x00100000;
+
+ /**
* Control flags that are private to the platform.
* @hide
*/
diff --git a/core/jni/android_hardware_Radio.cpp b/core/jni/android_hardware_Radio.cpp
index 39e615c..8b9be68 100644
--- a/core/jni/android_hardware_Radio.cpp
+++ b/core/jni/android_hardware_Radio.cpp
@@ -449,7 +449,7 @@
bool isBgscanSupported = false; // TODO(b/32621193): pass from the HAL
jstring jVendorExension = env->NewStringUTF(""); // TODO(b/32621193): pass from the HAL
jobject jModule = env->NewObject(gModulePropertiesClass, gModulePropertiesCstor,
- nModules[i].handle, nModules[i].class_id,
+ nModules[i].handle, nullptr, nModules[i].class_id,
jImplementor, jProduct, jVersion, jSerial,
nModules[i].num_tuners,
nModules[i].num_audio_sources,
@@ -819,7 +819,7 @@
static JNINativeMethod gMethods[] = {
- {"listModules",
+ {"nativeListModules",
"(Ljava/util/List;)I",
(void *)android_hardware_Radio_listModules},
};
@@ -888,7 +888,9 @@
jclass modulePropertiesClass = FindClassOrDie(env, kModulePropertiesClassPathName);
gModulePropertiesClass = MakeGlobalRefOrDie(env, modulePropertiesClass);
gModulePropertiesCstor = GetMethodIDOrDie(env, modulePropertiesClass, "<init>",
- "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIZ[Landroid/hardware/radio/RadioManager$BandDescriptor;ZLjava/lang/String;)V");
+ "(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;"
+ "Ljava/lang/String;IIZ[Landroid/hardware/radio/RadioManager$BandDescriptor;Z"
+ "Ljava/lang/String;)V");
jclass bandDescriptorClass = FindClassOrDie(env, kRadioBandDescriptorClassPathName);
gRadioBandDescriptorClass = MakeGlobalRefOrDie(env, bandDescriptorClass);
diff --git a/packages/SettingsLib/res/drawable/ic_lockscreen_ime.xml b/packages/SettingsLib/res/drawable/ic_lockscreen_ime.xml
index 4aa8569..4b81a3c 100644
--- a/packages/SettingsLib/res/drawable/ic_lockscreen_ime.xml
+++ b/packages/SettingsLib/res/drawable/ic_lockscreen_ime.xml
@@ -18,7 +18,7 @@
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
- android:tint="?android:attr/colorAccent">
+ android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FF000000"
android:pathData="M20,5L4,5c-1.1,0 -1.99,0.9 -1.99,2L2,17c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9
diff --git a/packages/SettingsLib/res/layout/preference_two_target.xml b/packages/SettingsLib/res/layout/preference_two_target.xml
index 69b7204..7000940 100644
--- a/packages/SettingsLib/res/layout/preference_two_target.xml
+++ b/packages/SettingsLib/res/layout/preference_two_target.xml
@@ -32,7 +32,8 @@
android:background="?android:attr/selectableItemBackground"
android:gravity="start|center_vertical"
android:clipToPadding="false"
- android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
<LinearLayout
android:id="@+id/icon_frame"
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index fbdb394..b4c8cec 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -282,7 +282,7 @@
<string name="show_all_anrs" msgid="28462979638729082">"Tots els errors sense resposta"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que una aplicació en segon pla no respon"</string>
<string name="show_notification_channel_warnings" msgid="1399948193466922683">"Mostra avisos del canal de notificacions"</string>
- <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Mostra un avís a la pantalla quan una app publica una notificació sense canal vàlid"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Mostra un avís a la pantalla quan una aplicació publica una notificació sense un canal vàlid"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"Força permís d\'aplicacions a l\'emmagatzem. extern"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permet que qualsevol aplicació es pugui escriure en un dispositiu d’emmagatzematge extern, independentment dels valors definits"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Força l\'ajust de la mida de les activitats"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 66e55f9..2949012 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"No se estableció conexión debido a la mala calidad de la red"</string>
<string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Error de conexión Wi-Fi"</string>
<string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problema de autenticación"</string>
- <string name="wifi_cant_connect" msgid="5410016875644565884">"No se puede establecer conexión"</string>
+ <string name="wifi_cant_connect" msgid="5410016875644565884">"No se puede establecer la conexión"</string>
<string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"No se puede establecer conexión con \"<xliff:g id="AP_NAME">%1$s</xliff:g>\""</string>
<string name="wifi_check_password_try_again" msgid="516958988102584767">"Revisa la contraseña y vuelve a intentarlo"</string>
<string name="wifi_not_in_range" msgid="1136191511238508967">"Fuera de alcance"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 414ff31..736579f 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -281,8 +281,8 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite proc. em 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar erro \"Aplic. não Resp.\" p/ aplic. 2º plano"</string>
- <string name="show_notification_channel_warnings" msgid="1399948193466922683">"Mostrar avisos do canal de notif."</string>
- <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Mostra um aviso no ecrã quando uma aplic. publica uma notific. sem um canal válido"</string>
+ <string name="show_notification_channel_warnings" msgid="1399948193466922683">"Mostrar avisos do canal de notificações"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Mostra um aviso no ecrã quando uma aplicação publica uma notificação sem o canal ser válido"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"Forçar perm. de aplicações no armazenamento ext."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Torna qualquer aplicação elegível para ser gravada no armazenamento externo, independentemente dos valores do manifesto"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forçar as atividades a serem redimensionáveis"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index d29d8d4..edd02c9 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -88,7 +88,7 @@
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"取消"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"配對完成後,所配對的裝置即可在連線後存取你的聯絡人和通話紀錄。"</string>
<string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"無法與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 配對。"</string>
- <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"無法與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 配對,因為 PIN 或密碼金鑰不正確。"</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"無法與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 配對,因為 PIN 碼或密碼金鑰不正確。"</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"無法與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 通訊。"</string>
<string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」拒絕配對要求。"</string>
<string name="accessibility_wifi_off" msgid="1166761729660614716">"已關閉 Wi-Fi。"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index b21f2fa..5767823 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -35,7 +35,7 @@
private static String sServicesSystemSharedLibPackageName;
private static String sSharedSystemSharedLibPackageName;
- public static final int[] WIFI_PIE_FOR_BADGING = {
+ static final int[] WIFI_PIE_FOR_BADGING = {
com.android.internal.R.drawable.ic_signal_wifi_badged_0_bars,
com.android.internal.R.drawable.ic_signal_wifi_badged_1_bar,
com.android.internal.R.drawable.ic_signal_wifi_badged_2_bars,
@@ -294,12 +294,7 @@
});
}
- /**
- * Returns the resource id for the given badge or {@link View.NO_ID} if no badge is to be shown.
- *
- * @throws IllegalArgumentException if the given badge value is not supported.
- */
- public static int getWifiBadgeResource(int badge) {
+ private static int getWifiBadgeResource(int badge) {
switch (badge) {
case NetworkBadging.BADGING_NONE:
return View.NO_ID;
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
index ec94841..0d67ad0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
@@ -12,17 +12,13 @@
import android.content.Intent;
import android.net.NetworkInfo;
-import android.net.NetworkKey;
-import android.net.WifiKey;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
-import android.util.Log;
import java.util.List;
public class WifiStatusTracker {
- private static final String TAG = "WifiStatusTracker";
private final WifiManager mWifiManager;
public boolean enabled;
@@ -32,7 +28,6 @@
public String ssid;
public int rssi;
public int level;
- public NetworkKey networkKey;
public WifiStatusTracker(WifiManager wifiManager) {
mWifiManager = wifiManager;
@@ -54,32 +49,19 @@
connecting = networkInfo != null && !networkInfo.isConnected()
&& networkInfo.isConnectedOrConnecting();
connected = networkInfo != null && networkInfo.isConnected();
- WifiInfo info = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO) != null
- ? (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO)
- : mWifiManager.getConnectionInfo();
-
// If Connected grab the signal strength and ssid.
- if (connected && info != null) {
- ssid = getSsid(info);
- String bssid = info.getBSSID();
- if ((ssid != null) && (bssid != null)) {
- // Reuse existing network key object if possible.
- if ((networkKey == null)
- || !networkKey.wifiKey.ssid.equals(ssid)
- || !networkKey.wifiKey.bssid.equals(bssid)) {
- try {
- networkKey = new NetworkKey(
- new WifiKey(ssid, bssid));
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Cannot create NetworkKey", e);
- }
- }
+ if (connected) {
+ // try getting it out of the intent first
+ WifiInfo info = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO) != null
+ ? (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO)
+ : mWifiManager.getConnectionInfo();
+ if (info != null) {
+ ssid = getSsid(info);
} else {
- networkKey = null;
+ ssid = null;
}
- } else {
+ } else if (!connected) {
ssid = null;
- networkKey = null;
}
} else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
// Default to -200 as its below WifiManager.MIN_RSSI.
diff --git a/packages/SystemUI/src/com/android/systemui/RoundedCorners.java b/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
index c52375f..7af4a90 100644
--- a/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
+++ b/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
@@ -115,7 +115,8 @@
| WindowManager.LayoutParams.FLAG_SLIPPERY
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
- lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS
+ | WindowManager.LayoutParams.PRIVATE_FLAG_NO_MAGNIFICATION_REGION_EFFECT;
lp.setTitle("RoundedOverlay");
lp.gravity = Gravity.TOP;
return lp;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 169019f..25f3e25 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -16,19 +16,15 @@
package com.android.systemui.statusbar;
-import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
-import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.net.NetworkBadging;
import android.telephony.SubscriptionInfo;
import android.util.ArraySet;
import android.util.AttributeSet;
@@ -80,10 +76,8 @@
private boolean mEthernetVisible = false;
private int mEthernetIconId = 0;
private int mLastEthernetIconId = -1;
- private int mWifiBadgeId = -1;
private boolean mWifiVisible = false;
private int mWifiStrengthId = 0;
- private int mLastWifiBadgeId = -1;
private int mLastWifiStrengthId = -1;
private boolean mWifiIn;
private boolean mWifiOut;
@@ -291,7 +285,6 @@
boolean activityIn, boolean activityOut, String description, boolean isTransient) {
mWifiVisible = statusIcon.visible && !mBlockWifi;
mWifiStrengthId = statusIcon.icon;
- mWifiBadgeId = statusIcon.iconOverlay;
mWifiDescription = statusIcon.contentDescription;
mWifiIn = activityIn && mActivityEnabled && mWifiVisible;
mWifiOut = activityOut && mActivityEnabled && mWifiVisible;
@@ -428,7 +421,6 @@
mWifi.setImageDrawable(null);
mWifiDark.setImageDrawable(null);
mLastWifiStrengthId = -1;
- mLastWifiBadgeId = -1;
}
for (PhoneState state : mPhoneStates) {
@@ -484,16 +476,10 @@
(mEthernetVisible ? "VISIBLE" : "GONE")));
if (mWifiVisible) {
- if (mWifiStrengthId != mLastWifiStrengthId || mWifiBadgeId != mLastWifiBadgeId) {
- if (mWifiBadgeId == -1) {
- setIconForView(mWifi, mWifiStrengthId);
- setIconForView(mWifiDark, mWifiStrengthId);
- } else {
- setBadgedWifiIconForView(mWifi, mWifiStrengthId, mWifiBadgeId);
- setBadgedWifiIconForView(mWifiDark, mWifiStrengthId, mWifiBadgeId);
- }
+ if (mWifiStrengthId != mLastWifiStrengthId) {
+ setIconForView(mWifi, mWifiStrengthId);
+ setIconForView(mWifiDark, mWifiStrengthId);
mLastWifiStrengthId = mWifiStrengthId;
- mLastWifiBadgeId = mWifiBadgeId;
}
mWifiGroup.setContentDescription(mWifiDescription);
mWifiGroup.setVisibility(View.VISIBLE);
@@ -558,10 +544,6 @@
// Using the imageView's context to retrieve the Drawable so that theme is preserved.
Drawable icon = imageView.getContext().getDrawable(iconId);
- setScaledIcon(imageView, icon);
- }
-
- private void setScaledIcon(ImageView imageView, Drawable icon) {
if (mIconScaleFactor == 1.f) {
imageView.setImageDrawable(icon);
} else {
@@ -569,33 +551,6 @@
}
}
- /**
- * Creates and sets a LayerDrawable from the given ids on the given view.
- *
- * <p>This method will also scale the icon by {@link #mIconScaleFactor} if appropriate.
- */
- private void setBadgedWifiIconForView(ImageView imageView, @DrawableRes int wifiPieId,
- @DrawableRes int badgeId) {
- // TODO(sghuman): Delete this method and revert to N badging logic
- // Using the imageView's context to retrieve the Drawable so that theme is preserved.;
- LayerDrawable icon = new LayerDrawable(new Drawable[] {
- imageView.getContext().getDrawable(wifiPieId),
- imageView.getContext().getDrawable(NetworkBadging.BADGING_NONE)});
-
- // The LayerDrawable shares an underlying state so we must mutate the object to change the
- // color between the light and dark themes.
- icon.mutate().setTint(getColorAttr(imageView.getContext(), R.attr.singleToneColor));
-
- setScaledIcon(imageView, icon);
- }
-
- /** Returns the given color attribute value, or white if not defined. */
- @ColorInt private static int getColorAttr(Context context, int attr) {
- TypedArray ta = context.obtainStyledAttributes(new int[] {attr});
- @ColorInt int colorAccent = ta.getColor(0, Color.WHITE);
- ta.recycle();
- return colorAccent;
- }
@Override
public void onDarkChanged(Rect tintArea, float darkIntensity, int tint) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index c02ce0e..2771011 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -67,29 +67,15 @@
public static class IconState {
public final boolean visible;
-
public final int icon;
-
- /**
- * Optional iconOverlay resource id.
- *
- * <p>Set to -1 if not present.
- */
- public final int iconOverlay;
-
public final String contentDescription;
- public IconState(boolean visible, int icon, int iconOverlay, String contentDescription) {
+ public IconState(boolean visible, int icon, String contentDescription) {
this.visible = visible;
this.icon = icon;
- this.iconOverlay = iconOverlay;
this.contentDescription = contentDescription;
}
- public IconState(boolean visible, int icon, String contentDescription) {
- this(visible, icon, -1 /* iconOverlay */, contentDescription);
- }
-
public IconState(boolean visible, int icon, int contentDescription,
Context context) {
this(visible, icon, context.getString(contentDescription));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index c21f444..39f7d12 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -24,7 +24,6 @@
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
-import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
@@ -92,7 +91,6 @@
private final DataSaverController mDataSaverController;
private final CurrentUserTracker mUserTracker;
private Config mConfig;
- private final NetworkScoreManager mNetworkScoreManager;
// Subcontrollers.
@VisibleForTesting
@@ -149,12 +147,9 @@
public NetworkControllerImpl(Context context, Looper bgLooper,
DeviceProvisionedController deviceProvisionedController) {
this(context, (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE),
- context.getSystemService(NetworkScoreManager.class),
(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE),
(WifiManager) context.getSystemService(Context.WIFI_SERVICE),
- SubscriptionManager.from(context),
- Config.readConfig(context),
- bgLooper,
+ SubscriptionManager.from(context), Config.readConfig(context), bgLooper,
new CallbackHandler(),
new AccessPointControllerImpl(context, bgLooper),
new DataUsageController(context),
@@ -165,12 +160,8 @@
@VisibleForTesting
NetworkControllerImpl(Context context, ConnectivityManager connectivityManager,
- NetworkScoreManager networkScoreManager,
- TelephonyManager telephonyManager,
- WifiManager wifiManager,
- SubscriptionManager subManager,
- Config config,
- Looper bgLooper,
+ TelephonyManager telephonyManager, WifiManager wifiManager,
+ SubscriptionManager subManager, Config config, Looper bgLooper,
CallbackHandler callbackHandler,
AccessPointControllerImpl accessPointController,
DataUsageController dataUsageController,
@@ -193,7 +184,6 @@
// wifi
mWifiManager = wifiManager;
- mNetworkScoreManager = networkScoreManager;
mLocale = mContext.getResources().getConfiguration().locale;
mAccessPoints = accessPointController;
@@ -207,7 +197,7 @@
}
});
mWifiSignalController = new WifiSignalController(mContext, mHasMobileDataFeature,
- mCallbackHandler, this, mNetworkScoreManager);
+ mCallbackHandler, this);
mEthernetSignalController = new EthernetSignalController(mContext, mCallbackHandler, this);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
index 2104cb1..2819624 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
@@ -17,50 +17,33 @@
import android.content.Context;
import android.content.Intent;
-import android.database.ContentObserver;
-import android.net.NetworkBadging;
import android.net.NetworkCapabilities;
-import android.net.NetworkKey;
-import android.net.NetworkScoreManager;
-import android.net.ScoredNetwork;
import android.net.wifi.WifiManager;
-import android.net.wifi.WifiNetworkScoreCache;
-import android.net.wifi.WifiNetworkScoreCache.CacheListener;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
-import android.provider.Settings;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.AsyncChannel;
-import com.android.settingslib.Utils;
import com.android.settingslib.wifi.WifiStatusTracker;
+import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
-import com.android.systemui.R;
-
import java.util.Objects;
-import java.util.List;
public class WifiSignalController extends
SignalController<WifiSignalController.WifiState, SignalController.IconGroup> {
-
private final WifiManager mWifiManager;
private final AsyncChannel mWifiChannel;
private final boolean mHasMobileData;
- private final NetworkScoreManager mNetworkScoreManager;
- private final WifiNetworkScoreCache mScoreCache;
private final WifiStatusTracker mWifiTracker;
- private boolean mScoringUiEnabled = false;
-
public WifiSignalController(Context context, boolean hasMobileData,
- CallbackHandler callbackHandler, NetworkControllerImpl networkController,
- NetworkScoreManager networkScoreManager) {
+ CallbackHandler callbackHandler, NetworkControllerImpl networkController) {
super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
callbackHandler, networkController);
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@@ -85,44 +68,6 @@
AccessibilityContentDescriptions.WIFI_NO_CONNECTION
);
- mScoreCache = new WifiNetworkScoreCache(context, new CacheListener(handler) {
- @Override
- public void networkCacheUpdated(List<ScoredNetwork> networks) {
- mCurrentState.badgeEnum = getWifiBadgeEnum();
- notifyListenersIfNecessary();
- }
- });
-
- // Setup scoring
- mNetworkScoreManager = networkScoreManager;
- configureScoringGating();
- registerScoreCache();
- }
-
- private void configureScoringGating() {
- ContentObserver observer = new ContentObserver(new Handler(Looper.getMainLooper())) {
- @Override
- public void onChange(boolean selfChange) {
- mScoringUiEnabled =
- Settings.Global.getInt(
- mContext.getContentResolver(),
- Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
- }
- };
- mContext.getContentResolver().registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.NETWORK_SCORING_UI_ENABLED),
- false /* notifyForDescendants */,
- observer);
-
- observer.onChange(false /* selfChange */); // Set the initial values
- }
-
- private void registerScoreCache() {
- Log.d(mTag, "Registered score cache");
- mNetworkScoreManager.registerNetworkScoreCache(
- NetworkKey.TYPE_WIFI,
- mScoreCache,
- NetworkScoreManager.CACHE_FILTER_CURRENT_NETWORK);
}
@Override
@@ -143,77 +88,27 @@
("," + mContext.getString(R.string.accessibility_quick_settings_no_internet));
}
- IconState statusIcon = new IconState(wifiVisible, getCurrentIconId(),
- Utils.getWifiBadgeResource(mCurrentState.badgeEnum), contentDescription);
- IconState qsIcon = new IconState(
- mCurrentState.connected, getQsCurrentIconId(),
- Utils.getWifiBadgeResource(mCurrentState.badgeEnum), contentDescription);
+ IconState statusIcon = new IconState(wifiVisible, getCurrentIconId(), contentDescription);
+ IconState qsIcon = new IconState(mCurrentState.connected, getQsCurrentIconId(),
+ contentDescription);
callback.setWifiIndicators(mCurrentState.enabled, statusIcon, qsIcon,
ssidPresent && mCurrentState.activityIn, ssidPresent && mCurrentState.activityOut,
wifiDesc, mCurrentState.isTransient);
}
- @Override
- public int getCurrentIconId() {
- if (mCurrentState.badgeEnum != NetworkBadging.BADGING_NONE) {
- return Utils.WIFI_PIE_FOR_BADGING[mCurrentState.level];
- }
- return super.getCurrentIconId();
- }
-
/**
* Extract wifi state directly from broadcasts about changes in wifi state.
*/
public void handleBroadcast(Intent intent) {
- // Update the WifiStatusTracker with the new information and update the score cache.
- NetworkKey previousNetworkKey = mWifiTracker.networkKey;
mWifiTracker.handleBroadcast(intent);
- updateScoreCacheIfNecessary(previousNetworkKey);
-
- mCurrentState.isTransient = mWifiTracker.state == WifiManager.WIFI_STATE_ENABLING
- || mWifiTracker.state == WifiManager.WIFI_AP_STATE_DISABLING
- || mWifiTracker.connecting;
mCurrentState.enabled = mWifiTracker.enabled;
mCurrentState.connected = mWifiTracker.connected;
mCurrentState.ssid = mWifiTracker.ssid;
mCurrentState.rssi = mWifiTracker.rssi;
mCurrentState.level = mWifiTracker.level;
- mCurrentState.badgeEnum = getWifiBadgeEnum();
notifyListenersIfNecessary();
}
- /**
- * Clears old scores out of the cache and requests new scores if the network key has changed.
- *
- * <p>New scores are requested asynchronously.
- */
- private void updateScoreCacheIfNecessary(NetworkKey previousNetworkKey) {
- if (mWifiTracker.networkKey == null) {
- return;
- }
- if ((previousNetworkKey == null) || !mWifiTracker.networkKey.equals(previousNetworkKey)) {
- mScoreCache.clearScores();
- mNetworkScoreManager.requestScores(new NetworkKey[]{mWifiTracker.networkKey});
- }
- }
-
- /**
- * Returns the wifi badge enum for the current {@link #mWifiTracker} state.
- *
- * <p>{@link #updateScoreCacheIfNecessary} should be called prior to this method.
- */
- private int getWifiBadgeEnum() {
- if (!mScoringUiEnabled || mWifiTracker.networkKey == null) {
- return NetworkBadging.BADGING_NONE;
- }
- ScoredNetwork score = mScoreCache.getScoredNetwork(mWifiTracker.networkKey);
-
- if (score != null) {
- return score.calculateBadge(mWifiTracker.rssi);
- }
- return NetworkBadging.BADGING_NONE;
- }
-
@VisibleForTesting
void setActivity(int wifiActivity) {
mCurrentState.activityIn = wifiActivity == WifiManager.DATA_ACTIVITY_INOUT
@@ -254,7 +149,6 @@
static class WifiState extends SignalController.State {
String ssid;
- int badgeEnum;
boolean isTransient;
@Override
@@ -262,7 +156,6 @@
super.copyFrom(s);
WifiState state = (WifiState) s;
ssid = state.ssid;
- badgeEnum = state.badgeEnum;
isTransient = state.isTransient;
}
@@ -270,7 +163,6 @@
protected void toString(StringBuilder builder) {
super.toString(builder);
builder.append(',').append("ssid=").append(ssid);
- builder.append(',').append("badgeEnum=").append(badgeEnum);
builder.append(',').append("isTransient=").append(isTransient);
}
@@ -278,7 +170,6 @@
public boolean equals(Object o) {
return super.equals(o)
&& Objects.equals(((WifiState) o).ssid, ssid)
- && (((WifiState) o).badgeEnum == badgeEnum)
&& (((WifiState) o).isTransient == isTransient);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
index cb20639..51bd7bc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -18,6 +18,7 @@
import android.os.HandlerThread;
import android.support.test.runner.AndroidJUnit4;
import android.telephony.SubscriptionInfo;
+import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 505e1d8..a8319a8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -19,7 +19,6 @@
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
-import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.os.Looper;
import android.telephony.PhoneStateListener;
@@ -84,7 +83,6 @@
protected Config mConfig;
protected CallbackHandler mCallbackHandler;
protected SubscriptionDefaults mMockSubDefaults;
- protected NetworkScoreManager mMockNetworkScoreManager;
protected DeviceProvisionedController mMockProvisionController;
protected DeviceProvisionedListener mUserCallback;
@@ -113,8 +111,6 @@
mMockCm = mock(ConnectivityManager.class);
mMockSubDefaults = mock(SubscriptionDefaults.class);
mNetCapabilities = new NetworkCapabilities();
- mMockNetworkScoreManager = mock(NetworkScoreManager.class);
-
when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn(
new NetworkCapabilities[] { mNetCapabilities });
@@ -135,8 +131,7 @@
return null;
}).when(mMockProvisionController).addCallback(any());
- mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager,
- mMockTm, mMockWm, mMockSm,
+ mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mMockProvisionController);
@@ -177,8 +172,8 @@
protected NetworkControllerImpl setUpNoMobileData() {
when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
NetworkControllerImpl networkControllerNoMobile
- = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager, mMockTm,
- mMockWm, mMockSm, mConfig, mContext.getMainLooper(), mCallbackHandler,
+ = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
+ mConfig, mContext.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
mock(DeviceProvisionedController.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index dfe00f9..8d106b4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -91,8 +91,7 @@
public void test4gDataIcon() {
// Switch to showing 4g icon and re-initialize the NetworkController.
mConfig.show4gForLte = true;
- mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager,
- mMockTm, mMockWm, mMockSm,
+ mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index 1627925..be3802b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -54,8 +54,7 @@
// Turn off mobile network support.
Mockito.when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
// Create a new NetworkController as this is currently handled in constructor.
- mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager,
- mMockTm, mMockWm, mMockSm,
+ mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class));
@@ -117,8 +116,7 @@
// Turn off mobile network support.
Mockito.when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
// Create a new NetworkController as this is currently handled in constructor.
- mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager,
- mMockTm, mMockWm, mMockSm,
+ mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
index dbaa2c5..ffd0165 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
@@ -1,47 +1,24 @@
package com.android.systemui.statusbar.policy;
import android.content.Intent;
-import android.net.NetworkBadging;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
-import android.net.NetworkKey;
-import android.net.RssiCurve;
-import android.net.ScoredNetwork;
-import android.net.WifiKey;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
-import android.net.wifi.WifiNetworkScoreCache;
-import android.os.Bundle;
-import android.provider.Settings;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.settingslib.Utils;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.Matchers;
import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
import static junit.framework.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -50,13 +27,6 @@
private static final int MIN_RSSI = -100;
private static final int MAX_RSSI = -55;
- private static final int LATCH_TIMEOUT = 2000;
- private static final String TEST_SSID = "\"Test SSID\"";
- private static final String TEST_BSSID = "00:00:00:00:00:00";
-
- private final List<NetworkKey> mRequestedKeys = new ArrayList<>();
- private CountDownLatch mRequestScoresLatch;
-
@Test
public void testWifiIcon() {
String testSsid = "Test SSID";
@@ -77,79 +47,6 @@
}
@Test
- public void testBadgedWifiIcon() throws Exception {
- // TODO(sghuman): Refactor this setup code when creating a test for the badged QsIcon.
- int testLevel = 1;
- RssiCurve mockBadgeCurve = mock(RssiCurve.class);
- Bundle attr = new Bundle();
- attr.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, mockBadgeCurve);
- ScoredNetwork score =
- new ScoredNetwork(
- new NetworkKey(new WifiKey(TEST_SSID, TEST_BSSID)),
- null,
- false /* meteredHint */,
- attr);
-
- // Must set the Settings value before instantiating the NetworkControllerImpl due to bugs in
- // TestableSettingsProvider.
- Settings.Global.putString(mContext.getContentResolver(),
- Settings.Global.NETWORK_SCORING_UI_ENABLED,
- "1");
- super.setUp(); // re-instantiate NetworkControllImpl now that setting has been updated
- setupNetworkScoreManager();
-
- // Test Requesting Scores
- mRequestScoresLatch = new CountDownLatch(1);
- setWifiEnabled(true);
- setWifiState(true, TEST_SSID, TEST_BSSID);
- mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS);
-
- when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) NetworkBadging.BADGING_SD);
-
- ArgumentCaptor<WifiNetworkScoreCache> scoreCacheCaptor =
- ArgumentCaptor.forClass(WifiNetworkScoreCache.class);
- verify(mMockNetworkScoreManager).registerNetworkScoreCache(
- anyInt(),
- scoreCacheCaptor.capture(),
- Matchers.anyInt());
- scoreCacheCaptor.getValue().updateScores(Arrays.asList(score));
-
- // Test badge is set
- setWifiLevel(testLevel);
-
- ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
- Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
- anyBoolean(), iconArg.capture(), any(), anyBoolean(), anyBoolean(),
- any(), anyBoolean());
- IconState iconState = iconArg.getValue();
-
- assertEquals("Badged Wifi Resource is set",
- Utils.WIFI_PIE_FOR_BADGING[testLevel],
- iconState.icon);
- assertEquals("SD Badge is set",
- Utils.getWifiBadgeResource(NetworkBadging.BADGING_SD),
- iconState.iconOverlay);
- }
-
- private void setupNetworkScoreManager() {
- // Capture requested keys and count down latch if present
- doAnswer(
- new Answer<Boolean>() {
- @Override
- public Boolean answer(InvocationOnMock input) {
- if (mRequestScoresLatch != null) {
- mRequestScoresLatch.countDown();
- }
- NetworkKey[] keys = (NetworkKey[]) input.getArguments()[0];
- for (NetworkKey key : keys) {
- mRequestedKeys.add(key);
- }
- return true;
- }
- }).when(mMockNetworkScoreManager).requestScores(Matchers.<NetworkKey[]>any());
- }
-
- @Test
public void testQsWifiIcon() {
String testSsid = "Test SSID";
@@ -200,7 +97,7 @@
@Test
public void testRoamingIconDuringWifi() {
// Setup normal connection
- String testSsid = "\"Test SSID\"";
+ String testSsid = "Test SSID";
int testLevel = 2;
setWifiEnabled(true);
setWifiState(true, testSsid);
@@ -241,19 +138,12 @@
}
protected void setWifiState(boolean connected, String ssid) {
- setWifiState(connected, ssid, null);
- }
-
- protected void setWifiState(boolean connected, String ssid, String bssid) {
Intent i = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
NetworkInfo networkInfo = Mockito.mock(NetworkInfo.class);
Mockito.when(networkInfo.isConnected()).thenReturn(connected);
WifiInfo wifiInfo = Mockito.mock(WifiInfo.class);
Mockito.when(wifiInfo.getSSID()).thenReturn(ssid);
- if (bssid != null) {
- Mockito.when(wifiInfo.getBSSID()).thenReturn(bssid);
- }
i.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
i.putExtra(WifiManager.EXTRA_WIFI_INFO, wifiInfo);
@@ -278,7 +168,7 @@
Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
enabledArg.capture(), any(), iconArg.capture(), anyBoolean(),
- anyBoolean(), descArg.capture(), anyBoolean());
+ anyBoolean(), descArg.capture(), anyBoolean());
IconState iconState = iconArg.getValue();
assertEquals("WiFi enabled, in quick settings", enabled, (boolean) enabledArg.getValue());
assertEquals("WiFi connected, in quick settings", connected, iconState.visible);
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index f1f8757..4bfe10f 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -7562,7 +7562,9 @@
// All set; now set up the IPC and launch the agent
setUpPipes();
mAgent = bindToAgentSynchronous(mTargetApp,
- ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
+ FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)
+ ? ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL
+ : ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
mAgentPackage = pkg;
} catch (IOException e) {
// fall through to error handling
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 d5c62af..b1d6afc 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -610,7 +610,9 @@
// All set; now set up the IPC and launch the agent
setUpPipes();
mAgent = mBackupManagerService.bindToAgentSynchronous(mTargetApp,
- ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
+ FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)
+ ? ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL
+ : ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
mAgentPackage = pkg;
} catch (IOException e) {
// fall through to error handling
diff --git a/services/core/Android.mk b/services/core/Android.mk
index 4d080e9..f5f8fde 100644
--- a/services/core/Android.mk
+++ b/services/core/Android.mk
@@ -25,7 +25,7 @@
android.hidl.manager-V1.0-java
LOCAL_STATIC_JAVA_LIBRARIES := \
- tzdata_shared2 \
+ time_zone_distro \
tzdata_update2 \
android.hidl.base-V1.0-java-static \
android.hardware.weaver-V1.0-java-static \
diff --git a/services/core/java/com/android/server/MasterClearReceiver.java b/services/core/java/com/android/server/MasterClearReceiver.java
index 7080c41..516f8f6 100644
--- a/services/core/java/com/android/server/MasterClearReceiver.java
+++ b/services/core/java/com/android/server/MasterClearReceiver.java
@@ -16,6 +16,7 @@
package com.android.server;
+import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -23,6 +24,7 @@
import android.os.AsyncTask;
import android.os.RecoverySystem;
import android.os.storage.StorageManager;
+import android.provider.Settings;
import android.telephony.euicc.EuiccManager;
import android.util.Log;
import android.util.Slog;
@@ -31,14 +33,29 @@
import com.android.internal.R;
import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
public class MasterClearReceiver extends BroadcastReceiver {
private static final String TAG = "MasterClear";
+ private static final String ACTION_WIPE_EUICC_DATA =
+ "com.android.internal.action.wipe_euicc_data";
+ private static final long DEFAULT_EUICC_WIPING_TIMEOUT_MILLIS = 30000L; // 30 s
private boolean mWipeExternalStorage;
- private boolean mWipeEims;
+ private boolean mWipeEsims;
+ private static CountDownLatch mEuiccFactoryResetLatch;
@Override
public void onReceive(final Context context, final Intent intent) {
+ if (ACTION_WIPE_EUICC_DATA.equals(intent.getAction())) {
+ if (getResultCode() != EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) {
+ int detailedCode = intent.getIntExtra(
+ EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE, 0);
+ Slog.e(TAG, "Error wiping euicc data, Detailed code = " + detailedCode);
+ }
+ mEuiccFactoryResetLatch.countDown();
+ return;
+ }
if (intent.getAction().equals(Intent.ACTION_REMOTE_INTENT)) {
if (!"google.com".equals(intent.getStringExtra("from"))) {
Slog.w(TAG, "Ignoring master clear request -- not from trusted server.");
@@ -57,7 +74,7 @@
final boolean shutdown = intent.getBooleanExtra("shutdown", false);
final String reason = intent.getStringExtra(Intent.EXTRA_REASON);
mWipeExternalStorage = intent.getBooleanExtra(Intent.EXTRA_WIPE_EXTERNAL_STORAGE, false);
- mWipeEims = intent.getBooleanExtra(Intent.EXTRA_WIPE_ESIMS, false);
+ mWipeEsims = intent.getBooleanExtra(Intent.EXTRA_WIPE_ESIMS, false);
final boolean forceWipe = intent.getBooleanExtra(Intent.EXTRA_FORCE_MASTER_CLEAR, false)
|| intent.getBooleanExtra(Intent.EXTRA_FORCE_FACTORY_RESET, false);
@@ -77,7 +94,7 @@
}
};
- if (mWipeExternalStorage || mWipeEims) {
+ if (mWipeExternalStorage || mWipeEsims) {
// thr will be started at the end of this task.
new WipeDataTask(context, thr).execute();
} else {
@@ -112,10 +129,31 @@
Context.STORAGE_SERVICE);
sm.wipeAdoptableDisks();
}
- if (mWipeEims) {
+ if (mWipeEsims) {
EuiccManager euiccManager = (EuiccManager) mContext.getSystemService(
Context.EUICC_SERVICE);
- // STOPSHIP: add EuiccManager API to factory reset eUICC
+ Intent intent = new Intent(mContext, MasterClearReceiver.class);
+ intent.setAction(ACTION_WIPE_EUICC_DATA);
+ PendingIntent callbackIntent = PendingIntent.getBroadcast(
+ mContext,
+ 0 /* requestCode */,
+ intent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ mEuiccFactoryResetLatch = new CountDownLatch(1);
+ euiccManager.eraseSubscriptions(callbackIntent);
+ try {
+ long waitingTime = Settings.Global.getLong(
+ mContext.getContentResolver(),
+ Settings.Global.EUICC_WIPING_TIMEOUT_MILLIS,
+ DEFAULT_EUICC_WIPING_TIMEOUT_MILLIS);
+
+ if (!mEuiccFactoryResetLatch.await(waitingTime, TimeUnit.MILLISECONDS)) {
+ Slog.e(TAG, "Timeout wiping eUICC data.");
+ }
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ Slog.e(TAG, "Wiping eUICC data interrupted", e);
+ }
}
return null;
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
index 3aca45f..ce6b8be 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
@@ -161,6 +161,7 @@
}
}
- return mHwInterface.setUpstreamParameters(iface, v4addr, v4gateway, v6gateways);
+ return mHwInterface.setUpstreamParameters(
+ iface, v4addr, v4gateway, (v6gateways.isEmpty() ? null : v6gateways));
}
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
index 3ecf0d1..1fc1684 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
@@ -16,6 +16,8 @@
package com.android.server.connectivity.tethering;
+import static com.android.internal.util.BitUtils.uint16;
+
import android.hardware.tetheroffload.control.V1_0.IOffloadControl;
import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback;
import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate;
@@ -33,6 +35,9 @@
*/
public class OffloadHardwareInterface {
private static final String TAG = OffloadHardwareInterface.class.getSimpleName();
+ private static final String NO_INTERFACE_NAME = "";
+ private static final String NO_IPV4_ADDRESS = "";
+ private static final String NO_IPV4_GATEWAY = "";
private static native boolean configOffload();
@@ -107,6 +112,11 @@
public boolean setUpstreamParameters(
String iface, String v4addr, String v4gateway, ArrayList<String> v6gws) {
+ iface = iface != null ? iface : NO_INTERFACE_NAME;
+ v4addr = v4addr != null ? v4addr : NO_IPV4_ADDRESS;
+ v4gateway = v4gateway != null ? v4gateway : NO_IPV4_GATEWAY;
+ v6gws = v6gws != null ? v6gws : new ArrayList<>();
+
final CbResults results = new CbResults();
try {
mOffloadControl.setUpstreamParameters(
@@ -143,8 +153,8 @@
handler.post(() -> {
controlCb.onNatTimeoutUpdate(
params.proto,
- params.src.addr, params.src.port,
- params.dst.addr, params.dst.port);
+ params.src.addr, uint16(params.src.port),
+ params.dst.addr, uint16(params.dst.port));
});
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 029790b..5ee7ac4 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -307,11 +307,15 @@
// used as a mutex for access to all active notifications & listeners
final Object mNotificationLock = new Object();
+ @GuardedBy("mNotificationLock")
final ArrayList<NotificationRecord> mNotificationList =
new ArrayList<NotificationRecord>();
+ @GuardedBy("mNotificationLock")
final ArrayMap<String, NotificationRecord> mNotificationsByKey =
new ArrayMap<String, NotificationRecord>();
+ @GuardedBy("mNotificationLock")
final ArrayList<NotificationRecord> mEnqueuedNotifications = new ArrayList<>();
+ @GuardedBy("mNotificationLock")
final ArrayMap<Integer, ArrayMap<String, String>> mAutobundledSummaries = new ArrayMap<>();
final ArrayList<ToastRecord> mToastQueue = new ArrayList<ToastRecord>();
final ArrayMap<String, NotificationRecord> mSummaryByGroupKey = new ArrayMap<>();
@@ -2806,7 +2810,8 @@
// Clear summary.
final NotificationRecord removed = findNotificationByKeyLocked(summaries.remove(pkg));
if (removed != null) {
- cancelNotificationLocked(removed, false, REASON_UNAUTOBUNDLED);
+ boolean wasPosted = removeFromNotificationListsLocked(removed);
+ cancelNotificationLocked(removed, false, REASON_UNAUTOBUNDLED, wasPosted);
}
}
}
@@ -3420,7 +3425,8 @@
.setType(MetricsEvent.TYPE_CLOSE)
.addTaggedData(MetricsEvent.NOTIFICATION_SNOOZED_CRITERIA,
mSnoozeCriterionId == null ? 0 : 1));
- cancelNotificationLocked(r, false, REASON_SNOOZED);
+ boolean wasPosted = removeFromNotificationListsLocked(r);
+ cancelNotificationLocked(r, false, REASON_SNOOZED, wasPosted);
updateLightsLocked();
if (mSnoozeCriterionId != null) {
mNotificationAssistants.notifyAssistantSnoozedLocked(r.sbn, mSnoozeCriterionId);
@@ -4206,15 +4212,18 @@
manager.sendAccessibilityEvent(event);
}
+ /**
+ * Removes all NotificationsRecords with the same key as the given notification record
+ * from both lists. Do not call this method while iterating over either list.
+ */
@GuardedBy("mNotificationLock")
- private void cancelNotificationLocked(NotificationRecord r, boolean sendDelete, int reason) {
- final String canceledKey = r.getKey();
-
- // Remove from both lists, either list could have a separate Record for what is effectively
- // the same notification.
+ private boolean removeFromNotificationListsLocked(NotificationRecord r) {
+ // Remove from both lists, either list could have a separate Record for what is
+ // effectively the same notification.
boolean wasPosted = false;
NotificationRecord recordInList = null;
- if ((recordInList = findNotificationByListLocked(mNotificationList, r.getKey())) != null) {
+ if ((recordInList = findNotificationByListLocked(mNotificationList, r.getKey()))
+ != null) {
mNotificationList.remove(recordInList);
mNotificationsByKey.remove(recordInList.sbn.getKey());
wasPosted = true;
@@ -4223,6 +4232,13 @@
!= null) {
mEnqueuedNotifications.remove(recordInList);
}
+ return wasPosted;
+ }
+
+ @GuardedBy("mNotificationLock")
+ private void cancelNotificationLocked(NotificationRecord r, boolean sendDelete, int reason,
+ boolean wasPosted) {
+ final String canceledKey = r.getKey();
// Record caller.
recordCallerLocked(r);
@@ -4363,7 +4379,8 @@
}
// Cancel the notification.
- cancelNotificationLocked(r, sendDelete, reason);
+ boolean wasPosted = removeFromNotificationListsLocked(r);
+ cancelNotificationLocked(r, sendDelete, reason, wasPosted);
cancelGroupChildrenLocked(r, callingUid, callingPid, listenerName,
sendDelete);
updateLightsLocked();
@@ -4440,11 +4457,11 @@
cancelAllNotificationsByListLocked(mNotificationList, callingUid, callingPid,
pkg, true /*nullPkgIndicatesUserSwitch*/, channelId, flagChecker,
false /*includeCurrentProfiles*/, userId, false /*sendDelete*/, reason,
- listenerName);
+ listenerName, true /* wasPosted */);
cancelAllNotificationsByListLocked(mEnqueuedNotifications, callingUid,
callingPid, pkg, true /*nullPkgIndicatesUserSwitch*/, channelId,
flagChecker, false /*includeCurrentProfiles*/, userId,
- false /*sendDelete*/, reason, listenerName);
+ false /*sendDelete*/, reason, listenerName, false /* wasPosted */);
mSnoozeHelper.cancel(userId, pkg);
}
}
@@ -4460,7 +4477,7 @@
private void cancelAllNotificationsByListLocked(ArrayList<NotificationRecord> notificationList,
int callingUid, int callingPid, String pkg, boolean nullPkgIndicatesUserSwitch,
String channelId, FlagChecker flagChecker, boolean includeCurrentProfiles, int userId,
- boolean sendDelete, int reason, String listenerName) {
+ boolean sendDelete, int reason, String listenerName, boolean wasPosted) {
ArrayList<NotificationRecord> canceledNotifications = null;
for (int i = notificationList.size() - 1; i >= 0; --i) {
NotificationRecord r = notificationList.get(i);
@@ -4488,8 +4505,9 @@
if (canceledNotifications == null) {
canceledNotifications = new ArrayList<>();
}
+ notificationList.remove(i);
canceledNotifications.add(r);
- cancelNotificationLocked(r, sendDelete, reason);
+ cancelNotificationLocked(r, sendDelete, reason, wasPosted);
}
if (canceledNotifications != null) {
final int M = canceledNotifications.size();
@@ -4548,11 +4566,11 @@
cancelAllNotificationsByListLocked(mNotificationList, callingUid, callingPid,
null, false /*nullPkgIndicatesUserSwitch*/, null, flagChecker,
includeCurrentProfiles, userId, true /*sendDelete*/, reason,
- listenerName);
+ listenerName, true);
cancelAllNotificationsByListLocked(mEnqueuedNotifications, callingUid,
callingPid, null, false /*nullPkgIndicatesUserSwitch*/, null,
flagChecker, includeCurrentProfiles, userId, true /*sendDelete*/,
- reason, listenerName);
+ reason, listenerName, false);
mSnoozeHelper.cancel(userId, includeCurrentProfiles);
}
}
@@ -4569,7 +4587,6 @@
}
String pkg = r.sbn.getPackageName();
- int userId = r.getUserId();
if (pkg == null) {
if (DBG) Log.e(TAG, "No package for group summary: " + r.getKey());
@@ -4577,15 +4594,15 @@
}
cancelGroupChildrenByListLocked(mNotificationList, r, callingUid, callingPid, listenerName,
- sendDelete);
+ sendDelete, true);
cancelGroupChildrenByListLocked(mEnqueuedNotifications, r, callingUid, callingPid,
- listenerName, sendDelete);
+ listenerName, sendDelete, false);
}
@GuardedBy("mNotificationLock")
private void cancelGroupChildrenByListLocked(ArrayList<NotificationRecord> notificationList,
NotificationRecord parentNotification, int callingUid, int callingPid,
- String listenerName, boolean sendDelete) {
+ String listenerName, boolean sendDelete, boolean wasPosted) {
final String pkg = parentNotification.sbn.getPackageName();
final int userId = parentNotification.getUserId();
final int reason = REASON_GROUP_SUMMARY_CANCELED;
@@ -4597,7 +4614,8 @@
&& (childR.getFlags() & Notification.FLAG_FOREGROUND_SERVICE) == 0) {
EventLogTags.writeNotificationCancel(callingUid, callingPid, pkg, childSbn.getId(),
childSbn.getTag(), userId, 0, 0, reason, listenerName);
- cancelNotificationLocked(childR, sendDelete, reason);
+ notificationList.remove(i);
+ cancelNotificationLocked(childR, sendDelete, reason, wasPosted);
}
}
}
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 2c0cc95..b3c6ff6 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -53,6 +53,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -1186,6 +1187,6 @@
boolean showBadge = DEFAULT_SHOW_BADGE;
ArrayMap<String, NotificationChannel> channels = new ArrayMap<>();
- ArrayMap<String, NotificationChannelGroup> groups = new ArrayMap<>();
+ Map<String, NotificationChannelGroup> groups = new ConcurrentHashMap<>();
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f1e782a..262cee7 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -18164,8 +18164,10 @@
// step during installation. Instead, we'll take extra time the first time the
// instant app starts. It's preferred to do it this way to provide continuous
// progress to the user instead of mysteriously blocking somewhere in the
- // middle of running an instant app.
- if (!instantApp) {
+ // middle of running an instant app. The default behaviour can be overridden
+ // via gservices.
+ if (!instantApp || Global.getInt(
+ mContext.getContentResolver(), Global.INSTANT_APP_DEXOPT_ENABLED, 0) != 0) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
// Do not run PackageDexOptimizer through the local performDexOpt
// method because `pkg` may not be in `mPackages` yet.
diff --git a/services/core/java/com/android/server/radio/RadioService.java b/services/core/java/com/android/server/radio/RadioService.java
index 34bbffd..227ea6b 100644
--- a/services/core/java/com/android/server/radio/RadioService.java
+++ b/services/core/java/com/android/server/radio/RadioService.java
@@ -16,15 +16,20 @@
package com.android.server.radio;
+import android.Manifest;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.hardware.radio.IRadioService;
import android.hardware.radio.ITuner;
import android.hardware.radio.ITunerCallback;
import android.hardware.radio.RadioManager;
+import android.os.ParcelableException;
import android.util.Slog;
import com.android.server.SystemService;
+import java.util.List;
+
public class RadioService extends SystemService {
// TODO(b/36863239): rename to RadioService when native service goes away
private static final String TAG = "RadioServiceJava";
@@ -37,6 +42,7 @@
private final long mNativeContext = nativeInit();
private final Object mLock = new Object();
+ private List<RadioManager.ModuleProperties> mModules = null;
public RadioService(Context context) {
super(context);
@@ -50,6 +56,7 @@
private native long nativeInit();
private native void nativeFinalize(long nativeContext);
+ private native List<RadioManager.ModuleProperties> nativeLoadModules(long nativeContext);
private native Tuner nativeOpenTuner(long nativeContext, int moduleId,
RadioManager.BandConfig config, boolean withAudio, ITunerCallback callback);
@@ -60,9 +67,33 @@
}
private class RadioServiceImpl extends IRadioService.Stub {
+ private void enforcePolicyAccess() {
+ if (PackageManager.PERMISSION_GRANTED != getContext().checkCallingPermission(
+ Manifest.permission.ACCESS_FM_RADIO)) {
+ throw new SecurityException("ACCESS_FM_RADIO permission not granted");
+ }
+ }
+
+ @Override
+ public List<RadioManager.ModuleProperties> listModules() {
+ enforcePolicyAccess();
+ synchronized (mLock) {
+ if (mModules != null) return mModules;
+
+ mModules = nativeLoadModules(mNativeContext);
+ if (mModules == null) {
+ throw new ParcelableException(new NullPointerException(
+ "couldn't load radio modules"));
+ }
+
+ return mModules;
+ }
+ }
+
@Override
public ITuner openTuner(int moduleId, RadioManager.BandConfig bandConfig,
boolean withAudio, ITunerCallback callback) {
+ enforcePolicyAccess();
if (callback == null) {
throw new IllegalArgumentException("Callback must not be empty");
}
diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java
index 82bd356..bbb7782 100644
--- a/services/core/java/com/android/server/timezone/RulesManagerService.java
+++ b/services/core/java/com/android/server/timezone/RulesManagerService.java
@@ -18,6 +18,9 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.SystemService;
+import com.android.timezone.distro.DistroException;
+import com.android.timezone.distro.DistroVersion;
+import com.android.timezone.distro.StagedDistroOperation;
import android.app.timezone.Callback;
import android.app.timezone.DistroFormatVersion;
@@ -36,9 +39,6 @@
import java.util.Arrays;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
-import libcore.tzdata.shared2.DistroException;
-import libcore.tzdata.shared2.DistroVersion;
-import libcore.tzdata.shared2.StagedDistroOperation;
import libcore.tzdata.update2.TimeZoneDistroInstaller;
// TODO(nfuller) Add EventLog calls where useful in the system server.
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index f138add..78f2195 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -16,6 +16,9 @@
package com.android.server.wm;
+import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MAGNIFICATION_REGION_EFFECT;
+
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -418,13 +421,7 @@
public MagnificationSpec getMagnificationSpecForWindowLocked(WindowState windowState) {
MagnificationSpec spec = mMagnifedViewport.getMagnificationSpecLocked();
if (spec != null && !spec.isNop()) {
- WindowManagerPolicy policy = mWindowManagerService.mPolicy;
- final int windowType = windowState.mAttrs.type;
- if (!policy.isTopLevelWindow(windowType) && windowState.isChildWindow()
- && !policy.canMagnifyWindow(windowType)) {
- return null;
- }
- if (!policy.canMagnifyWindow(windowState.mAttrs.type)) {
+ if (!mWindowManagerService.mPolicy.canMagnifyWindow(windowState.mAttrs.type)) {
return null;
}
}
@@ -540,8 +537,9 @@
final int visibleWindowCount = visibleWindows.size();
for (int i = visibleWindowCount - 1; i >= 0; i--) {
WindowState windowState = visibleWindows.valueAt(i);
- if (windowState.mAttrs.type == WindowManager
- .LayoutParams.TYPE_MAGNIFICATION_OVERLAY) {
+ if ((windowState.mAttrs.type == TYPE_MAGNIFICATION_OVERLAY)
+ || ((windowState.mAttrs.privateFlags
+ & PRIVATE_FLAG_NO_MAGNIFICATION_REGION_EFFECT) != 0)) {
continue;
}
@@ -715,7 +713,7 @@
mSurfaceControl.setLayerStack(mWindowManager.getDefaultDisplay()
.getLayerStack());
mSurfaceControl.setLayer(mWindowManagerService.mPolicy.getWindowLayerFromTypeLw(
- WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY)
+ TYPE_MAGNIFICATION_OVERLAY)
* WindowManagerService.TYPE_LAYER_MULTIPLIER);
mSurfaceControl.setPosition(0, 0);
mSurface.copyFrom(mSurfaceControl);
@@ -1313,7 +1311,7 @@
&& windowType != WindowManager.LayoutParams.TYPE_DRAG
&& windowType != WindowManager.LayoutParams.TYPE_INPUT_CONSUMER
&& windowType != WindowManager.LayoutParams.TYPE_POINTER
- && windowType != WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY
+ && windowType != TYPE_MAGNIFICATION_OVERLAY
&& windowType != WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY
&& windowType != WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY
&& windowType != WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION);
diff --git a/services/core/jni/JavaRef.cpp b/services/core/jni/JavaRef.cpp
index ad07afa..6872e41 100644
--- a/services/core/jni/JavaRef.cpp
+++ b/services/core/jni/JavaRef.cpp
@@ -19,10 +19,15 @@
#include "JavaRef.h"
+#include <string>
#include <utils/Log.h>
namespace android {
+JavaRef<jstring> make_javastr(JNIEnv *env, const std::string &str) {
+ return make_javaref(env, env->NewStringUTF(str.c_str()));
+}
+
EnvWrapper::EnvWrapper(JNIEnv *env) : mEnv(env) {
ALOGE_IF(env == nullptr, "Environment is a nullptr");
}
diff --git a/services/core/jni/JavaRef.h b/services/core/jni/JavaRef.h
index 8a572e2..0f08b34 100644
--- a/services/core/jni/JavaRef.h
+++ b/services/core/jni/JavaRef.h
@@ -37,6 +37,8 @@
});
}
+JavaRef<jstring> make_javastr(JNIEnv *env, const std::string &str);
+
class EnvWrapper {
public:
EnvWrapper(JNIEnv *env);
diff --git a/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp b/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
index 241ccf6..4e5c27f 100644
--- a/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
+++ b/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
@@ -71,7 +71,7 @@
// auto-close it (otherwise there would be double-close problems).
//
// Rely upon the compiler to eliminate the constexprs used for clarity.
-hidl_handle&& handleFromFileDescriptor(base::unique_fd fd) {
+hidl_handle handleFromFileDescriptor(base::unique_fd fd) {
hidl_handle h;
NATIVE_HANDLE_DECLARE_STORAGE(storage, 0, 0);
@@ -83,7 +83,7 @@
static constexpr bool kTakeOwnership = true;
h.setTo(nh, kTakeOwnership);
- return std::move(h);
+ return h;
}
} // namespace
@@ -116,13 +116,14 @@
bool rval;
hidl_string msg;
- configInterface->setHandles(h1, h2,
+ const auto status = configInterface->setHandles(h1, h2,
[&rval, &msg](bool success, const hidl_string& errMsg) {
rval = success;
msg = errMsg;
});
- if (!rval) {
- ALOGE("IOffloadConfig::setHandles() error: %s", msg.c_str());
+ if (!status.isOk() || !rval) {
+ ALOGE("IOffloadConfig::setHandles() error: '%s' / '%s'",
+ status.description().c_str(), msg.c_str());
}
return rval;
diff --git a/services/core/jni/com_android_server_radio_RadioService.cpp b/services/core/jni/com_android_server_radio_RadioService.cpp
index 73887bb..bdf8180 100644
--- a/services/core/jni/com_android_server_radio_RadioService.cpp
+++ b/services/core/jni/com_android_server_radio_RadioService.cpp
@@ -24,7 +24,9 @@
#include <android/hardware/broadcastradio/1.1/IBroadcastRadio.h>
#include <android/hardware/broadcastradio/1.1/IBroadcastRadioFactory.h>
+#include <android/hidl/manager/1.0/IServiceManager.h>
#include <core_jni_helpers.h>
+#include <hidl/ServiceManagement.h>
#include <utils/Log.h>
#include <JNIHelp.h>
@@ -34,6 +36,7 @@
namespace RadioService {
using hardware::Return;
+using hardware::hidl_string;
using hardware::hidl_vec;
namespace V1_0 = hardware::broadcastradio::V1_0;
@@ -53,18 +56,29 @@
struct {
jclass clazz;
jmethodID cstor;
+ jmethodID add;
+ } ArrayList;
+ struct {
+ jclass clazz;
+ jmethodID cstor;
} Tuner;
} gjni;
struct ServiceContext {
ServiceContext() {}
- sp<V1_0::IBroadcastRadio> mModule;
+ std::vector<sp<V1_0::IBroadcastRadio>> mModules;
private:
DISALLOW_COPY_AND_ASSIGN(ServiceContext);
};
+const std::vector<Class> gAllClasses = {
+ Class::AM_FM,
+ Class::SAT,
+ Class::DT,
+};
+
/**
* Always lock gContextMutex when using native context.
@@ -92,39 +106,85 @@
delete ctx;
}
-static sp<V1_0::IBroadcastRadio> getModule(jlong nativeContext) {
- ALOGV("getModule()");
+static jobject nativeLoadModules(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("nativeLoadModules()");
AutoMutex _l(gContextMutex);
auto& ctx = getNativeContext(nativeContext);
- if (ctx.mModule != nullptr) {
- return ctx.mModule;
+ // Get list of registered HIDL HAL implementations.
+ auto manager = hardware::defaultServiceManager();
+ hidl_vec<hidl_string> services;
+ if (manager == nullptr) {
+ ALOGE("Can't reach service manager, using default service implementation only");
+ services = std::vector<hidl_string>({ "default" });
+ } else {
+ manager->listByInterface(V1_0::IBroadcastRadioFactory::descriptor,
+ [&services](const hidl_vec<hidl_string> ®istered) {
+ services = registered;
+ });
}
- // TODO(b/36863239): what about other HAL implementations?
- auto factory = V1_0::IBroadcastRadioFactory::getService();
- if (factory == nullptr) {
- ALOGE("Can't retrieve radio HAL implementation");
- return nullptr;
- }
+ // Scan provided list for actually implemented modules.
+ ctx.mModules.clear();
+ auto jModules = make_javaref(env, env->NewObject(gjni.ArrayList.clazz, gjni.ArrayList.cstor));
+ for (auto&& serviceName : services) {
+ ALOGV("checking service: %s", serviceName.c_str());
- sp<V1_0::IBroadcastRadio> module = nullptr;
- // TODO(b/36863239): not only AM/FM
- factory->connectModule(Class::AM_FM, [&](Result retval,
- const sp<V1_0::IBroadcastRadio>& result) {
- if (retval == Result::OK) {
- module = result;
+ auto factory = V1_0::IBroadcastRadioFactory::getService(serviceName);
+ if (factory == nullptr) {
+ ALOGE("can't load service %s", serviceName.c_str());
+ continue;
}
- });
- ALOGE_IF(module == nullptr, "Couldn't connect module");
- ctx.mModule = module;
- return module;
+ // Second level of scanning - that's unfortunate.
+ for (auto&& clazz : gAllClasses) {
+ sp<V1_0::IBroadcastRadio> module10 = nullptr;
+ sp<V1_1::IBroadcastRadio> module11 = nullptr;
+ factory->connectModule(clazz, [&](Result res, const sp<V1_0::IBroadcastRadio>& module) {
+ if (res == Result::OK) {
+ module10 = module;
+ module11 = V1_1::IBroadcastRadio::castFrom(module).withDefault(nullptr);
+ } else if (res != Result::INVALID_ARGUMENTS) {
+ ALOGE("couldn't load %s:%s module",
+ serviceName.c_str(), V1_0::toString(clazz).c_str());
+ }
+ });
+ if (module10 == nullptr) continue;
+
+ auto idx = ctx.mModules.size();
+ ctx.mModules.push_back(module10);
+ ALOGI("loaded broadcast radio module %zu: %s:%s",
+ idx, serviceName.c_str(), V1_0::toString(clazz).c_str());
+
+ JavaRef<jobject> jModule = nullptr;
+ Result halResult = Result::OK;
+ Return<void> hidlResult;
+ if (module11 != nullptr) {
+ hidlResult = module11->getProperties_1_1([&](const V1_1::Properties& properties) {
+ jModule = convert::ModulePropertiesFromHal(env, properties, idx, serviceName);
+ });
+ } else {
+ hidlResult = module10->getProperties([&](Result result,
+ const V1_0::Properties& properties) {
+ halResult = result;
+ if (result != Result::OK) return;
+ jModule = convert::ModulePropertiesFromHal(env, properties, idx, serviceName);
+ });
+ }
+ if (convert::ThrowIfFailed(env, hidlResult, halResult)) return nullptr;
+
+ env->CallBooleanMethod(jModules.get(), gjni.ArrayList.add, jModule.get());
+ }
+ }
+
+ return jModules.release();
}
static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jint moduleId,
jobject bandConfig, bool withAudio, jobject callback) {
ALOGV("nativeOpenTuner()");
+ AutoMutex _l(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
EnvWrapper wrap(env);
if (callback == nullptr) {
@@ -132,11 +192,11 @@
return nullptr;
}
- // TODO(b/36863239): use moduleId
- auto module = getModule(nativeContext);
- if (module == nullptr) {
+ if (moduleId < 0 || static_cast<size_t>(moduleId) >= ctx.mModules.size()) {
+ ALOGE("Invalid module ID: %d", moduleId);
return nullptr;
}
+ auto module = ctx.mModules[moduleId];
HalRevision halRev;
if (V1_1::IBroadcastRadio::castFrom(module).withDefault(nullptr) != nullptr) {
@@ -181,6 +241,7 @@
static const JNINativeMethod gRadioServiceMethods[] = {
{ "nativeInit", "()J", (void*)nativeInit },
{ "nativeFinalize", "(J)V", (void*)nativeFinalize },
+ { "nativeLoadModules", "(J)Ljava/util/List;", (void*)nativeLoadModules },
{ "nativeOpenTuner", "(JILandroid/hardware/radio/RadioManager$BandConfig;Z"
"Landroid/hardware/radio/ITunerCallback;)Lcom/android/server/radio/Tuner;",
(void*)nativeOpenTuner },
@@ -200,6 +261,11 @@
gjni.Tuner.cstor = GetMethodIDOrDie(env, tunerClass, "<init>",
"(Landroid/hardware/radio/ITunerCallback;IIZ)V");
+ auto arrayListClass = FindClassOrDie(env, "java/util/ArrayList");
+ gjni.ArrayList.clazz = MakeGlobalRefOrDie(env, arrayListClass);
+ gjni.ArrayList.cstor = GetMethodIDOrDie(env, arrayListClass, "<init>", "()V");
+ gjni.ArrayList.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z");
+
auto res = jniRegisterNativeMethods(env, "com/android/server/radio/RadioService",
gRadioServiceMethods, NELEM(gRadioServiceMethods));
LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
diff --git a/services/core/jni/com_android_server_radio_convert.cpp b/services/core/jni/com_android_server_radio_convert.cpp
index 3f24a36..472efec 100644
--- a/services/core/jni/com_android_server_radio_convert.cpp
+++ b/services/core/jni/com_android_server_radio_convert.cpp
@@ -39,6 +39,8 @@
using V1_0::Rds;
using V1_1::ProgramListResult;
+static JavaRef<jobject> BandDescriptorFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region);
+
static struct {
struct {
jfieldID descriptor;
@@ -59,12 +61,26 @@
} AmBandConfig;
struct {
+ jclass clazz;
jfieldID region;
jfieldID type;
jfieldID lowerLimit;
jfieldID upperLimit;
jfieldID spacing;
} BandDescriptor;
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } FmBandDescriptor;
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } AmBandDescriptor;
+
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } ModuleProperties;
struct {
jclass clazz;
@@ -184,9 +200,46 @@
}
}
-JavaRef<jobject> BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region) {
- ALOGV("BandConfigFromHal()");
- EnvWrapper wrap(env);
+static JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Properties &prop10,
+ const V1_1::Properties *prop11, jint moduleId, const std::string& serviceName) {
+ ALOGV("ModulePropertiesFromHal()");
+
+ auto jServiceName = make_javastr(env, serviceName);
+ auto jImplementor = make_javastr(env, prop10.implementor);
+ auto jProduct = make_javastr(env, prop10.product);
+ auto jVersion = make_javastr(env, prop10.version);
+ auto jSerial = make_javastr(env, prop10.serial);
+ bool isBgScanSupported = prop11 ? prop11->supportsBackgroundScanning : false;
+ auto jVendorExtension = prop11 ? make_javastr(env, prop11->vendorExension) : nullptr;
+
+ auto jBands = make_javaref(env, env->NewObjectArray(prop10.bands.size(),
+ gjni.BandDescriptor.clazz, nullptr));
+ int i = 0;
+ for (auto &&band : prop10.bands) {
+ // ITU_1 is the default region just because its index is 0.
+ auto jBand = BandDescriptorFromHal(env, band, Region::ITU_1);
+ env->SetObjectArrayElement(jBands.get(), i++, jBand.get());
+ }
+
+ return make_javaref(env, env->NewObject(gjni.ModuleProperties.clazz,
+ gjni.ModuleProperties.cstor, moduleId, jServiceName.get(), prop10.classId,
+ jImplementor.get(), jProduct.get(), jVersion.get(), jSerial.get(), prop10.numTuners,
+ prop10.numAudioSources, prop10.supportsCapture, jBands.get(), isBgScanSupported,
+ jVendorExtension.get()));
+}
+
+JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Properties &properties,
+ jint moduleId, const std::string& serviceName) {
+ return ModulePropertiesFromHal(env, properties, nullptr, moduleId, serviceName);
+}
+
+JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_1::Properties &properties,
+ jint moduleId, const std::string& serviceName) {
+ return ModulePropertiesFromHal(env, properties.base, &properties, moduleId, serviceName);
+}
+
+static JavaRef<jobject> BandDescriptorFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region) {
+ ALOGV("BandDescriptorFromHal()");
jint spacing = config.spacings.size() > 0 ? config.spacings[0] : 0;
ALOGW_IF(config.spacings.size() == 0, "No channel spacing specified");
@@ -195,14 +248,16 @@
case Band::FM:
case Band::FM_HD: {
auto& fm = config.ext.fm;
- return wrap(env->NewObject(gjni.FmBandConfig.clazz, gjni.FmBandConfig.cstor,
+ return make_javaref(env, env->NewObject(
+ gjni.FmBandDescriptor.clazz, gjni.FmBandDescriptor.cstor,
region, config.type, config.lowerLimit, config.upperLimit, spacing,
fm.stereo, fm.rds != Rds::NONE, fm.ta, fm.af, fm.ea));
}
case Band::AM:
case Band::AM_HD: {
auto& am = config.ext.am;
- return wrap(env->NewObject(gjni.AmBandConfig.clazz, gjni.AmBandConfig.cstor,
+ return make_javaref(env, env->NewObject(
+ gjni.AmBandDescriptor.clazz, gjni.AmBandDescriptor.cstor,
region, config.type, config.lowerLimit, config.upperLimit, spacing,
am.stereo));
}
@@ -212,6 +267,29 @@
}
}
+JavaRef<jobject> BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region) {
+ ALOGV("BandConfigFromHal()");
+
+ auto descriptor = BandDescriptorFromHal(env, config, region);
+ if (descriptor == nullptr) return nullptr;
+
+ switch (config.type) {
+ case Band::FM:
+ case Band::FM_HD: {
+ return make_javaref(env, env->NewObject(
+ gjni.FmBandConfig.clazz, gjni.FmBandConfig.cstor, descriptor.get()));
+ }
+ case Band::AM:
+ case Band::AM_HD: {
+ return make_javaref(env, env->NewObject(
+ gjni.AmBandConfig.clazz, gjni.AmBandConfig.cstor, descriptor.get()));
+ }
+ default:
+ ALOGE("Unsupported band type: %d", config.type);
+ return nullptr;
+ }
+}
+
V1_0::BandConfig BandConfigToHal(JNIEnv *env, jobject jConfig, Region ®ion) {
ALOGV("BandConfigToHal()");
auto jDescriptor = env->GetObjectField(jConfig, gjni.BandConfig.descriptor);
@@ -345,7 +423,7 @@
"android/hardware/radio/RadioManager$FmBandConfig");
gjni.FmBandConfig.clazz = MakeGlobalRefOrDie(env, fmBandConfigClass);
gjni.FmBandConfig.cstor = GetMethodIDOrDie(env, fmBandConfigClass,
- "<init>", "(IIIIIZZZZZ)V");
+ "<init>", "(Landroid/hardware/radio/RadioManager$FmBandDescriptor;)V");
gjni.FmBandConfig.stereo = GetFieldIDOrDie(env, fmBandConfigClass, "mStereo", "Z");
gjni.FmBandConfig.rds = GetFieldIDOrDie(env, fmBandConfigClass, "mRds", "Z");
gjni.FmBandConfig.ta = GetFieldIDOrDie(env, fmBandConfigClass, "mTa", "Z");
@@ -355,17 +433,39 @@
auto amBandConfigClass = FindClassOrDie(env,
"android/hardware/radio/RadioManager$AmBandConfig");
gjni.AmBandConfig.clazz = MakeGlobalRefOrDie(env, amBandConfigClass);
- gjni.AmBandConfig.cstor = GetMethodIDOrDie(env, amBandConfigClass, "<init>", "(IIIIIZ)V");
+ gjni.AmBandConfig.cstor = GetMethodIDOrDie(env, amBandConfigClass,
+ "<init>", "(Landroid/hardware/radio/RadioManager$AmBandDescriptor;)V");
gjni.AmBandConfig.stereo = GetFieldIDOrDie(env, amBandConfigClass, "mStereo", "Z");
auto bandDescriptorClass = FindClassOrDie(env,
"android/hardware/radio/RadioManager$BandDescriptor");
+ gjni.BandDescriptor.clazz = MakeGlobalRefOrDie(env, bandDescriptorClass);
gjni.BandDescriptor.region = GetFieldIDOrDie(env, bandDescriptorClass, "mRegion", "I");
gjni.BandDescriptor.type = GetFieldIDOrDie(env, bandDescriptorClass, "mType", "I");
gjni.BandDescriptor.lowerLimit = GetFieldIDOrDie(env, bandDescriptorClass, "mLowerLimit", "I");
gjni.BandDescriptor.upperLimit = GetFieldIDOrDie(env, bandDescriptorClass, "mUpperLimit", "I");
gjni.BandDescriptor.spacing = GetFieldIDOrDie(env, bandDescriptorClass, "mSpacing", "I");
+ auto fmBandDescriptorClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$FmBandDescriptor");
+ gjni.FmBandDescriptor.clazz = MakeGlobalRefOrDie(env, fmBandDescriptorClass);
+ gjni.FmBandDescriptor.cstor = GetMethodIDOrDie(env, fmBandDescriptorClass,
+ "<init>", "(IIIIIZZZZZ)V");
+
+ auto amBandDescriptorClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$AmBandDescriptor");
+ gjni.AmBandDescriptor.clazz = MakeGlobalRefOrDie(env, amBandDescriptorClass);
+ gjni.AmBandDescriptor.cstor = GetMethodIDOrDie(env, amBandDescriptorClass,
+ "<init>", "(IIIIIZ)V");
+
+ auto modulePropertiesClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$ModuleProperties");
+ gjni.ModuleProperties.clazz = MakeGlobalRefOrDie(env, modulePropertiesClass);
+ gjni.ModuleProperties.cstor = GetMethodIDOrDie(env, modulePropertiesClass, "<init>",
+ "(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;"
+ "Ljava/lang/String;IIZ[Landroid/hardware/radio/RadioManager$BandDescriptor;Z"
+ "Ljava/lang/String;)V");
+
auto programInfoClass = FindClassOrDie(env, "android/hardware/radio/RadioManager$ProgramInfo");
gjni.ProgramInfo.clazz = MakeGlobalRefOrDie(env, programInfoClass);
gjni.ProgramInfo.cstor = GetMethodIDOrDie(env, programInfoClass, "<init>",
diff --git a/services/core/jni/com_android_server_radio_convert.h b/services/core/jni/com_android_server_radio_convert.h
index f2e7f92..3ba6fed 100644
--- a/services/core/jni/com_android_server_radio_convert.h
+++ b/services/core/jni/com_android_server_radio_convert.h
@@ -34,6 +34,11 @@
namespace V1_0 = hardware::broadcastradio::V1_0;
namespace V1_1 = hardware::broadcastradio::V1_1;
+JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Properties &properties,
+ jint moduleId, const std::string& serviceName);
+JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_1::Properties &properties,
+ jint moduleId, const std::string& serviceName);
+
JavaRef<jobject> BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region);
V1_0::BandConfig BandConfigToHal(JNIEnv *env, jobject jConfig, Region ®ion);
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
index 0a4cb10..6090e35 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -359,6 +359,43 @@
}
@Test
+ public void testCancelAllNotificationsMultipleEnqueuedDoesNotCrash() throws Exception {
+ final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
+ for (int i = 0; i < 10; i++) {
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
+ sbn.getId(), sbn.getNotification(), sbn.getUserId());
+ }
+ mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ waitForIdle();
+ }
+
+ @Test
+ public void testCancelGroupSummaryMultipleEnqueuedChildrenDoesNotCrash() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group1", true);
+ final NotificationRecord parentAsChild = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group1", false);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group1", false);
+
+ // fully post parent notification
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
+ parent.sbn.getId(), parent.sbn.getNotification(), parent.sbn.getUserId());
+ waitForIdle();
+
+ // enqueue the child several times
+ for (int i = 0; i < 10; i++) {
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
+ child.sbn.getId(), child.sbn.getNotification(), child.sbn.getUserId());
+ }
+ // make the parent a child, which will cancel the child notification
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
+ parentAsChild.sbn.getId(), parentAsChild.sbn.getNotification(),
+ parentAsChild.sbn.getUserId());
+ waitForIdle();
+ }
+
+ @Test
public void testCancelAllNotifications_IgnoreForegroundService() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
sbn.getNotification().flags |= Notification.FLAG_FOREGROUND_SERVICE;
diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
index a7f4c99..b6983fa 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
@@ -16,6 +16,9 @@
package com.android.server.timezone;
+import com.android.timezone.distro.DistroVersion;
+import com.android.timezone.distro.StagedDistroOperation;
+
import org.junit.Before;
import org.junit.Test;
@@ -29,8 +32,6 @@
import java.io.IOException;
import java.util.concurrent.Executor;
import javax.annotation.Nullable;
-import libcore.tzdata.shared2.DistroVersion;
-import libcore.tzdata.shared2.StagedDistroOperation;
import libcore.tzdata.update2.TimeZoneDistroInstaller;
import static com.android.server.timezone.RulesManagerService.REQUIRED_UPDATER_PERMISSION;
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index 4390fae..31bb064 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -76,6 +76,13 @@
public static final String EXTRA_CALL_SUBJECT_CHARACTER_ENCODING =
"android.telecom.extra.CALL_SUBJECT_CHARACTER_ENCODING";
+ /**
+ * Indicating flag for phone account whether to use voip audio mode for voip calls
+ * @hide
+ */
+ public static final String EXTRA_ALWAYS_USE_VOIP_AUDIO_MODE =
+ "android.telecom.extra.ALWAYS_USE_VOIP_AUDIO_MODE";
+
/**
* Boolean {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which
* indicates whether this {@link PhoneAccount} is capable of supporting a request to handover a
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 74327ce..4f78087 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -869,6 +869,20 @@
public static final String EVENT_NOTIFY_INTERNATIONAL_CALL_ON_WFC =
"android.telephony.event.EVENT_NOTIFY_INTERNATIONAL_CALL_ON_WFC";
+ /**
+ * {@link android.telecom.Connection} event used to indicate that an outgoing call has been
+ * forwarded to another number.
+ * <p>
+ * Sent in response to an IMS supplementary service notification indicating the call has been
+ * forwarded.
+ * <p>
+ * Sent via {@link android.telecom.Connection#sendConnectionEvent(String, Bundle)}.
+ * The {@link Bundle} parameter is expected to be null when this connection event is used.
+ * @hide
+ */
+ public static final String EVENT_CALL_FORWARDED =
+ "android.telephony.event.EVENT_CALL_FORWARDED";
+
/* Visual voicemail protocols */
/**
diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java
index 6367772..11770fb 100644
--- a/telephony/java/android/telephony/euicc/EuiccManager.java
+++ b/telephony/java/android/telephony/euicc/EuiccManager.java
@@ -153,6 +153,12 @@
public static final String EXTRA_EMBEDDED_SUBSCRIPTION_RESOLUTION_CALLBACK_INTENT =
"android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_RESOLUTION_CALLBACK_INTENT";
+ /**
+ * Optional meta-data attribute for a carrier app providing an icon to use to represent the
+ * carrier. If not provided, the app's launcher icon will be used as a fallback.
+ */
+ public static final String META_DATA_CARRIER_ICON = "android.telephony.euicc.carriericon";
+
private final Context mContext;
private final IEuiccController mController;
diff --git a/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java b/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java
index 4d340d1..14284d6 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java
@@ -155,8 +155,7 @@
lp.setInterfaceName(testIfName);
offload.setUpstreamLinkProperties(lp);
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
- eq(testIfName), eq(null), eq(null), mStringArrayCaptor.capture());
- assertTrue(mStringArrayCaptor.getValue().isEmpty());
+ eq(testIfName), eq(null), eq(null), eq(null));
inOrder.verifyNoMoreInteractions();
final String ipv4Addr = "192.0.2.5";
@@ -164,16 +163,14 @@
lp.addLinkAddress(new LinkAddress(linkAddr));
offload.setUpstreamLinkProperties(lp);
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
- eq(testIfName), eq(ipv4Addr), eq(null), mStringArrayCaptor.capture());
- assertTrue(mStringArrayCaptor.getValue().isEmpty());
+ eq(testIfName), eq(ipv4Addr), eq(null), eq(null));
inOrder.verifyNoMoreInteractions();
final String ipv4Gateway = "192.0.2.1";
lp.addRoute(new RouteInfo(InetAddress.getByName(ipv4Gateway)));
offload.setUpstreamLinkProperties(lp);
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
- eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
- assertTrue(mStringArrayCaptor.getValue().isEmpty());
+ eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null));
inOrder.verifyNoMoreInteractions();
final String ipv6Gw1 = "fe80::cafe";